本記事ではggplot2で箱ひげグラフを作る方法について解説しています。
Rで箱ひげグラフを書きたい!ついでにプロットも入れたい!
表示させる水準を自由に変えたり、順番も変えたい!
このような人にぴったりな記事になっています。
Rに元々入っているデータセットを用いて解説しているので、コピペでどなたでもすぐに実践できますよ!
本記事で使うRパッケージとデータセット
本記事ではtidyverseパッケージを使用します。tidyverseパッケージをロードすれば、ggplot2もロードされます。
#インストールがまだの人は以下のコードでインストール
install.packages("tidyverse")
# tidyverseをロードする
library(tidyverse)
使用するデータセット
今回使用するデータセットは、Rにもともと入っているirisデータセットです。
head(iris)
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
irisデータセットとは
- Rにもともと入っている、アヤメ(iris)というお花のデータ
- 3種類のアヤメのガク片(Sepal)および花弁(Petal)の長さと幅がそれぞれ50個集められている
- アヤメの種類はsetosa、versicolor、virginica
ggplot2で箱ひげグラフを作る方法 -geom_boxplot()-
今回は、irisデータセットのSpecies(アヤメの種類)ごとのSepal.Length(ガクの長さ)の箱ひげグラフを作成します。
箱ひげグラフの作成には、geom_boxplot()を使います。
ggplot(iris,
aes(x = Species,
y = Sepal.Length))+
geom_boxplot()
簡単に書けましたね!
エクセルで箱ひげグラフを作るのは面倒ですが、Rではとっても簡単に箱ひげグラフが書けちゃいます。ただ、この箱ひげ図だとエラーバーの横線が無くちょっぴり寂しいので、stat_boxplot()でエラーバーを入れます。
箱ひげグラフにエラーバーを入れる -stat_boxplot()-
エラーバーはstat_boxplot()で入れることができます。
ggplot(iris,
aes(x = Species,
y = Sepal.Length))+
stat_boxplot(geom = "errorbar", #エラーバーを入れる
width = 0.2)+ #エラーバーの横幅は0.2で
geom_boxplot(outlier.color = "red") #箱ひげ図を作成。外れ値は赤色で表示
・stat_boxplot(geom = "errorbar") : エラーバーを入れる
・width = 0.2 : エラーバーの横幅を0.2に設定
・geom_boxplot(outlier.color = "red") : 箱ひげ図を入れ、外れ値は赤色にする
この時、stat_boxplot()はgeom_boxplot()の前に記述するのがポイントです。
stat_boxplot()をgeom_boxplot()の後に記述してしまうと、ボックスの上にエラーバーが入るので違和感があります(私は!)。
箱ひげグラフに平均値のプロットを入れる
箱ひげグラフでは中央値(median)は分かりますが、平均値の情報はありません。
平均値のプロットもグラフに一緒に入れたい場合は、stat_summary()を使うと簡単です。
ggplot(iris,
aes(x = Species,
y = Sepal.Length))+
stat_boxplot(geom = "errorbar",
width = 0.2)+
geom_boxplot()+
stat_summary(geom = "pointrange",
fun = "mean",
shape = 2,
color = "red")
・geom = "pointrange" : ポイントレンジを表示させる
・fun = "mean" : ポイントレンジのプロットをmeanの位置にする
・shape = 2 : プロットの形を2(三角)にする
・color = "red" : プロットの色は赤色で
pointrangeは本来こういう用途じゃないんですが…楽にできます。
もちろんfun = "median"にすると、箱ひげグラフの箱の中線の位置にプロットがきます。
pointrangeの本来の使い方
pointrangeは棒グラフで最大/最小や平均±標準偏差や標準誤差を表現するのに使われます。
ggplot(iris,
aes(x = Species,
y = Sepal.Length,
fill = Species))+
stat_summary(geom = "bar", fun = "mean", # 平均の棒グラフを書く
show.legend = F)+
stat_summary(geom = "pointrange", # 最大と最小のpointrangeを入れる
fun = "mean", fun.max = "max", fun.min = "min",
show.legend = F)
箱ひげグラフにプロットを入れる方法
データの分布を確認するために、箱ひげグラフにプロットを入れることもあると思います。
プロットを入れる方法には、
・プロットをランダムに散らばらせる
・プロットをきれいに散らばらせる
の2パターンがあります。
プロットをランダムに散らばらせる -jitter-
プロットをランダムに散らばらせる場合は、geom_point()のpositionでjitterを使います。
#箱ひげグラフをオブジェクトgとして保存
g <-
ggplot(iris,
aes(x = Species,
y = Sepal.Length))+
stat_boxplot(geom = "errorbar",
width = 0.2)+
geom_boxplot()
g
# オブジェクトgにプロットをjitterで追加
g + geom_point(aes(color = Species),
position = position_jitter(width = 0.1,
seed = 99),
show.legend = FALSE)
・aes(color = Species) : Speciesごとに色を付ける
・width:散らばらせる幅を指定
・seed:点同士の散らばらせ方を設定(後述)
・show.legend = FALSE:凡例を非表示にする
seedについて
seedでは、"点同士の散らばり方”を設定できます。
seedは省略しても構いませんが、その場合はグラフを書くたびに散らばり方が変わります。そのため、グラフの再現性という観点で任意の値を入れておくといいです。
値は1でも9でも9999でもなんでもOKです。
プロットをきれいに散らばらせる -ggbeeswarm-
プロットを綺麗に散らばらせるには、ggbeeswarmパッケージを使用します。
# インストールしていない場合はイントールする
install.packages("ggbeeswarm")
#ggbeeswarmをロードする
library(ggbeeswarm)
ggbeeswarmパッケージを使って散らばらせるには、
・geom_beeswarm()
・position = position_beeswarm()
この2つの書き方がありますが、それぞれ同じグラフになります。
g + geom_beeswarm(aes(color = Species),
cex = 1.2,
show.legend = FALSE)
g + geom_point(aes(color = Species),
position = position_beeswarm(cex = 1.2),
show.legend = FALSE)
・aes(color = Species) : Speciesごとに色付けする
・cex : プロットの散らばり幅を調節する
・show.legend = FALSE : 凡例を非表示にする
cexで点同士の散らばり幅を設定できますが、グラフによってcexの最適な値は変わりますので調整が必要です。
なお、点同士が完全に重ならないようにするには、geom_quasirandom()が便利です。
プロット同士が重ならないように並べる -geom_quasirandom()-
プロット同士が重ならないようにするには、ggbeeswarmパッケージに入っているgeom_quasirandom()もしくはposition = position_quasirandom()を使います。どちらを使ってもかまいません。
g + geom_quasirandom(aes(color = Species),
width = 0.2,
method = "smile",
show.legend = FALSE)
g + geom_point(aes(color = Species),
position = position_quasirandom(width = 0.2,
method = "smile"),
show.legend = FALSE)
・width : 点同士の散らばり幅を設定
・method = "smile" : 並び方をスマイルのようにする
・show.legend = FALSE : 凡例を非表示にする
ggbeeswarmについては棒グラフにプロットを入れる方法でも解説していますのでこちらもぜひ参考にしてくださいね。
ある水準の箱ひげグラフだけを表示する -scale_x_discrete()-
上記のグラフのような水準が複数ある箱ひげ図で、ある水準のみ取り出したい場合についてです。
ある水準のみ取り出したい場合は、scale_x_discrete()のlimitsを使います。
# グラフを作成
# mpgはggplot2パッケージに入っているデータセットです)
g <- ggplot(mpg,
aes(x = class,
y = displ))+
stat_boxplot(geom = "errorbar",
width = 0.2)+
geom_boxplot()
# 欲しい水準のみ取り出す
g + scale_x_discrete(limits = c("suv", "compact"))
水準の名前や順番を変えることもできる!
scale_x_discrete()のlabelsを使えば、水準の名前や順番を変えることも可能です。
g + scale_x_discrete(limits = c("suv", "compact", "minivan"),
labels = c("SUV", "COMPACT", "MINIVAN"))
グラフにしたい水準だけを別のデータフレームに入れて…などしなくても大丈夫ですよ!
まとめ:ggplotで箱ひげグラフを作る時はgeom_boxplot()で!
今回はggplot2で箱ひげグラフを作る方法について解説しました。
箱ひげグラフはエクセルだとかなり手間がかかるのでRでサクっと作れるのは嬉しいですね。また、ggbeeswarmを使えばプロットをキレイに並べることができるのでぜひ使ってみてください!
今回のirisデータセットではそこまで美しく見えなかったかもしれませんが、データ数が多ければ多いほど美しいグラフになります。
当ブログでは箱ひげグラフ以外にも棒グラフや散布図について解説しています。ぜひ参考にしてみてくださいね!
R言語の勉強におすすめの本
今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。