進化系?箱ひげ図

箱ひげ図は要約統計量(五数要約)を利用してるため頑健ではありますが、データの分布形状を見るにはあまり適していません。そこで、箱ひげ図の特徴を利用しながらデータ分布も見ることができるいくつかのプロットを紹介します。
 

Packages and Datasets

本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
 

Package Version Description
tidyverse 1.2.1 Easily Install and Load the ‘Tidyverse’

 
また、本ページでは以下のデータセットを用いています。
 

Dataset Package Version Description
iris datasets 3.4.4 Edgar Anderson’s Iris Data

 

バイオリンプロット

バイオリンプロット(バイオリン図)は箱ひげ図の箱に代わりにデータ分布の確率密度を中心線を挟んで対象にプロットしたものです。ggplot2::geom_violin関数を用いて描くことができます。密度の推定方法はデフォルトで“gaussian”注4が適用されます。
 

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    ggplot2::geom_violin()

 
注4 密度推定にはdensity関数が利用され推定方法はデフォルトを含めて7種類から選択することができます
 

一般的なバイオリンプロットは確率密度に加えて四分位値が描かれることが多いです。四分位値を描く場合はdraw_quantilesオプションを用いて描きたい四分位を指定してください。
 

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75))

 

バイオリンプロットと平均値

四分位に加えて平均値をプロットしたい場合は、箱ひげ図の場合と同様にggplot2::stat_summary関数を用いてください。
 

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75)) + 
    ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red")

 

バイオリンプロットと箱ひげ図

見慣れた箱ひげ図の方がいいという場合はggplot2::geom_boxplot関数に引数widthを指定してください。加えてggplot2::stat_summary関数で平均値を描画することもできます。

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    ggplot2::geom_violin() +
    ggplot2::geom_boxplot(width = 0.1) +
    ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red")

 

バイオリンプロットと頻度分布

やっぱり実際の頻度分布も見たいという場合は箱ひげ図の場合と同様にggplot2::geom_dotplot関数を用いてください。この時にpositionオプションで描画をオフセットさせると複数の描画を重ねても見やすいグラフにすることができます。
 

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75)) + 
    ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red",
                          position = position_nudge(0.025)) +
    ggplot2::geom_dotplot(binaxis = "y", dotsize = 0.5, stackdir = "down",
                          binwidth = 0.1, position = position_nudge(-0.025)) 

 

レインドロップ・プロット

GitHubで geom_flat_violinという関数のコード が公開されています。geom_flat_violine関数はバイオリンプロットを半分だけ描く関数です。このプロットとドットプロットを組み合わせることで雨雲のようなプロットを描くことができます。
 

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) + 
    geom_flat_violin() + 
    ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red",
                          position = position_nudge(0.025)) +
    ggplot2::geom_dotplot(binaxis = "y", dotsize = 0.5, stackdir = "down",
                          binwidth = 0.1, position = position_nudge(-0.05)) + 
    ggplot2::coord_flip()

 

ビーン・プロット

ビーン・プロットはヴァイオリン・プロットとストリップチャートを組み合わせたようなグラフでbeanplotパッケージを用いて描くことができます。デフォルトでは密度推定のカーネル関数に“gaussian”が用いられています。同じく“gaussian”を用いているggplot2::geom_violin関数と若干形状が異なるのはバンド幅など他のデフォルト値が異なっていることに起因しているようです。
 

iris %>% 
  beanplot::beanplot(Sepal.Length ~ Species, data = ., method = "jitter")

 

ビー・スウォーム・プロット

ビー・スウォーム(Bee Swarm)プロットはデータの分布を実際の点として点同士が重ならないようにプロットするグラフで、beeswarmパッケージを用いて描くことができます。
 

iris %>% 
  beeswarm::beeswarm(Sepal.Length ~ Species, data = ., method = "swarm")

 

ggplot2用

ggplot2パッケージでビー・スウォーム・プロットを描きたい場合はggbeeswarmパッケージを用います。

iris %>% 
  ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length, colour = Species)) + 
    ggbeeswarm::geom_beeswarm()