ggplot2を使って、軸を制御する-4
R グラフィックス クックブック 25回目
ggplot2パッケージを利用して、軸を制御していきます。
今回は、軸の線を強調したり、対数軸を用いてみます。
軸の線の強調
こちらのグラフをベースにします。
x軸・y軸に線を引くためには、theme()を使い、axis.line引数を指定します。
#x軸・y軸に線を引き、強調する ベースプロット + theme(axis.line = element_line(colour="black"))
x軸・y軸に黒線が引かれ、くっきりしました。
プロット領域の境界線を持つ場合は、あえて消す指定を行う必要があります。
例えば、theme_bw()を使うような場合です。
ベースプロット + theme_bw()
上のプロットのように、境界線がある場合は、ブランクを指定してから追加します。
#panel.border引数に、ブランクを指定します #axis.line引数に、線を指定します ベースプロット + theme_bw() + theme(panel.border = element_blank(), axis.line = element_line(colour="black"))
element_line()ですが、size引数で線の太さを指定できます。
ベースプロット + theme_bw() + theme(panel.border = element_blank(), axis.line = element_line(colour="black",size=4))
左下を見ると、微妙に開いています。
重ねて表示するためには、lineend引数にsquareを指定します。
ベースプロット + theme_bw() + theme(panel.border = element_blank(), axis.line = element_line(colour="black",size=4,lineend="square"))
対数軸
対数軸を使うと、軸上の距離が割合で表現できます。
今まで扱っていたのは、線形軸と呼びます。軸上の距離は一定の変化量です。
R: Brain and Body Weights for 28 Speciesデータセットを使います。
動物の体重(kg)と脳の重さ(g)のデータセットです。
> head(Animals) body brain Mountain beaver 1.35 8.1 Cow 465.00 423.0 Grey wolf 36.33 119.5 Goat 27.66 115.0 Guinea pig 1.04 5.5 Dipliodocus 11700.00 50.0 > str(Animals) 'data.frame': 28 obs. of 2 variables: $ body : num 1.35 465 36.33 27.66 1.04 ... $ brain: num 8.1 423 119.5 115 5.5 ...
x軸に体重、y軸に脳の重さをマッピングし、行の名前をラベルに表示します。
ggplot(Animals, aes(x=body,y=brain,label=rownames(Animals))) + geom_text(size=3)
これだと、体重や脳の重さが大きいデータポイントのせいで、軸が拡張され
ほとんどのデータポイントが左下に集まってしまっています。
このような場合、軸を対数軸に変更し、軸上の距離を割合で表現した方が良いです。
対数軸を使うには、scale_x_log10()やscale_y_log10()を使います。
ベースプロット + scale_x_log10() + scale_y_log10()
データの分布が見たいので、散布図を使っています。データポイントの値が見たいわけではないです。
scale_x_log10()やscale_y_log10()を使うと、目盛りが自動で設定されます。
目盛りを指定するためには、breaks引数を指定します。
ベースプロット + scale_x_log10(breaks=10^(-1:5)) + scale_y_log10(breaks=10^(0:3))
x軸を見ると1e-01、1e+00、1e+01と表現されていますが、
指数表記に変換するためには、scalesライブラリのtrans_format()を使います。
library(scales) ベースプロット + scale_x_log10(breaks=10^(-1:5), labels=trans_format("log10",math_format(10^.x))) + scale_y_log10(breaks=10^(0:3), labels=trans_format("log10",math_format(10^.x)))
scale_x_log10()やscale_y_log10()を使い、log10の対数を扱いましたが
自然対数はlog2などの対数を扱うこともできます。
#x軸は自然対数、y軸はlog2です。軸で基数が異なります。 ベースプロット + scale_x_continuous(trans = log_trans(), breaks=trans_breaks("log",function(x) exp(x)), labels=trans_format("log",math_format(e^.x))) + scale_y_continuous(trans=log2_trans(), breaks=trans_breaks("log2",function(x) 2^x), labels=trans_format("log2",math_format(2^.x)))
散布図を使って、x軸・y軸の両方の軸に対数を使いましたが、
片方の軸だけに指定することもできます。
2010年以降は指数関数的に増えています。対数軸の出番です。
#y軸だけを対数軸にします。目盛りを指定します。 上のグラフ + scale_y_log10(breaks=c(2,10,50,250))
上のグラフより、変化が理解できますね。
対数軸の目盛り
対数軸に目盛りを追加するには、annotation_logticks()を使います。
ベースプロット + annotation_logticks() + scale_x_log10(breaks = 10^(-1:5), labels = trans_format("log10", math_format(10^.x))) + scale_y_log10(breaks = 10^(0:3), labels = trans_format("log10", math_format(10^.x)))
長い目盛り線が10の累乗、中間の長さの目盛り線が5の累乗を指しています。
プロットを見ると、目盛り記号の色(灰色?)と目盛り線の色(黒)が異なり、
補助目盛り線(薄い白い線)が5の累乗の位置からずれています。
目盛り記号の色と目盛り線の色を合わせるには、theme_bw()を使います。
ベースプロット + annotation_logticks() + scale_x_log10(breaks = 10^(-1:5), labels = trans_format("log10", math_format(10^.x))) + scale_y_log10(breaks = 10^(0:3), labels = trans_format("log10", math_format(10^.x))) + theme_bw()
目盛り記号の色と目盛り線の色が合いました!
補助目盛り線と5の累乗の位置を合わせるには、minor_breaks()を使います。
minor_breaks()の引数に、自身で計算した値を設定する必要があります。
x軸、y軸ともにlog10なので、log10(5*10^累乗値) ⇒ log10(5) + 累乗値 です。
ベースプロット + annotation_logticks() + scale_x_log10(breaks = 10^(-1:5), labels = trans_format("log10", math_format(10^.x)), minor_breaks = log10(5) + -2:5) + scale_y_log10(breaks = 10^(0:3), labels = trans_format("log10", math_format(10^.x)), minor_breaks = log10(5) + -1:3) + theme_bw() + coord_fixed()
補助目盛り線と、中間の5の累乗の位置が合いました!
今日の全部入り
ベースプロット + annotation_logticks() + scale_x_log10(breaks = 10^(-1:5), labels = trans_format("log10", math_format(10^.x)), minor_breaks = log10(5) + -2:5) + scale_y_log10(breaks = 10^(0:3), labels = trans_format("log10", math_format(10^.x)), minor_breaks = log10(5) + -1:3) + theme_bw() + coord_fixed() + theme(panel.border = element_blank(), axis.line = element_line(colour="grey60",size=.1,lineend="square"))
次回は、円形グラフを扱ってみます。