【R】ggplotで箱ひげ図をプロットする方法まとめ

この記事ではggplot2のライブラリを使って箱ひげ図をプロットする方法について解説していきます。

ggplot2をまだインストールしていない方は下記コマンドを実行して、ライブラリをインストールしておいてください。

install.packages("ggplot2")

今回は「ToothGrowth」というデータを使って解説していきますので下記のようにデータを読み込んでおいてください。

data("ToothGrowth")
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
head(ToothGrowth)
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

また、ライブラリの読み込みとテーマの設定を済ませておきましょう(テーマの設定はやらなくてもOKです。元の見た目が若干ダサいので・・・)

library(ggplot2)
theme_set(theme_classic() + theme(legend.position = "top"))

参考

 

 

基本的な箱ひげ図

まずは基本的な箱ひげ図を作成してみましょう。ggplot関数にデータと指標を指定してから、geom_boxplotを結合することで簡単に箱ひげ図をプロットすることができます。

p <- ggplot(ToothGrowth, aes(x = dose, y = len))
p + geom_boxplot()

平均値の描画

上記で作成した箱ひげ図に平均値を描画するにはstat_summary関数を使います。stat_summary関数のfun引数にmean(平均)を指定することで、箱ひげ図に平均点を描画することができます。

p + geom_boxplot() + stat_summary(fun = mean, geom = "point", color = "#FC4E07")

X軸の表示項目を絞る

X軸の表示項目「dose」を絞り込みたい場合は、scale_x_discreteを指定します。scale_x_discreteのlimits引数に表示したい項目のリストを指定することで絞り込むことができます。

ここではdoseが「0.5」と「1」のものだけ描画してみます。

p + geom_boxplot() + scale_x_discrete(limits=c("0.5", "2"))

ちなみに、limitsに指定するリストの順序を入れ替えることで、プロットの順序を入れ替えることができるので試してみてください。

グループごとに色を変更する

プロットの塗り潰し

doseのグループごとに箱の中の色を変更するには、geom_boxplotの引数にグループ化する指標を「aes(fill = dose)」のように指定します。これにより箱ひげ図をプロットした際にdoseでグルーピングでき、デフォルトの配色で表現されます。

これに加え、scale_fill_manual()を使うことによってグループごとに配色を指定することができます。

p + geom_boxplot(aes(fill = dose)) + 
    scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

線の色を変更する

線の色を変更するには塗り潰しとほぼ同様で、colorを指定することで変更することができます。

p + geom_boxplot(aes(color = dose)) + 
    scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

複数グループのプロット

今度は複数グループ存在するデータで箱ひげ図をプロットしてみます。

先ほどまではdoseグループでプロットしていましたが、今度はdoseとsuppでグルーピングしてみましょう。

x軸をdoseでプロットしつつ、geom_boxplotのfill引数でsuppを指定することで複数グルーピングが可能になります。

p + geom_boxplot(aes(fill = supp)) +
    scale_fill_manual(values = c("#00AFBB", "#E7B800"))

グループをパネル分け

最後にグループをパネル分けする方法について解説します。

先ほどのプロットでは同じパネルに複数のグループをプロットしていましたが、グループごとにパネルを分けてプロットすることもできます。

やり方は簡単で、先ほどのコードにfacet_wrapを付け加えるだけでパネルわけをすることができます。

p + geom_boxplot(aes(fill = supp)) +
    scale_fill_manual(values = c("#00AFBB", "#E7B800")) +
    facet_wrap(~supp)