13  ggplotを関数に埋め込む

13.1 複数のグラフを自動作成

複数の変数に基づいて同じグラフを作成したい、ということがあります。 例えば、財務分析なので、横軸を年度、縦軸を各種財務比率、とした折れ線グラフを作成する、というような場合です。

このとき、複数の変数を入れ替えながら、同じグラフを作成するために、何度も同じようなコードを繰り返し書くことは面倒ですし、グラフの設定を少し変えた場合に、すべてのコードを修正しなければならないので、メンテナンス性も悪いです。

そこで、関数を使って、同じグラフを作成するコードを簡潔に書く方法を紹介します。 必要なパッケージを読み込んでから、作図用のデータを作成しておきます。

# パッケージを読み込む
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

 次のパッケージを付け加えます: 'rlang' 

 以下のオブジェクトは 'package:purrr' からマスクされています:

    %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
    flatten_raw, invoke, splice
knitr::opts_chunk$set(dev = "ragg_png")
# データ作成
df <- data.frame(
  year = rep(2011:2020),
  current_ratio = seq(1,1.1,0.1) + rnorm(10, 0, .1),
  debt_ratio = seq(0.5,0.6,0.1) + rnorm(10, 0, .1),
  turn_over = rnorm(10, 1, .5)
)

13.2 関数を作る。

前に説明したように、自作の関数を作るには、function()を使います。ggplot()関数を使って、グラフを作成する関数を作るので、自作関数の引数は、

  • df : データフレーム
  • x : x軸の変数
  • y : y軸の変数

とします。 読み込むデータフレームはデフォルトでdfとしておきます。 では自作関数mygraph()を作成します。

mygraph <- function(
  # 引数
  df, 
  x, 
  y, 
  xname, 
  yname # y軸の名前
  ) { # 関数
  ggplot(df) + aes(x = factor({{x}}), y = {{y}}, group = 1) +
    geom_line() +
    geom_point() +
    xlab(xname) +
    ylab(yname) +
    theme_economist_white()
}

完成しました。 この関数の意味は、

  1. 関数名と引数を指定
  2. x軸とy軸を指定
  3. 折れ線グラフ
  4. 散布図
  5. テーマをtheme_economist()に設定

ということです。 ここで、変数xy{{}}で囲んでいますが、これは、ggplot2パッケージの新しい機能で、{{}}で囲むことで、変数名を文字列として扱うことができます。 こうしないと、自作関数の引数をggplot()関数のaes()の中に入れることができません。

では使ってみましょう。 データフレーム名はdfとデフォルトで指定しているので、xyのみを指定します。 x軸は年度なのでyeary軸は流動比率current_ratioを指定してみます。

g1 <- mygraph(df = df, x = year, 
y = current_ratio,xname = "年度", yname = "流動比率")
print(g1)

負債比率だと、

g2 <- mygraph(df = df, x = year, y = debt_ratio,
  xname = "年度", yname = "負債比率")
print(g2)

売上高回転率だと、

g3 <- mygraph(df = df, x = year, y = turn_over,
  xname = "年度", yname = "総資産回転率")
print(g3)

図を並べて表示するときは、patchworkパッケージを使います。

patchworkを使うと、ggplot2で作成したグラフを格納したオブジェクトを使って、簡単にグラフを縦や横に並べることができる。

横に並べるときは、

g1 + g2 + g3

+でつなげ、縦に並べるときは、

g1 / g2 / g3

/でつなげます。

組み合わせることも可能です。

g1 / (g2 + g3) # g1が上で、g2とg3が横

関数を使うと、同じようなグラフを簡単に作成することができ、patchworkパッケージを使うと、複数のグラフを並べて表示することができます。 同じようなグラフを作成するときは、関数を使ってみてください。