Mukku John Blog

取り組んでいること を つらつら と

ggplot2を使って、軸を制御する-1

R グラフィックス クックブック 22回目

ggplot2パッケージを利用して、軸を制御していきます。

そもそもデフォルトで、適切な軸を表示してくれますが、
軸ラベルや、目盛りの数、位置を制御することで、見る人の解釈を助けます。

利用するデータ、ベースのグラフ

R: Results from an Experiment on Plant Growthデータセットを使います。

x軸にgroup、y軸にweightをマッピングした箱ひげ図をベースにします。

p <- ggplot(PlantGrowth, aes(x=group,y=weight)) + 
  geom_boxplot()
p

f:id:MukkuJohn:20161003214042p:plain

x軸とy軸を反転する

散布図は、x軸とy軸にマッピングしている変数を交換すれば良いですが
他の幾何オブジェクトは、交換するとグラフとして成り立ちません。

#箱ひげ図で、x軸とy軸の変数を交換してみる...
> ggplot(PlantGrowth, aes(x=weight, y=group)) +
+ geom_boxplot()
Warning messages:
1: position_dodge requires constant width: output may be incorrect 
2: position_dodge requires non-overlapping x intervals 

f:id:MukkuJohn:20161003214535p:plain
マッピングを交換した箱ひげ図…そもそも成り立ちません。

このように、x軸とy軸を同等に扱わないグラフの
x軸とy軸を交換には、coord_flip()を使います。

p + coord_flip()

f:id:MukkuJohn:20161003214932p:plain


ベースのグラフは、x軸の左から、"ctrl","trt1","trt2"となっていますが、
交換後のグラフは、y軸の下から、"ctrl","trt1","trt2"となっています。

交換前後で、左から始まりが、下から始まりに変わりました。

左から右へ読んでいたグラフを、下から上へ読むことを許容できれば良いのですが、
出来ない場合は、順序の並び順を制御して、上から始まりに変えられます。

#x軸に対して、並び替えを逆にします。
p + coord_flip() + 
  scale_x_discrete(limits = rev(levels(PlantGrowth$group)))

f:id:MukkuJohn:20161003215647p:plain
上から始まりになりました。

連続値の軸の範囲を設定する

x軸やy軸の範囲を設定するには、xlim()ylim()を使います。

#y軸の表示範囲を0から、weightの最大値までにします。
p + ylim(0, max(PlantGrowth$weight))

f:id:MukkuJohn:20161003220044p:plain
3.5から6の範囲で表示されていた箱ひげ図を、0から6の範囲で表示になったため
箱がつぶれているように見えます。これでは、データ分布が分からないですね。

上のグラフは、ylim()を使いましたが、scale_y_continuous()も同じです。

#ylim(0, max(PlantGrowth$weight))と同じです。
p + scale_y_continuous(limits = c(0, max(PlantGrowth$weight)))


例えば、ylim()で範囲を設定し、scale_y_continuous()で目盛り線を消す場合など、
ylim()scale_y_continuous()と同時に使う場合は、注意が必要です。

p + ylim(0,10) + scale_y_continuous(breaks=NULL)

f:id:MukkuJohn:20161003220917p:plain
目盛り線が消えていますが、y軸の範囲が設定されていません。

p + scale_y_continuous(breaks=NULL) + ylim(0,10)

f:id:MukkuJohn:20161003220926p:plain
y軸の範囲が設定されていますが、目盛り線が消えていません。

両方同時に利用すると、後者の関数だけ適用されます。
これを避けるためには、scale_y_continuous()だけを利用します。

p + scale_y_continuous(limits=c(0, 10), breaks=NULL)

f:id:MukkuJohn:20161003221138p:plain
0から10の範囲を設定していますが、目盛り線を消したので分かりません。。。

この範囲指定ですが、範囲外のデータは除去してグラフが作成されます。

#グラフは、weightが5~6.5の値だけが考慮される
p + scale_y_continuous(limits=c(5,6.5))
Warning message:
Removed 13 rows containing non-finite values (stat_boxplot). 

13行除去されているエラーメッセージが出ています。
f:id:MukkuJohn:20161003221358p:plain

ylim()scale_y_continuous()を使って、範囲を狭める場合、
範囲外のデータは除去されるため、グラフにズームインすることはできません。

データを除去せず、ズームイン・アウトする場合は、coord_cartesian()を使います。

#データは除去されず、5~6.5の範囲に寄る
p + coord_cartesian(ylim = c(5,6.5))

f:id:MukkuJohn:20161003222148p:plain

最後に、片方向のみに範囲を拡張するには、expand_limits()を使います。

p + expand_limits(y=0)

f:id:MukkuJohn:20161003222426p:plain

expand_limits()ですが、拡張のため範囲を狭める関数ではありません。
そのため、データが存在するポイントを指定しても無視された感じで動きます。

#そもそもどこを基準に、y=5に拡張しているのか分からないですが、、、
p + expand_limits(y=5)

f:id:MukkuJohn:20161003222602p:plain

連続値を逆転する

ベースのグラフは、下から上に向けて、数値が大きくなっていきますが、
上から下に向けて、数値を大きくします。
読みづらい気もしますが、逆転するためには、scale_y_reverse()を使います。

p + scale_y_reverse()

f:id:MukkuJohn:20161003222734p:plain


ylim()の引数で、上限値~下限値の順で指定すると、同様の結果が得られます。

p + ylim(6.5, 3.5)

f:id:MukkuJohn:20161003222946p:plain

軸を逆転して、範囲も設定する場合は、scale_y_reverse()limits引数を指定します。

#範囲外のデータは除去されることに注意です
p + scale_y_reverse(limits=c(5,3))
Removed 17 rows containing non-finite values (stat_boxplot). 

f:id:MukkuJohn:20161003223143p:plain

離散値軸の順番を変更する

ベースのグラフのx軸は、左から"ctrl","trt1","trt2"となっています。
この並びを変更するためには、scale_x_discrete()を使います。

p + scale_x_discrete(limits=c("trt1","ctrl","trt2"))

f:id:MukkuJohn:20161003223744p:plain

このscale_x_discrete()ですが、一部の要素だけを図に表示することもできます。

#ctrl列を除きます
p + scale_x_discrete(limits=c("trt1","trt2"))

f:id:MukkuJohn:20161003224025p:plain

今回は、軸の入れ替えや逆転、範囲などを制御しました。

次回は、スケール比や、目盛り軸を制御します。