ggplot2パッケージ(tidyverseパッケージに含まれている)のdiamondsデータを使う。
> library(tidyverse) > head(diamonds) # A tibble: 6 x 10 carat cut color clarity depth table price x y z <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> 1 0.31 Good E SI1 63.3 55 544 4.33 4.36 2.75 2 0.8 Very Good H VS2 59.1 59 2953 6.02 6.07 3.57 3 0.78 Very Good H VS1 61.9 57.1 2854 5.87 5.95 3.66 4 0.3 Ideal G VVS2 61.5 57 684 4.29 4.33 2.65 5 1.5 Good F SI2 59.7 61 8181 7.39 7.44 4.43 6 1.2 Very Good E SI2 61.4 58 6130 6.81 6.88 4.2
carat:重さ(カラット)cut:カットの質(5段階)color:色(7段階)clarity:透明度(8段階)depth:table:最も幅広い部分に対する最上部の幅price:値段(USD)x,y,z:それぞれ長さ・幅・高さ(mm)
geom_boxplot( )を使って箱ヒゲ図を描く
xに離散変数(cut)、yに連続変数(carat)を指定するとカテゴリー別の箱ヒゲ図が横方向に並ぶ。
x, yを入れ替えると水平方向の箱ヒゲ図が縦方向に並ぶ。
ここでは箱の色もcut別に塗り分けるようにしたが、見た目華やかになる以外の意味はない(要因による塗り分けを指定する場合はaes()内に入れる書き方は知っておく方がよいかも)。
ggplot(data = diamonds, aes(x = cut, y = carat)) + geom_boxplot(varwidth=TRUE, notch=TRUE, notchwidth = 0.5, aes(fill = cut))

箱の形状に関する指定
notch=TRUEとすると、箱の真ん中の線(通常はmedian)にノッチができる。notchwidthで切れ込み具合を指定できる。例えばnotchwidth=0.2とすると箱の20%幅までノッチが入る。1より大きい値を指定すると箱の幅よりはみ出る。varwidth=TRUEとすると、箱の幅をサンプルサイズの平方根に比例させる
箱の色・線種に関する指定
fill:箱を塗りつぶす色alpha:箱の透過性。0(完全透明)から1(完全不透明)の間で指定。colour:箱の枠線の色linetype:箱の枠線の種類(プロットマーカーや線の種類を変更する [R] - ねこすたっと)size:箱の枠線の太さ
外れ値に関する指定
outlier.colour,outlier.stroke:プロットの線の色・太さoutlier.fill,outlier.alpha:プロットの塗りつぶしの色、透過性outlier.shape:プロットの形。=NAとするとプロットを描かない(見えなくしただけ)outlier.size:プロットの大きさ
※ プロットマーカーについて以前まとめた記事があります(2022-07-17 追加)
geom_violin( )でバイオリンプロットを描く
耳慣れないプロットだが、要は中心線の両側に密度プロットを描いたもの。
scaleでそれぞれのバイオリンの幅をどのように決めるか指定する。
"area":面積が同じ(デフォルト)
"width":最大部分の幅が同じ
"count":最大部分の幅がサンプルサイズに比例(少ないカテゴリーの分布はつぶれて分かりにくくなるかも)
また、draw_quantilesでパーセンタイルを示す線を追加できる。
ggplot(data = diamonds, aes(cut,carat)) + geom_violin(scale="area", draw_quantiles = c(0.25,0.5,0.75))

色・線種に関する指定については箱ヒゲ図を参照。
stat_*( )との対応
次にあげるような箱ヒゲ図を描く元となるデータはstat_boxplot()で計算される。
lower,middle,upper:箱の下端、中央線、上端ymin,ymax:ヒゲの下端、上端
バイオリンプロットで使われる値はstat_ydensity()で計算される。
おわりに
- 箱ヒゲ図で使われているymin, ymaxはリボンプロットやエラーバーを描くときにも出てくる
- ネコ用品にはついつい財布の紐が緩みますね
参考資料
- 本家ページ:
geom_*とstat_*の関係が詳しくまとめられています