本ページはプロモーションが含まれています

広告 R グラフ化

R | ggplot2で箱ひげグラフを作る方法(プロットの追加や順番変更も)

本記事では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()
SpeciesごとのSepal.Lengthの箱ひげ図

簡単に書けましたね!

エクセルで箱ひげグラフを作るのは面倒ですが、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()の後に記述してしまうと、ボックスのにエラーバーが入るので違和感があります(私は!)。

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)
棒グラフにMax/Minのpointrangeを追加

箱ひげグラフにプロットを入れる方法

データの分布を確認するために、箱ひげグラフにプロットを入れることもあると思います。

プロットを入れる方法には、
 
 ・プロットをランダムに散らばらせる
 ・プロットをきれいに散らばらせる

の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です。

seedの値を変えれば散らばり方が変わる

プロットをきれいに散らばらせる -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 : 凡例を非表示にする

beeswarmでプロットをきれいに並べる

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については棒グラフにプロットを入れる方法でも解説していますのでこちらもぜひ参考にしてくださいね。

関連記事:beeswarmについて

ある水準の箱ひげグラフだけを表示する -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"))
2水準のみ取り出してグラフ化

水準の名前や順番を変えることもできる!

scale_x_discrete()labelsを使えば、水準の名前や順番を変えることも可能です。

g + scale_x_discrete(limits = c("suv", "compact", "minivan"),
                     labels = c("SUV", "COMPACT", "MINIVAN"))
水準名を大文字に変更&順番も変更

グラフにしたい水準だけを別のデータフレームに入れて…などしなくても大丈夫ですよ!

\ オンラインでR言語を勉強するならUdemy /

UdemyのR講座を見てみる

まとめ:ggplotで箱ひげグラフを作る時はgeom_boxplot()で!

今回はggplot2で箱ひげグラフを作る方法について解説しました。

箱ひげグラフはエクセルだとかなり手間がかかるのでRでサクっと作れるのは嬉しいですね。また、ggbeeswarmを使えばプロットをキレイに並べることができるのでぜひ使ってみてください!

今回のirisデータセットではそこまで美しく見えなかったかもしれませんが、データ数が多ければ多いほど美しいグラフになります。

当ブログでは箱ひげグラフ以外にも棒グラフや散布図について解説しています。ぜひ参考にしてみてくださいね!

R言語の勉強におすすめの本

今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。

  • この記事を書いた人

かにさん

めんどくさがり日本代表のワーママ。
住んでいる自治体の認可保育料が高いことをキッカケに、全国の保育料まとめブログを書き始めました。
趣味
ブログ執筆、海外ドラマ(刑事モノ)、投資、
面倒なことをいかに楽にこなすか考えること

-R, グラフ化