lemonパッケージでggplotをいい感じに見せる
ggplot
をきれいに見せるパッケージlemon
を動かしたので紹介。
基本的に公式ベース
facetしたときの軸目盛りの明示
以下のようなデータがあるとする。
library(tidyeval) g = mtcars %>% # ggplot(aes(wt, mpg)) + ggplot(aes(wt, mpg, color = factor(gear))) + geom_point() + theme_light() + theme(panel.border=element_blank(), axis.line = element_line())
これに対してfacet_wrap
をすると以下のようになる。
g + facet_wrap(~gear, ncol=2, label=label_both)
このとき、軸を左端、下端と共有できる部分(軸と目盛り)は省略される。このとき、表示する図の数が多くなるほど非表示になっている図では目盛りが読み取りづらくなる。
lemon
では、facet_rep_xxx(wrap or grid)
を使うことで軸と目盛りの省略をなくせる。なお、デフォルトでは目盛りは省略されたままなのでrepeat.tick.labels
をTRUE
にする必要がある。
library(lemon) g + facet_rep_wrap(~gear, ncol=2, label=label_both, repeat.tick.labels = TRUE)
point + line (+ path)
geom_point
とgeom_line
を組み合わせた折れ線グラフを作ることはよくあると思う。
g = mtcars %>% ggplot(aes(wt, mpg, color = factor(cyl))) + theme_light() + theme(panel.border=element_blank(), axis.line = element_line()) g + geom_point() + geom_line()
こいうときはgeom_point
とgeom_line
で共通の設定を使うと思うが変更が発生したときに2つとも修正するのはめんどいし、jitter
のような乱数ベースのものを使うと同じ状態にすることは難しい。例えば、以下はgeom_point
とgeom_line
が別々にjitterでずらしているため、ずらす位置が合わずに点と線がうまくつながっていない。
g + geom_point(position=position_jitter(0.1,0.1)) + geom_line(position=position_jitter(0.1,0.1))
lemon
ではgeom_point
とgeom_line
を複合した1つの関数geom_pointline
を提供することで、共通の設定を使える。
g + geom_pointline(position=position_jitter(0.1,0.1))
ちなみに、geom_point
とgeom_path
を複合したgeom_pointpath
も提供している。
凡例の操作
以下のようなデータの凡例位置を図内の左上に入れたい。
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] d <- ggplot(dsamp, aes(carat, price)) + geom_point(aes(colour = clarity))
これは過去記事で書いたように、themeで直接おこなうが指定が面倒&直感的じゃないのでだるい。
d + theme(legend.position = c(0,1), legend.justification=c(0,1))
lemon
では、reposition_legend
を使うことで指定が可能になる。
reposition_legend(d, 'top left')
凡例の共有
同じデータに対していろいろな軸でデータをみせるときに図をマージするpatchwork
が便利。
ただし、このとき凡例を全て表示する/しないの0/1か、見た目は悪いが1つだけ表示して他は表示しない、のようなやり方になる。
library(patchwork) p1 <- qplot(carat, price, data = dsamp, colour = clarity) p2 <- qplot(cut, price, data = dsamp, colour = clarity) p3 <- qplot(color, price, data = dsamp, colour = clarity) p4 <- qplot(depth, price, data = dsamp, colour = clarity) (p1+p2)/(p3+p4)
p1 <- qplot(carat, price, data = dsamp, colour = clarity) + theme(legend.position = 'left') p2 <- qplot(cut, price, data = dsamp, colour = clarity) + theme(legend.position = 'none') p3 <- qplot(color, price, data = dsamp, colour = clarity) + theme(legend.position = 'none') p4 <- qplot(depth, price, data = dsamp, colour = clarity) + theme(legend.position = 'none') (p1+p2)/(p3+p4)
lemon
では、grid_arrange_shared_legend
を使うことで共通の色に対して1つの凡例を表示することができる。
grid_arrange_shared_legend(p1, p2, p3, p4, ncol = 2, nrow = 2)
ちなみに、これはおそらく1つ目に指定した図の凡例のみ使うだけっぽい?
試しに、別データ(別凡例)のデータを混ぜると以下のようになる。理想としては、この4グラフの全色を表示してほしいが1つ目の図の凡例のみ表示されている。
plot_line = mtcars %>% ggplot(aes(wt, mpg, color = factor(cyl))) + theme_light() + theme(panel.border=element_blank(), axis.line = element_line()) + geom_pointline(position=position_jitter(0.1,0.1)) grid_arrange_shared_legend(plot_line, p1, p2, p3, ncol = 2, nrow = 2)