12/5 色の調整、箱ひげ図を用いて

フレンチのメニューみたいなタイトルになってしまった。今回は昨日の箱ひげ図に色を加えて華やかにしてみます。サイエンスとして本質的かと聞かれると、まあただの道楽ですね

デフォルトのカラーリング

箱ひげ図の色付けとしては枠線と中の色が別々に設定可能で、それぞれcolとfillが対応します。枠線の色と塗りつぶしっていうのは箱ひげ図以外もヒストグラムや棒グラフなどで別々に設定可能です。
まずはデフォルトのカラーパレットで色付けしてみます。ぼくはこのカラーパレット見やすくて結構好きです。

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length,col=Species))+
  theme_classic()+
  geom_boxplot()
ggsave("fig/1205_1.jpeg",g,width = 10,height = 7.5,units="cm")

最初のggplot関数内でプロットするデータを宣言する時、aes()ブロックの中でそれぞれの軸に対応する変数を設定します。この際にcol=で色付けの基準にしてほしい変数を設定すると、カテゴリーごとに自動で色を割り振ってくれます。ここはちょっとだけトリッキーなところで、色名並べたベクトルとか設定しても無駄です。

自分で色を決めたい

デフォルトの色が好きといってもやっぱり自分で色の設定とかしたくなってしまうもので、そういうときは
・aesブロックで色付けの基準とするカテゴリーを設定
・scale_color_manual(塗りつぶしならscale_fill_manual)で好きな色を設定
という2stepを行う必要があります。以下のコードではグレー、ブルー、ピンクで塗りつぶしてみます。

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length,fill=Species))+
  theme_classic()+
  geom_boxplot()+
  scale_fill_manual(values=c("grey77","blue","deeppink2"))
ggsave("fig/1205_2.jpeg",g,width = 10,height = 7.5,units="cm")

散布図と重ねて色付け

散布図と重ねて色も自分で設定してみましょう。ボックスプロットを塗りつぶすと各点が見にくくなるので、枠線の色付けに戻します。

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length,col=Species))+
  theme_classic()+
  geom_boxplot()+
  geom_jitter()+
  scale_color_manual(values=c("grey33","blue","deeppink2"))
ggsave("fig/1205_3.jpeg",g,width = 10,height = 7.5,units="cm")

散布図のみ色付け

これでもいいんですが、ボックスは色つけなくていいかなあという気がしてきたので点のみに色を付けます。ここでの注意点として、ggplot関数内でのaes設定はすべてのグラフィックオブジェクトで共通のものとなるので、今回のように特定のオブジェクトのみ色付けしたい場合はgeom_jitter内でaesを設定する必要があります。

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length))+
  theme_classic()+
  geom_boxplot()+
  geom_jitter(aes(col=Species))+
  scale_color_manual(values=c("grey33","blue","deeppink2"))
ggsave("fig/1205_4.jpeg",g,width = 10,height = 7.5,units="cm")

透過度の設定, ドットサイズの変更

だいぶ理想に近づいてきました。気にしない人には時間の無駄にしか見えないと思うので、残りは無視して大丈夫です。個人的にあと気になるのは
・点の色で箱ひげ図が隠されて気持ち悪い
・外れ値のドットと値を示す点が同じサイズなので判別しにくい
これを修正するために色の透過処理と点サイズの変更を行います。透過色の作成は別途カラーパレットを自分で作る必要があり、RColorBrewerというライブラリーを使います。

library(RColorBrewer)
my_color <- adjustcolor(c("grey33","blue","deeppink2"),alpha=0.5)
print(my_color)
"#0000004D" "#0000FF4D" "#EE12894D" #透過処理済みのカラーコードのベクトルが生成される

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length))+
  theme_classic()+
  geom_boxplot()+
  geom_jitter(size=1,aes(col=Species))+
  scale_color_manual(values = my_color)
ggsave("fig/1205_5.jpeg",g,width = 10,height = 7.5,units="cm")

点のタイプの変更

上のようにプロットしてみたところ、それぞれの点が透過処理できて下のオブジェクトが見やすくなりました。一方で、各点に輪郭のようなものが存在することがわかってしまいました。これは気になりますね(?)。調べてみると、輪郭なしの点はgeom_jitter内でshapeというパラメータを16に設定するとプロットできるみたいです。ちなみにshapeの設定次第で△とか✗とかに変更することも可能です。

g <- ggplot(data.iris,aes(x=Species,y=Sepal.Length))+
  theme_classic()+
  geom_boxplot()+
  geom_jitter(size=1.2,aes(col=Species),shape=16)+
  scale_color_manual(values = my_color)
ggsave("fig/1205_6.jpeg",g,width = 10,height = 7.5,units="cm")

明らかによくなりましたね。満足です。

コメントする