ggplotの箱ひげ図(geom_boxplot)の箱とひげの長さを変える【R備忘録】

スポンサーリンク

はじめに

Rのggplot2ライブラリーで作成した箱ひげ図の、箱とひげの長さはそれぞれ75%値(25%値)とIQR (Inter-Quartile Range) 内の最大(最小)の値(詳しくはこちらに書かれています)にデフォルトで設定されています。

しかし、時にはその長さを調整したい時があると思います。

そこで、本記事では、その方法について紹介します。

スポンサーリンク

手法

長さの調整方法はgeom_boxplotのヘルプの一番下に凡例として記載されています。
ヘルプはRで「?geom_boxplot」と入力することで、見ることができます。

#乱数作成
y <- rnorm(100)


#各値をベクトルで指定
df <- data.frame(
  x = 1,
  y0 = min(y),
  y25 = quantile(y, 0.25),
  y50 = median(y),
  y75 = quantile(y, 0.75),
  y100 = max(y)
)

#箱ひげ図の描写
ggplot(df, aes(x)) +
  geom_boxplot(
   aes(ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100),

   stat = "identity"
 )

つまり、aes内のyminlowermiddleupperymaxの5つの引数を指定することで、箱とひげの長さを調整することができます
yminymaxがひげの長さ、lowerupperが箱の長さ、middleが中央線の位置を指定します。

普通に箱ひげ図を描くと、このように外れ値は表示される
ひげの上端が最大値に、下端が最小値に変更

このように、箱ひげ図の箱とひげの長さを調整することができます。

しかし、ここで、1つ問題があります。
それは、多くの箱ひげ図はグループ間の分布の比較などに用いられ、1つで表示されることはほとんどないことです。

この場合は以下のようにベクトルで指定してあげるとうまくいきます。

#乱数作成
y1 <- rnorm(1000)
y2<-y1-0.5

#各値をベクトルで指定
df <- data.frame(
  x =c("a","b"),
  y0 = c(min(y1),min(y2)),
  y25 = c(quantile(y1, 0.25),quantile(y2, 0.25)),
  y50 = c(median(y1),median(y2)),
  y75 =c(quantile(y1, 0.75),quantile(y2, 0.75)),
  y100 = c(max(y1),max(y2))
)

#箱ひげ図の描写
ggplot(df, aes(x)) +
  geom_boxplot(
    aes(ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100),
    stat = "identity"
  )

しかし、めんどくさがりの僕には、さらに一つ問題が生じます。
「いちいち打ち込みたくない!」ということです(笑)

また、異なるグループを同じデータフレームに入れていることがほとんどです。
Subsetを使って、いちいち分けて、計算して、打ち込む、、、
めんどいですね(笑)

そこで、好みの%値をグループ別に出力する関数を作ってみました。
プログラムは以下の通りです。

bp_func<-function(dataframe,x,y,vect_x,a){
  i=0
  vec1<-vector()
  vec2<-vector()
  dataframe$x<-x
  dataframe$y<-y
  print(vect_x)
  for(i in 1:length(vect_x)){
    vec1<-as.numeric(quantile(subset(dataframe,x==vect_x[i])$y,a,na.rm=T))
    i=i+1
    print(vec1)
    vec2<-c(vec2,vec1)
  }
  return(vec2)
  
}

使い方は「bp_func(対象のデータフレーム,グループの列,作図対象の列,グループのベクトル,求めたい%値)」です。
実際の使い方は以下の通りです。

#データフレーム作成
ukigori_dat<-data.frame(
  y=c(y1,y2,y3),
  x=c(rep(1,1000),rep(2,1000),rep(3,1000))
)

#このようにグループのベクトルを作成する必要がある
ukigori_vec<-c(1,2,3)

#「対象のデータフレーム,グループの列,作図対象の列,
#グループのベクトル,求めたい%値」の順に入力
bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,0.5)

#以下のように各グループの好みの%値が出力される
[1]  0.04253243 -0.45746757  0.54253243

このファンクションを使って以下のように入力すると、好みの箱とひげの長さの箱ひげ図を作成するためのデータフレームが完成します!
そして、先ほどのコードを入力することで、箱ひげ図の完成です。

#図作成用データフレーム
df <- data.frame(
  x =ukigori_vec,
  y0 = bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,0),
  y25 = bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,0.10),
  y50 = bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,0.5),
  y75 =bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,0.90),
  y100 = bp_func(ukigori_dat,ukigori_dat$x,ukigori_dat$y,ukigori_vec,1)
)

#箱ひげ図の描画
ggplot(df, aes(x)) +
  geom_boxplot(
    aes(ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100),
    stat = "identity"
  )
スポンサーリンク

おわりに

本記事では、ggplot2ライブラリのgeom_boxplotに関して、箱とひげの長さを調整する方法について紹介しました。
このような方法で簡単に調整することができます。

また、自作関数については、改良の余地はありそうですが、使えないことはないと思います。
ご意見、ご質問等ありましたら、お気軽にお尋ねください。

私の記事が皆様のお力添えになれば幸いです。

コメント

タイトルとURLをコピーしました