Mukku John Blog

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

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

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

ggplot2パッケージを利用して、軸を制御していきます。
今回は、軸の線を強調したり、対数軸を用いてみます。

軸の線の強調

こちらのグラフをベースにします。
f:id:MukkuJohn:20161024221725p:plain

x軸・y軸に線を引くためには、theme()を使い、axis.line引数を指定します。

#x軸・y軸に線を引き、強調する
ベースプロット + 
  theme(axis.line = element_line(colour="black"))

f:id:MukkuJohn:20161024221859p:plain
x軸・y軸に黒線が引かれ、くっきりしました。


プロット領域の境界線を持つ場合は、あえて消す指定を行う必要があります。
例えば、theme_bw()を使うような場合です。

ベースプロット + 
  theme_bw()

f:id:MukkuJohn:20161024222251p:plain

上のプロットのように、境界線がある場合は、ブランクを指定してから追加します。

#panel.border引数に、ブランクを指定します
#axis.line引数に、線を指定します
ベースプロット + theme_bw() +
  theme(panel.border = element_blank(),
        axis.line = element_line(colour="black"))

f:id:MukkuJohn:20161024222518p:plain

element_line()ですが、size引数で線の太さを指定できます。

ベースプロット + theme_bw() +
  theme(panel.border = element_blank(),
        axis.line = element_line(colour="black",size=4))

f:id:MukkuJohn:20161024222801p:plain

左下を見ると、微妙に開いています。
重ねて表示するためには、lineend引数にsquareを指定します。

ベースプロット + theme_bw() +
  theme(panel.border = element_blank(),
        axis.line = element_line(colour="black",size=4,lineend="square"))

f:id:MukkuJohn:20161024222811p:plain

対数

対数を使うと、軸上の距離が割合で表現できます。
今まで扱っていたのは、線形軸と呼びます。軸上の距離は一定の変化量です。

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)

f:id:MukkuJohn:20161024223532p:plain
これだと、体重や脳の重さが大きいデータポイントのせいで、軸が拡張され
ほとんどのデータポイントが左下に集まってしまっています。

このような場合、軸を対数軸に変更し、軸上の距離を割合で表現した方が良いです。
対数軸を使うには、scale_x_log10()scale_y_log10()を使います。

ベースプロット + 
  scale_x_log10() + scale_y_log10()

f:id:MukkuJohn:20161024224303p:plain
データの分布が見たいので、散布図を使っています。データポイントの値が見たいわけではないです。

scale_x_log10()scale_y_log10()を使うと、目盛りが自動で設定されます。
目盛りを指定するためには、breaks引数を指定します。

ベースプロット + 
  scale_x_log10(breaks=10^(-1:5)) + scale_y_log10(breaks=10^(0:3))

f:id:MukkuJohn:20161024224600p:plain

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)))

f:id:MukkuJohn:20161024225044p:plain

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)))

f:id:MukkuJohn:20161024225511p:plain

散布図を使って、x軸・y軸の両方の軸に対数を使いましたが、
片方の軸だけに指定することもできます。
f:id:MukkuJohn:20161024230110p:plain
2010年以降は指数関数的に増えています。対数軸の出番です。

#y軸だけを対数軸にします。目盛りを指定します。
上のグラフ +
  scale_y_log10(breaks=c(2,10,50,250))

f:id:MukkuJohn:20161024230150p:plain
上のグラフより、変化が理解できますね。

対数軸の目盛り

対数軸に目盛りを追加するには、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)))

f:id:MukkuJohn:20161024230649p:plain
長い目盛り線が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()

f:id:MukkuJohn:20161024232811p:plain
目盛り記号の色と目盛り線の色が合いました!

補助目盛り線と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()

f:id:MukkuJohn:20161024232436p:plain
補助目盛り線と、中間の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"))

f:id:MukkuJohn:20161024233110p:plain


次回は、円形グラフを扱ってみます。