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
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
マッピングを交換した箱ひげ図…そもそも成り立ちません。
このように、x軸とy軸を同等に扱わないグラフの
x軸とy軸を交換には、coord_flip()を使います。
p + coord_flip()
ベースのグラフは、x軸の左から、"ctrl","trt1","trt2"となっていますが、
交換後のグラフは、y軸の下から、"ctrl","trt1","trt2"となっています。
交換前後で、左から始まりが、下から始まりに変わりました。
左から右へ読んでいたグラフを、下から上へ読むことを許容できれば良いのですが、
出来ない場合は、順序の並び順を制御して、上から始まりに変えられます。
#x軸に対して、並び替えを逆にします。 p + coord_flip() + scale_x_discrete(limits = rev(levels(PlantGrowth$group)))
上から始まりになりました。
連続値の軸の範囲を設定する
x軸やy軸の範囲を設定するには、xlim()やylim()を使います。
#y軸の表示範囲を0から、weightの最大値までにします。 p + ylim(0, max(PlantGrowth$weight))
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)
目盛り線が消えていますが、y軸の範囲が設定されていません。
p + scale_y_continuous(breaks=NULL) + ylim(0,10)
y軸の範囲が設定されていますが、目盛り線が消えていません。
両方同時に利用すると、後者の関数だけ適用されます。
これを避けるためには、scale_y_continuous()だけを利用します。
p + scale_y_continuous(limits=c(0, 10), breaks=NULL)
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行除去されているエラーメッセージが出ています。
ylim()やscale_y_continuous()を使って、範囲を狭める場合、
範囲外のデータは除去されるため、グラフにズームインすることはできません。
データを除去せず、ズームイン・アウトする場合は、coord_cartesian()を使います。
#データは除去されず、5~6.5の範囲に寄る p + coord_cartesian(ylim = c(5,6.5))
最後に、片方向のみに範囲を拡張するには、expand_limits()を使います。
p + expand_limits(y=0)
expand_limits()ですが、拡張のため範囲を狭める関数ではありません。
そのため、データが存在するポイントを指定しても無視された感じで動きます。
#そもそもどこを基準に、y=5に拡張しているのか分からないですが、、、 p + expand_limits(y=5)
連続値を逆転する
ベースのグラフは、下から上に向けて、数値が大きくなっていきますが、
上から下に向けて、数値を大きくします。
読みづらい気もしますが、逆転するためには、scale_y_reverse()を使います。
p + scale_y_reverse()
ylim()の引数で、上限値~下限値の順で指定すると、同様の結果が得られます。
p + ylim(6.5, 3.5)
軸を逆転して、範囲も設定する場合は、scale_y_reverse()のlimits引数を指定します。
#範囲外のデータは除去されることに注意です p + scale_y_reverse(limits=c(5,3)) Removed 17 rows containing non-finite values (stat_boxplot).
離散値軸の順番を変更する
ベースのグラフのx軸は、左から"ctrl","trt1","trt2"となっています。
この並びを変更するためには、scale_x_discrete()を使います。
p + scale_x_discrete(limits=c("trt1","ctrl","trt2"))
このscale_x_discrete()ですが、一部の要素だけを図に表示することもできます。
#ctrl列を除きます p + scale_x_discrete(limits=c("trt1","trt2"))
今回は、軸の入れ替えや逆転、範囲などを制御しました。
次回は、スケール比や、目盛り軸を制御します。