まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

lemonパッケージでggplotをいい感じに見せる

ggplotをきれいに見せるパッケージlemonを動かしたので紹介。

基本的に公式ベース

github.com

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

f:id:chito_ng:20200429024759p:plain

これに対してfacet_wrapをすると以下のようになる。

g + facet_wrap(~gear, ncol=2, label=label_both)

f:id:chito_ng:20200429024903p:plain

このとき、軸を左端、下端と共有できる部分(軸と目盛り)は省略される。このとき、表示する図の数が多くなるほど非表示になっている図では目盛りが読み取りづらくなる。

lemonでは、facet_rep_xxx(wrap or grid)を使うことで軸と目盛りの省略をなくせる。なお、デフォルトでは目盛りは省略されたままなのでrepeat.tick.labelsTRUEにする必要がある。

library(lemon)

g + facet_rep_wrap(~gear, ncol=2, label=label_both, repeat.tick.labels = TRUE)

f:id:chito_ng:20200429025338p:plain

point + line (+ path)

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

f:id:chito_ng:20200429025902p:plain

こいうときはgeom_pointgeom_lineで共通の設定を使うと思うが変更が発生したときに2つとも修正するのはめんどいし、jitterのような乱数ベースのものを使うと同じ状態にすることは難しい。例えば、以下はgeom_pointgeom_lineが別々にjitterでずらしているため、ずらす位置が合わずに点と線がうまくつながっていない。

g + 
  geom_point(position=position_jitter(0.1,0.1)) +
  geom_line(position=position_jitter(0.1,0.1))

f:id:chito_ng:20200429030317p:plain

lemonではgeom_pointgeom_lineを複合した1つの関数geom_pointlineを提供することで、共通の設定を使える。

g + 
  geom_pointline(position=position_jitter(0.1,0.1))

f:id:chito_ng:20200429030504p:plain

ちなみに、geom_pointgeom_pathを複合したgeom_pointpathも提供している。

凡例の操作

以下のようなデータの凡例位置を図内の左上に入れたい。

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]

d <- ggplot(dsamp, aes(carat, price)) +
  geom_point(aes(colour = clarity))

これは過去記事で書いたように、themeで直接おこなうが指定が面倒&直感的じゃないのでだるい。

knknkn.hatenablog.com

d + 
  theme(legend.position = c(0,1),
        legend.justification=c(0,1))

f:id:chito_ng:20200429030840p:plain

lemonでは、reposition_legendを使うことで指定が可能になる。

reposition_legend(d, 'top left')

f:id:chito_ng:20200429030840p:plain

凡例の共有

同じデータに対していろいろな軸でデータをみせるときに図をマージする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)

f:id:chito_ng:20200429031244p:plain

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)

f:id:chito_ng:20200429031324p:plain

lemonでは、grid_arrange_shared_legendを使うことで共通の色に対して1つの凡例を表示することができる。

grid_arrange_shared_legend(p1, p2, p3, p4, ncol = 2, nrow = 2)

f:id:chito_ng:20200429031434p:plain

ちなみに、これはおそらく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)

f:id:chito_ng:20200429032006p:plain