ライブラリの読み出し
::p_load(tidyverse) pacman
現在のRでは、デフォルトのグラフ作成関数はデータの確認に用いられていることが多く、プレゼンテーションや論文など、人に見せるためのきれいなグラフを作成する場合には、ほとんどの場合ggplot2
が用いられています。ggplot2
を用いると、美しいグラフを統一感のある記法で簡単に描画することができます。
ggplot2
には、その使い方についてのみ書かれた教科書が多数出ているぐらいに沢山の関数・引数が設定されています。この章での解説はggplot2
の紹介に留めますが、興味のある方はリファレンスやチートシート、教科書(ggplot2: Elegant Graphics for Data Analysis、ggplot2: Elegant Graphics for Data Analysis 日本語版、R graphic cookbook、R graphic cookbook 日本語版など)を読むことをお勧めします。
ggplot2
はtidyverse
に含まれるライブラリの一つですので、tidyverse
を呼び出すことで使用することができます。他のtidyverese
の機能である、dplyr
やtidyr
、パイプ演算子などとも相性が良く、これらをggplot2
と同時に用いるのが一般的です。
ライブラリの読み出し
::p_load(tidyverse) pacman
ggplot2
では、まずggplot
関数にデータフレームを引数として与えます。ggplot2
では、データはほぼ常にデータフレームで与える必要があります。ggplot
関数はデータの設定のための関数で、データフレームを引数にしてggplot
関数だけを実行しても、空白が表示されるだけです。ggplot
関数は第一引数にデータフレームを取るため、パイプ演算子を用いてデータフレームをggplot
関数につなぐのが一般的です。
ggplot
関数は、引数にaes
関数を取ります。このaes
はaesthetic(エステティック)mappingの略です。この「エステティック」というのは、美容のエステと同じ言葉で、「美的な」という意味を持ちます。ggplot2
では、aes
関数内でグラフのx軸、y軸の値などの要素、色や点のサイズ等を指定します。この指定には、ggplot
関数の引数であるデータフレームの列名を文字列ではなく、そのまま使用することができます。
下の例では、データフレームであるiris
の列から、Sepal.Length
をx
に、Sepal.Width
をy
に設定したものです。aes
関数を引数にしてggplot
関数を実行すると、点や線などのグラフの要素は表示されませんが、縦と横の軸だけは表示されます。
ggplot2
でグラフを表示するためには、グラフの種類を指定する関数である、geom
関数を用いる必要があります。例えば、散布図を描画するためのgeom
関数は、geom_point
関数です。このgeom
関数の中でも、データフレームやaes
を設定することができます。ただし、このgeom
関数だけでは、グラフを表示することはできません。先程説明した、ggplot
関数と組み合わせる必要があります。
geom関数
# geom関数だけではグラフを記述できない
geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
mapping: x = ~Sepal.Length, y = ~Sepal.Width
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity
geom
関数は、ggplot
関数に+
でつなぐ必要があります。まず、データフレームを引数にしたggplot
関数を準備し、その関数に足し算でgeom_point
関数をつなぎ、ggplot
関数内もしくはgeom_point
関数内でaes
を設定すると、グラフが表示されます。
ggplot関数とgeom関数を+でつなぐ
# geom関数内でaesを設定する
|>
iris ggplot() +
geom_point(aes(x = Sepal.Length, y = Sepal.Width))
ggplot関数内でaesを指定する
# ggplot関数内でaesを設定する(上と同じ)
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point()
ggplot2
では、ggplot
関数とgeom
関数をつなぐために、+
の記号を用います。この+
はジェネリック関数として設定されており、ggplot2
内では足し算とは異なる機能を持ちます。詳しくはggplot2のリファレンスをご一読ください。
以下の表1に、代表的なgeom
関数の一覧を示します。
geom関数 | グラフの種類 | aesで必須となる引数 |
---|---|---|
geom_point | 散布図 | x, y |
geom_text | 文字の散布図 | x, y, label |
geom_line | 線グラフ(x軸の小さいものからつなぐ) | x, y |
geom_ribbon | リボン | xmax, xmin, ymax, ymin(xかyのどちらか) |
geom_path | 線グラフ(データフレームの行順につなぐ) | x, y |
geom_step | ステップ関数 | x, y |
geom_abline | 直線(傾きと切片で指定) | intercept, slope |
geom_hline | 水平線(横線) | yintercept |
geom_vline | 垂直の線(縦線) | xintercept |
geom_bar | 棒グラフ | x, y |
geom_dotplot | ドットプロット | x, y(片方のみ) |
geom_function | 関数を線形で表記 | fun |
geom_boxplot | 箱ひげ図 | x, y(片方でも可) |
geom_histogram | ヒストグラム | x, y(片方のみ) |
geom_density | 確率密度 | x, y(片方のみ) |
geom_jitter | ジッタープロット | x, y(片方でも可) |
geom_violin | バイオリンプロット | x, y(片方でも可) |
geom_errorbar | エラーバー | xmax, xmin, ymax, ymin |
geom_linerange | エラーバー(横棒無し) | xmax, xmin, ymax, ymin |
geom_pointrange | フォレストプロット(点と線) | x, y, xmax, xmin, ymax, ymin |
geom_bin_2d | ヒートマップ | x. y |
geom_contour | 等高線 | x, y |
geom_map | 地図表記 | map_id |
geom_polygon | 多角形 | x, y |
ggplot2
には、qplot
という関数も準備されています。qplot
関数は「Quick plot」の略で、plot
関数のように1つの関数だけでグラフの作成が完了します。ただし、このqplot
関数で凝ったグラフを作成することは難しいため、現在ではその使用は非推奨とされています。
表1に示した通り、geom
関数にはgeom_point
以外にもたくさんの関数が設定されています。以下に各geom
関数を用いて作成できるグラフを紹介します。
geom_text
は、テキストをグラフ上に表示するための関数です。geom_text
はaes
にx
、y
、label
の3つの引数を設定し、そのx
、y
の位置にlabel
で指定した文字列を表示します。
geom_line
はaes
のx
、y
に設定した点を結ぶ線、つまり線グラフを描画するための関数です。geom_line
では、線は必ずxの小さい値から大きい値へと点を繋いでいく形で線が描画されます。
geom_ribbon
は、幅のあるグラフ(リボン)を描画するための関数です。geom_ribbon
はx
、ymin
、ymax
の3つの引数を取り、x
で指定した位置にymin
-ymax
の間を幅とするリボンを描画します。引数として、y
、xmin
、xmax
の3つを取ることもできます。ymin
、ymax
を指定した場合にはリボンは横向き、xmin
、xmax
を指定した場合にはリボンは縦向きになります。
geom_smooth
はgeom_point
等で表示した点に対して、回帰の式をあてはめ、そのグラフを表示するための関数です。特に引数を指定していない場合、26章で説明するloess回帰をあてはめ、回帰を行った線を表示します。また、95%信頼区間をgeom_ribbon
と同様の表記で示します。
geom_smooth関数
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(size = 2) +
geom_smooth()
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
直線での回帰を行う場合には、引数にmethod="lm"
を指定します。また、se
引数をFALSE
に指定すると、信頼区間の表示を消すことができます。
geom_smoothで直線回帰
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point(size = 2) +
geom_smooth(method = "lm", se = FALSE)
`geom_smooth()` using formula = 'y ~ x'
データフレームの因子の列に従ってグラフを分けて回帰したい場合には、aes
関数内でgroup
引数にその因子を設定します。以下の例ではiris
のSpecies
をgroup
引数に設定し、アヤメの種ごとに回帰を行っています。
group引数を設定する
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width, group = Species)) +
geom_point(size = 2) +
geom_smooth(method = "lm")
`geom_smooth()` using formula = 'y ~ x'
aes
にcolor
やfill
を設定することでも因子ごとに回帰を行うことができます。
geom_path
は、xの大きさに関わらず、データフレームの上の行から線をつなぐ関数です。データフレームを時系列に並べておき、2変数の時間変化を追うような場合に利用します。
geom_path
を用いる場合には、一色の線では線のどちらの端が上の行で、どちらが下の行かわからないため、通常は行の順番にそって線の色を変えることになります。色を指定したい場合には、aes
の引数にcolor
を設定します。color
には、データフレームの列のうち、日時などを設定します。このように設定することで、日時と共に線の色が変わるようなグラフを作成することができます。
Rのstep
関数を用いた場合と同様のグラフを記述する場合には、geom_step
関数を用います。
グラフ上に直線を描く場合には、geom_abline
、geom_vline
、geom_hline
を用います。geom_abline
は切片(intercept
)と傾き(slope
)を指定し、その切片・傾きを持つ直線を引くものです。geom_vline
は垂直な線(vertical line)、geom_hline
は水平な線(horizontal line)を描画します。geom_vline
はx軸と交わるため、x軸の切片(xintercept
)の設定が必要です。同様にgeom_hline
はy軸と交わるため、y軸の切片(yintercept
)を設定します。
geom_bar
は、棒グラフを作成するための関数です。geom_bar
を引数なしで実行すると、ヒストグラムが描画されます。これは、geom_bar
の引数のうち、stat
引数が"count"
に設定されているためです。このstat
引数は、グラフを記述する際に実施する統計的な処理を指定するための引数です。
ggplot2
には、ヒストグラムを描画するための専用の関数である、geom_histogram
もあります。ヒストグラムを描くのが目的であれば、こちらのgeom_histogram
の方が名前と目的が一致しており、使いやすいかと思います。
geom_bar
関数で1つの値に対して1つの棒グラフを描画する、要は通常の棒グラフを描画する場合には、stat="identity"
を指定します。棒グラフを描画するときには、まずx軸とy軸の数値・ラベルを含むデータフレームを作成します。
tidyrd、dplyrでデータフレームの前準備
<- iris |>
d group_by(Species) |>
summarise(
mSepal.Length = mean(Sepal.Length),
sSepal.Length = sd(Sepal.Length))
d
# A tibble: 3 × 3
Species mSepal.Length sSepal.Length
<fct> <dbl> <dbl>
1 setosa 5.01 0.352
2 versicolor 5.94 0.516
3 virginica 6.59 0.636
後は、aes
でx軸に配置する値、y軸に配置する値を指定し、geom_bar
関数内でstat="identity”
を指定します。
ggplot2
には、直接棒グラフ(column plot)を描画するための専用の関数である、geom_col
もあります。名前から直感的に理解できるなら、こちらを用いてもよいでしょう。
geom_bar
関数は積み上げ式棒グラフを作成する際にも用いることができます。積み上げ式棒グラフを描画するときには、特に引数を指定する必要はありませんが、色分けをしないと積み上げたグラフを見分けることができません。積み上げ式グラフを記述するときには、color
とともに、棒の中身の色を設定するfill
という引数で、色を指定するのが良いでしょう。
geom_bar
で積み上げ式グラフが記述されるのは、geom_bar
のposition
引数のデフォルトがposition="stack"
だからです。position="dodge"
を指定すると、横並びにしたグラフが表示されます。
geom_bar関数で積み上げ式棒グラフ
|>
d ggplot(aes(x = "1", y = mSepal.Length, color = Species, fill = Species)) +
geom_bar(stat = "identity")
geom_dotplot
はドットプロットという、ヒストグラムを点で描いたようなグラフを作成するときに用いる関数です。ドットの数がその値の範囲に存在する値の個数を示します。縦軸の単位がよくわからないものになりますので、通常はヒストグラムの方が使い勝手が良いでしょう。
geom_density
はヒストグラムと類似していますが、単に度数を返すのではなく、カーネル密度関数に変換した上で度数分布を示してくれる関数です。geom_density
では、縦軸の値は確率密度となり、実際のデータが少ない部分にも実際の頻度より高めの確率密度が与えられるため、かなりデータが多い場合以外は正確性に欠くことになります。データが少ない場合にはヒストグラムの方が使い勝手が良いでしょう。
ヒストグラムを棒グラフではなく、線で表記するのがgeom_freqpoly
です。こちらもヒストグラムほど使い勝手は良くないように思います。
データの分布は単に散布図でも表示できます。ただし、geom_point
で単に表記すると、点が重なってしまって正しいデータ分布を示すことはできません。
geom_point関数で点が重なる場合
# geom_pointでは点が重なる
|>
iris ggplot(aes(x = Species, y = Sepal.Length, color = Species)) +
geom_point()
このような場合に、点の重なりを抑えるため、データの表示にランダムな幅を持たせるのがgeom_jitter
です。x
かy
のどちらかのみが数値の場合には、数値以外の値には幅を持たせず、両方が数値の場合にはx軸・y軸方向に幅を持たせることになります。ですので、x
、y
の両方が数値の場合には、点は正確な位置には配置されません。
データが十分に多い場合には、箱ひげ図を用いてデータの分布を表示することもできます。ggplot2
では、geom_boxplot
を用いて箱ひげ図を描画することができます。geom_boxplot
に数値ベクターを与えれば、自動的に箱ひげ図を描画してくれます。また、lower
、upper
、middle
、 min
、max
という引数を与えると、その引数に設定した数値に従い箱ひげ図を描画することもできます。
確率密度を90度回転させ、左右対称に配置した形のグラフのことを、バイオリンプロットと呼びます。ggplot2
では、このバイオリンプロットをgeom_violin
で描画することができます。描画の仕組みはgeom_density
によく似ています。
ggplot2
で結果にエラーバーを付ける時には、geom_errorbar
を用います。geom_errorbar
では、aes
の引数として、ymin
とymax
、もしくはxmin
とxmax
を設定します。ymin
とymax
はy軸方向の、xmin
とxmax
はx軸方向のエラーバーを設定する際に用います。また、geom_errorbar
にはwidth
という引数もあり、エラーバーの横棒のサイズを設定することができます。
geom_errorbar
は通常、geom_point
で描画した点グラフや、geom_bar
で描画した棒グラフに重ねて表示することで用います。重ね書きする際には、ggplot
に+
でgeom_point
をつないだ後に、さらに+
でgeom_errorbar
をつなぐことになります。このように+
でつなぐと、ggplot2
ではgeom_point
の点グラフの上に、geom_errorbar
が重ね描きされます。
エラーバーを表示する
<- d |>
p ggplot(
aes(
x = Species,
y = mSepal.Length,
ymax = mSepal.Length + sSepal.Length,
ymin = mSepal.Length - sSepal.Length))
+ geom_point() + geom_errorbar() p
geom_errorbar
ではエラーバーに横線が付き、よく見るエラーバーの形となります。ただし、この横線は必ずしも必要なものではありません。横線のないエラーバーを付けたいときには、geom_linerange
を用います。
geom_errorbar
やgeom_linerange
は点が備わっておらず、別途geom_point
で点を書く必要があります。この点と線を同時に描画するのが、geom_pointrange
です。geom_pointrange
を用いると、geom_point
を別途描画しなくても、点とエラーバーが付いたグラフを作成することができます。このような、点と線のみで記述するグラフのことをフォレストプロットと呼び、メタ解析などでよく用いられています。
棒グラフにもエラーバーを付けることはできます。棒グラフにエラーバーを付ける時には、stat="identity"
で指定したgeom_bar
に、+
でgeom_errorbar
やgeom_linerange
をつなげます。
複数のタイプのデータに対して棒グラフを横に並べて描画し、その棒グラフにエラーバーを付けたい、という場合もあります。geom_bar
のデフォルトはposition="stack"
ですので、複数のタイプのデータを表示するときには積み上げ式の棒グラフが描画されます。横に棒グラフを並べる場合には、position="dodge"
を指定する必要があります。
では、具体的にposition="dodge"
の棒グラフにエラーバーを付与する手順を見ていきましょう。まずは、データフレームでデータを準備する必要があります。dplyr
やtidyr
を用いることで、データの準備を比較的簡単に行うことができます。
下の例では、iris
のSpecies
以外のデータ(Sepal.Length
、Sepal.Width
、Petal.Length
、Petal.Width
)をpivot_longer
を用いて縦持ちに変換し、データ名とSpecies
でグループ化した後、それぞれの平均値と標準偏差を求めています。棒グラフやフォレストプロットの描画の準備では、pivot_longer
、group_by
、summarise
を用いることが多く、データの要約を求める際にも便利な組み合わせです。
具体的にどのように変換しているのか分かりにくければ、pivot_longer
までと、それ以降を切り離して実行してみると良いでしょう。
要約したデータの準備
<-
d1 |>
iris pivot_longer(1:4) |>
group_by(name, Species) |>
summarise(mvalue = mean(value), svalue = sd(value))
d1
# A tibble: 12 × 4
# Groups: name [4]
name Species mvalue svalue
<chr> <fct> <dbl> <dbl>
1 Petal.Length setosa 1.46 0.174
2 Petal.Length versicolor 4.26 0.470
3 Petal.Length virginica 5.55 0.552
4 Petal.Width setosa 0.246 0.105
5 Petal.Width versicolor 1.33 0.198
6 Petal.Width virginica 2.03 0.275
7 Sepal.Length setosa 5.01 0.352
8 Sepal.Length versicolor 5.94 0.516
9 Sepal.Length virginica 6.59 0.636
10 Sepal.Width setosa 3.43 0.379
11 Sepal.Width versicolor 2.77 0.314
12 Sepal.Width virginica 2.97 0.322
上で作成したデータフレームを用いて、ggplot2
でグラフを描画します。まずはggplot
関数でaes
を設定していきます。x
軸にSpecies
、y
軸に平均値とエラーバーの要素に平均値±標準偏差(ymin
、ymax
)、棒の枠の色(color
)と棒の中身の色(fill
)にデータ名を設定しておきます。
ggplot関数の準備
<- d1 |>
p1 ggplot(
aes(
x = Species,
y =mvalue,
ymax = mvalue + svalue,
ymin = mvalue - svalue,
color = name,
fill = name
) )
このggplot
関数に、geom_bar
とgeom_linerange
を+
でつなげると、下の図のように、積み上げ式棒グラフの下の方にエラーバーが重なって表示される、変なグラフが作成されます。これは、geom_bar
の引数の設定がposition="stack"
であるため積み上げ式棒グラフとなる一方で、geom_linerange
などのエラーバーを指定するgeom
関数には積み上げ式の設定がないためです。
position
に"dodge"
を指定すると、棒グラフは積み上げ式ではなく、横に並べる形となります。このとき、エラーバーは棒グラフの真ん中に配置されてしまい、どの棒グラフのエラーバーなのかわからなくなります。これは、geom_linerange
のposition
の設定が正しく行われていないためです。
geom_linerange
を含む、エラーバーを描画するためのgeom
関数のposition
の指定には、position_dodge
関数を用います。position=position_dodge(width=0.9)
という形でgeom_linerange
のposition
を指定すると、エラーバーが正しい位置(棒グラフの真ん中)に配置されます。やや複雑ですし、width=0.9
の意味はよくわからないのですが、この方法はggplot2
のReferenceにも記載されています。
position_dodge(width=0.9)を指定
+
p1 geom_bar(stat = "identity", position = "dodge") +
geom_linerange(position = position_dodge(width = 0.9))
上記のように、棒グラフとエラーバーの色を同じにすると、エラーバーの下側が見えなくなります。このようなグラフ(ダイナマイトっぽい形をしているので、ダイナマイトプロットと呼ばれます)では、エラーバーで示したい範囲が不明瞭となるため、データ表示の方法としては良くないとされています。点と線で表すフォレストプロット(geom_pointrange
)を用いたほうが、棒グラフとエラーバーを用いるより、データの表示方法としては優れています。
geom_bin2d
はx
軸、y
軸に値を設定し、x
・y
それぞれの値のデータを度数分布に変換した上で、度数を2次元グラフ上に色で示すものです。2次元で表示するヒストグラムにあたります。ただし、下の図のようにデータが多く、分布が薄く広がっている場合には度数の差が分かりにくくなってしまいます。
このようなデータで度数を調べる場合には、geom_point
と透明化を指定する引数であるalpha
を用いるのが良いでしょう。alpha
を小さい値に指定すると、度数の多いところは濃い色で、度数が小さいところは薄い色で表示されます。下のグラフは上のgeom_bin2d
と同じものを表現していますが、こちらの方がデータの分布としては理解しやすいことがわかるかと思います。
棒グラフと同様に、geom_bin2d
もstat="identity"
と指定することで、数値をそのまま色とするグラフを作成することができます。下の例では、volcano
データセット(マウンガファウの南北・東西の位置と標高のデータ)を変形し、geom_bin2d
で描画したものです。このようにstat="identity"
を用いれば、geom_bin2d
を用いてヒートマップを作成することもできます。
geom_bin2dでヒートマップを描画
|>
volcano as.data.frame() |>
cbind(y = 1:nrow(volcano)) |>
pivot_longer(1:ncol(volcano), values_to = "altitude", names_to = "x") |>
mutate(x = as.numeric(str_remove_all(x, "V"))) |>
ggplot(aes(x = as.numeric(x), y = y, color = altitude, fill = altitude)) +
geom_bin2d(stat = "identity")
geom_contour
はRのcontour
関数と同じく、標高線で示された図を表記するのに用いる関数です。geom_bin2d
とは異なり、aes
には3つの値(x
、y
、z
)を指定する必要があります。
geom_contourで等高線グラフを作成
|>
volcano as.data.frame() |>
cbind(y = 1:nrow(volcano)) |>
pivot_longer(1:ncol(volcano), values_to = "altitude", names_to = "x") |>
mutate(x = as.numeric(str_remove_all(x, "V"))) |>
ggplot(aes(x = as.numeric(x), y = y, z = altitude)) +
geom_contour()
Rデフォルトのfilled.contour
関数と同様に、等高線に色を合わせて表示するようなグラフを作成する場合には、geom_contour_filled
を用います。geom_contour_filled
を用いることで、z
の値に従い色分けされたグラフを描画することができます。
geom_map
は地図を表示するための関数です。地図を表記するためには、地図データ、つまり緯度、経度とその場所のIDを記録したもの、を準備する必要があります。
Rで地図データを用いる場合には、maps
パッケージ(Richard A. Becker, Ray Brownrigg. Enhancements by Thomas P Minka, and CRAN team. 2023)を利用するのが比較的簡単です。maps
パッケージには世界地図、アメリカの州の地図、フランスやイタリア、ニュージーランドなどの地図が登録されています。maps
パッケージの地図をggplot2
で用いる場合には、ggplot2
で使用できるデータフレームに変換してくれるmaps
パッケージの関数である、map_data
を用います。
mapパッケージで地図データの読み込み
::p_load(maps)
pacman<- map_data("state") # アメリカの州データをggplot用に変換
state head(state) # 緯度(lat)、経度(long)などを含むデータフレーム
long lat group order region subregion
1 -87.46201 30.38968 1 1 alabama <NA>
2 -87.48493 30.37249 1 2 alabama <NA>
3 -87.52503 30.37249 1 3 alabama <NA>
4 -87.53076 30.33239 1 4 alabama <NA>
5 -87.57087 30.32665 1 5 alabama <NA>
6 -87.58806 30.32665 1 6 alabama <NA>
ggplot2
では、map_data
で変換したデータフレームをggplot
関数の引数にするのではなく、map_data
でregion
に指定されているラベル(地域)を含むデータフレームを用います。
USArrests
はアメリカの州別の10万人あたりの犯罪件数を記録したデータフレームです。このデータフレームの行名が州名になっているので、これをデータフレームの列に追加し、state
と表記を合わせるために小文字に変換します。
aes
では、map_id=state
とし、地図IDを指定します。さらに、fill
にはUSArrests
の列名であるMurder
(殺人の件数)を指定します。この形で指定することで、Murder
の値が色で示されることになります。
geom_map
では、さらにmap
という引数に、map_data
の返り値(state
)を指定する必要があります。こうすることで、geom_map
はstate
を基準に地図を描画し、地図の色にfill
で指定したMurder
の値を適用します。
上記のようにすれば、地図を表記することはできますが、やや煩雑です。近年のRでは、地図データを扱う際には、地図データ取り扱いの専用クラスであるsf
(simple features)を用いるのが一般的になっています。このsf
を用いれば、グラフをより簡単に作成することができます。
sf
クラスは、sf
パッケージ(Pebesma and Bivand 2023; Pebesma 2018)で定義されているクラスです。sf
を使用する際には、まずsf
パッケージを読み込みます。
sf
パッケージをインストールすると、sf
パッケージ内にある地図データにアクセスできます。下の例では、sf
パッケージのフォルダ内にある地図データ(North Carolinaのsfデータ)を読み込んでいます。
sfパッケージのデータを読み込み
# system.fileはパッケージからフルパスを読み込む関数
<- system.file("shape/nc.shp", package="sf")
fname <- st_read(fname) # North Carolinaのsfデータ nc
Reading layer `nc' from data source
`C:\Program Files\R\R-4.4.0\library\sf\shape\nc.shp' using driver `ESRI Shapefile'
Simple feature collection with 100 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS: NAD27
sf
は基本的にデータフレームで、geometry
という列を持っています。この列は、sfc
クラスのデータです。sfc
クラスはその行に対応する緯度・経度のセットを専用の表記法で示したものとなります。sf
を用いる場合には、このgeometry
が地図データを表現する列になります。
sfのデータ
class(nc) # sfはデータフレームの一種
[1] "sf" "data.frame"
# geometryという列に地図データが格納されている nc
Simple feature collection with 100 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS: NAD27
First 10 features:
AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74
1 0.114 1.442 1825 1825 Ashe 37009 37009 5 1091 1
2 0.061 1.231 1827 1827 Alleghany 37005 37005 3 487 0
3 0.143 1.630 1828 1828 Surry 37171 37171 86 3188 5
4 0.070 2.968 1831 1831 Currituck 37053 37053 27 508 1
5 0.153 2.206 1832 1832 Northampton 37131 37131 66 1421 9
6 0.097 1.670 1833 1833 Hertford 37091 37091 46 1452 7
7 0.062 1.547 1834 1834 Camden 37029 37029 15 286 0
8 0.091 1.284 1835 1835 Gates 37073 37073 37 420 0
9 0.118 1.421 1836 1836 Warren 37185 37185 93 968 4
10 0.124 1.428 1837 1837 Stokes 37169 37169 85 1612 1
NWBIR74 BIR79 SID79 NWBIR79 geometry
1 10 1364 0 19 MULTIPOLYGON (((-81.47276 3...
2 10 542 3 12 MULTIPOLYGON (((-81.23989 3...
3 208 3616 6 260 MULTIPOLYGON (((-80.45634 3...
4 123 830 2 145 MULTIPOLYGON (((-76.00897 3...
5 1066 1606 3 1197 MULTIPOLYGON (((-77.21767 3...
6 954 1838 5 1237 MULTIPOLYGON (((-76.74506 3...
7 115 350 2 139 MULTIPOLYGON (((-76.00897 3...
8 254 594 2 371 MULTIPOLYGON (((-76.56251 3...
9 748 1190 2 844 MULTIPOLYGON (((-78.30876 3...
10 160 2038 5 176 MULTIPOLYGON (((-80.02567 3...
ggplot2
でsf
を用いてグラフを描画する場合には、geom_sf
関数を用います。geom_sf
関数を用いてグラフを作成する場合には、ggplot
関数の引数となるデータフレームにsf
、aes
にsf
に含まれる列を指定します。sf
を用いれば、このようなシンプルな表記法でgeom_map
よりも簡単に地図を表記することができます。
sf
は2018年に発表された、比較的新しいパッケージです。sf
が出てくるまでは、Rで地図データを取り扱う方法は様々で、統一されているという感はありませんでしたが、今後はsf
がデフォルトの地図データ取り扱い方法になっていくのではないかと思います。地図データの取扱いに関してはオンラインの英語の教科書(Geocomputation with R)があり、日本語訳(Geocomputation with R (日本語版))も公開されています。
地図表示のためのライブラリにはggplot2
だけでなく、Leaflet for RというJavascriptの地図ライブラリをRで利用できるようにしたものや、ggplot2
風の記法で色々なデザインのグラフを描画できるtmapなどもあります。sf
、leaflet
、tmap
については32章で説明します。
geom_polygon
は多角形を描画するための関数です。データフレームには、多角形の各頂点に当たるxとyの座標を指定します。
geom_polygon関数
# 頂点のx、y座標を指定する
<- data.frame(x = c(1, 1.25, 1.75, 2), y = c(1, 2, 2, 1))
d2 d2
x y
1 1.00 1
2 1.25 2
3 1.75 2
4 2.00 1
aes
で頂点のx
、y
座標を指定すると、多角形を描画することができます。低レベルグラフィック関数であるpolygon
関数と類似した描画の方法になっています。
上で説明したように、ggplot2
で色を指定するときには、aes
中でcolor
、fill
の引数を指定します。color
、fill
は数値または因子を指定することができ、点や面を数値・因子に対応した色で表示することができます。
geom_point
などの点を描画する場合では、color
のみを指定します。
color
引数に数値を指定すると、数値に従い色の濃度が変わります。
colorに数値を指定
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length)) +
geom_point()
geom_bar
では、color
だけを指定すると、棒グラフの枠だけに色がつきます。
geom_barでcolorだけを指定した場合
|>
d1 ggplot(aes(x = Species, y = mvalue, color = name)) +
geom_bar(stat = "identity", position = "dodge")
geom_bar
で、棒グラフの中身の色を変えたい時には、fill
引数を指定する必要があります。
geom_barでfillを指定した場合
|>
d1 ggplot(aes(x = Species, y = mvalue, color = name, fill = name)) +
geom_bar(stat = "identity", position = "dodge")
ggplot2
では、color
やfill
に引数を指定すれば、特に色の指定をしなくても、いい感じの色でグラフを作成してくれます。ただし、デフォルトの色では見にくい時や、デザイン的に別の色を用いたい場合もあります。色を別途指定したい場合には、ColorBrewerを用いた色の設定を行います。
ggplot2
でColorBrewerに従った色を用いる場合には、scale_color_brewer
を用います。通常のgeom
関数と同様に、scale_color_brewer
も+
で繋いで用います。同様に、fill
に指定した色の配色を変えたい場合には、scale_fill_brewer
を用います。
色の指定にはpalette
引数を用います。palette
引数には、カラーパレットを指定する文字列を指定します。カラーパレットの種類はヘルプ(?scale_color_brewer
)から確認できます。
scale_color_brewerで色を変更
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point() +
scale_color_brewer(palette = "Set1")
color
に数値を指定した場合には、scale_color_distiller
で色を指定します。fill
に数値を指定する場合には、scale_fill_distiller
を用います。
geom_point
などで点のサイズを変更する場合には、size
引数を指定します。
sizeで点のサイズを指定
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point(size = 10)
size
引数はaes
内で、数値の列名を取る形でも宣言できます。aes
内で数値で指定した場合には、その数値に応じた点のサイズで表示されます。このように点のサイズを列名で指定することで、3つの要素(x
、y
、size
)を3次元グラフを用いることなく表現することができます。このようなグラフのことをバブルチャートと呼びます。
点が大きくなると、重なった点は見えなくなります。重なった点を表示する方法には、ジッタープロット(geom_jitter
)などがありますが、x軸もy軸も数値の場合には、位置がランダムに変化することで正確な値を示さなくなります。
重なった点を適切に表示する場合、透明化が有効となる場合があります。上で説明した通り、透明化を指定する引数はalpha
です。alpha
には0~1までの値を指定することができ、0では完全に透明、1では完全に不透明の点を表示することになります。
geom_line
等の線グラフで線の太さを指定する場合にはlinewidth
引数を、線のタイプを指定する場合には、linetype
引数を用います。linewidth
引数には太さを数値で指定します。linetype
には、"solid"
、"dashed"
、"dotted"
、"dotdash"
、"longdash"
、"twodash"
の各タイプがあり、それぞれ文字列で指定します。線タイプの詳細については、vignette("ggplot2-specs")
を実行することで確認できます。
グラフの重ね書きを行う場合には、複数のgeom
関数を+
で繋ぎます。後に指定したgeom
関数が重ね書きの上層(上のレイヤー)に表示されることになります。重ね書きしたグラフの色が下層のグラフの色と同一だと見えなくなってしまうため、通常は色を変えて表示します。
重ね書きするグラフの間でデータが異なる場合には、ggplot
関数でデータフレーム・aes
を設定せず、geom
関数内でそれぞれdata
・aes
を指定します。data
にはデータフレームを指定します。geom
関数内で別のdata
を指定することで、それぞれのgeom
関数のグラフに別のデータフレームからのデータを用いることもできます。
データフレームに異なる要素(因子)のデータが保存されており、要素ごとに別々にグラフにしたい場合には、facetting(facet:宝石のカットの面のこと)を用います。facettingには、facet_wrap
とfacet_grid
の2つの関数ががあります。facet_wrap
はデータフレームの要素で分けたグラフを単に並べたもの、facet_grid
はx、y方向に要素がそろったグラフ群を作成する関数です。
以下はfacet_wrap
の例です。グラフを分ける要素は、facet_wrap
内でチルダ(~
)を用いて指定します。チルダの左側、右側のどちらに要素をおいても問題ありませんが、右側の要素を入力しない場合には、ピリオド(.
)を入力しておきます。グラフはよい感じに縦・横に並べられ、表示されます。並べる順番は要素の因子(factor)のレベル順となります。
facet_wrap関数
|>
d1 ggplot(aes(x = Species, y = mvalue)) +
geom_bar(stat = "identity") +
facet_wrap(~ name)
facet_wrap
を用いたときに、表示するグラフごとに縦軸のスケールを調整する場合には、scales
引数を指定します。scales
引数はfacet_wrap
関数内で指定し、scales="free_y"
ならy方向のスケールが、scales="free_x"
ならx方向のスケールが、scales="free"
ならx、y両方のスケールが自動的に調整されます。
facet_grid
では、チルダの左と右の要素でそれぞれy軸方向、x軸方向を指定することになります。縦-横方向の軸の値もそろえられます。
軸のラベルやタイトル等を設定する場合には、labs
関数を用います。labs
関数も+
で繋いで用います。x
、y
、title
、subtitle
、caption
引数を指定することでそれぞれx軸ラベル、y軸ラベル、メインタイトル、サブタイトル、キャプション(注釈)をグラフに追加することができます。
x軸、y軸の数値を対数変換する場合には、scale_x_log10
、scale_y_log10
を用います。他のggplot2
の関数と同様に、scale_x_log10
、scale_y_log10
も+
で繋ぐことで、x軸、y軸が対数変換されます。
同様の軸の変換の関数には、scale_x_reverse
、scale_x_sqrt
などがあります。それぞれ軸を正負反転、平方根に変換するのに用います。
x軸に因子を指定した場合の棒グラフなどの並び順は、その因子のレベルの順番で決まります。ですので、forcat
パッケージのfct_reorder
を用いて並べ替えることができます。
fct_reorderで順番を変更する
|>
d ggplot(aes(x = forcats::fct_reorder(Species, c("virginica", "setosa", "versicolor")), y = mSepal.Length)) +
geom_bar(stat = "identity")
fct_reorder
関数は他の数値を参照して、その数値の順番で並べ替えることもできます。
fct_reorderで数値に従い並べ替え
|>
d ggplot(aes(x = forcats::fct_reorder(Species, mSepal.Length, .desc=TRUE), y = mSepal.Length)) +
geom_bar(stat = "identity")
同様の数値による順番の変更は、reorder
関数を用いても行うことができます。
ggplot2
で円グラフを作成する場合には、coord_polar
を用います。coord_polar
は軸を円形に配置する関数で、棒グラフを描画し、coord_polar
の引数にtheta="y"
を指定すると、円グラフが描画されます。
coord_polarで円グラフの指定
|>
d ggplot(aes(x = "1", y = mSepal.Length, color = Species, fill=Species)) +
geom_bar(stat = "identity") +
coord_polar(theta = "y")
棒を複数描画するような場合には、中心からいくつかの層に分かれて円グラフが描画されます。position="fill"
を指定すると、棒グラフの高さがそろい、値は割合に変化するため、異なる要素間での比較を示すことができます。ただし、pie
関数のhelpに記載されている通り、円グラフではデータの比較が難しくなります。基本的に円グラフを用いない方が良いでしょう。
theme
は、グラフのもっと細かな要素を調整するための関数です。theme
には非常に多くの引数が設定されており、theme
を用いることで軸ラベルなどのフォントサイズや色、回転、凡例の位置等を調整することができます。代表的な例として、theme
関数のlegend.position
引数を用いて、凡例をグラフの下に表示した場合を下に示します。凡例を消す場合には、legend.position="none"
を指定します。theme
の引数には関数を取るものあり、設定はやや複雑ですが、うまく指定すれば様々なグラフの要素を調整することができます。
themeの指定
|>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point() +
theme(legend.position = "bottom")
theme
には、グラフのデザインを丸ごと変えることができる関数が別途用意されています。例えば、theme_bw
ででは背景が白いグラフ、theme_light
ででは明るめ、theme_dark
では暗めの背景を用いたグラフを作成できます。
ggplot2
のグラフを保存する時には、ggsave
関数を用います。ggsave
関数は第一引数にファイル名、第二引数にggplot2
のプロットのオブジェクトを取ります。ファイルの形式はファイル名の拡張子に従い決定します。例えば、ファイル名が「.pdf」で終わっていればPDF、「.jpg」で終わっていればJPEGでグラフが保存されます。
グラフのサイズはwidth
、height
引数で、解像度はdpi
で指定します。limitsize=FALSE
と指定することで、縦横が50インチ以上の非常に大きいグラフを保存することもできます。
ggsave関数
# プロットのオブジェクトをpに代入
<-
p |>
iris ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point()
# pをpdfで保存
ggsave("plot_iris_Sepal.pdf", p)
ggplot2
には、ggplot2
に機能を追加するExtensionsというライブラリがたくさん存在します。代表的なExtensionsを以下に紹介します。
まずは、複数のグラフを1つのデバイスにまとめて表示するpatchwork
(Pedersen 2023)です。patchwork
を用いれば、位置・幅等を簡単に調整しながら、2つ以上のグラフをまとめることができます。
patchwork
を用いる時には、まずggplot2
のオブジェクトを変数に代入しておくとよいでしょう。
ggplot2オブジェクトを変数に代入
::p_load(patchwork)
pacman<- iris |> ggplot(aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()
p1 <- iris |> ggplot(aes(x = Species, y = Petal.Length)) + geom_boxplot()
p2 <- iris |> ggplot(aes(x = Petal.Width)) + geom_histogram()
p3 <- iris |> ggplot(aes(x = Petal.Length, color = Species, fill = Species)) + geom_histogram(binwidth = 0.5) p4
グラフを横に並べて表示するときには、+
でオブジェクトを繋ぎます。
同様にカッコで囲えば表示を一部まとめておくことができます。また、|
は横並び、/
は縦並びにグラフを配置する場合に用います。
カッコ、|
、/
を組み合わせれば、グラフを様々な配置に並べて表示することができます。
gganimate
(Pedersen and Robinson 2022)はアニメーションを利用したグラフを作成するためのライブラリです。下の例では、gamminder
(各国の年別のGDPと寿命、人口のデータ)をバブルチャートとし、年毎にアニメーションとしたものです。transition_time
という部分でアニメーションのフレームとなる変数を設定し、ease_aes
という部分でフレームの間隔を表現します。
アニメーションをgifで保存する場合には、anim_save
関数を用います。anim_save
関数の引数の指定はggsave
と類似していますが、グラフオブジェクトをanimate
関数の引数とした上で、renderer
という引数を設定する必要があります。renderer
には保存するファイル形式を指定します。gifアニメーションを作成するときにはrenderer=gifski_renderer()
を指定します。このgifski_renderer
を用いるためには、gifski
パッケージ(Ooms, Kornel Lesi?ski, and Authors of the dependency Rust crates 2023)を呼び出しておく必要があります。gif以外にもmpegなどのファイルにも保存できますが、別途ライブラリの呼び出しが必要です。
gganimate関数でgifを作成
::p_load(gganimate, gifski, gapminder)
pacman
<- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
p geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~ continent) +
labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'life expectancy') + # frame_timeで描画を指定
transition_time(year) + # yearの列をフレームとする
ease_aes('linear') # yearごとのフレーム間隔は一定
anim_save("p.gif", animate(p, renderer = gifski_renderer())) # 描画の方法を指定
GGally
(Schloerke et al. 2023)はggplot2
を使って、相関行列を描画するためのExtensionです。各列のデータの型に従い、表示するグラフの形を変えてくれたり、相関係数を表示してくれたりします。pairs
関数を用いてグラフを書くよりもデータの特徴をとらえやすい相関行列の図を簡単に作成することができます。
R以外の言語にも、グラフ作成のライブラリが備わっています。例えばPythonでは、matplotlibやseaborn、plotlyなどがあります。JuliaではJulia Plotsがデフォルトのグラフ作成ライブラリです。いずれもどちらかと言えばRのデフォルトに近い関数を用いてグラフを作成するようです。
ggplot2
では、データ、aes、グラフの形をそれぞれggplot
、aes
、geom
関数で表現し、ジェネリック関数として設定された+
で繋ぐ点が特徴です。特徴が他のライブラリとは異なるため、記法に慣れるまでは他のライブラリよりグラフを作成するのが難しく感じるかもしれません。しかし、ggplot2
の経験を積み、慣れてしまえば表現したいグラフを他のライブラリよりスムーズに作成することができます。