金魚亭日常

読書,ガジェット,競技プログラミング

ggplot2 で 二軸グラフ

ggplot2sec.axis を使ってみた.

f:id:what_alnk:20161128225355p:plain

https://whatalnk.github.io/r-tips/ggplot2-secondary-y-axis.nb.htmlwhatalnk.github.io

流れとしては,

  1. 第二軸としてプロットするデータを第一軸の範囲に合わせてスケールしてプロットする
  2. scale_y_continuous() の引数 sec.axisで第一軸を第二軸の範囲にスケールする

という二段階.

今回の例では,気温を第一軸としてgeom_line()geom_point()で描画し,降水量を第二軸としてgeom_bar()で描画した.

第一軸の範囲に負の値が含まれているときは注意が必要で,geom_bar()を使うと0からしか棒が描画されないので,geom_segment()を使った.

あと,月の名前の省略形を英語で出したかったので,lubridate::month() を使って,

scale_x_date(name = "Month", 
  breaks = seq.Date(as.Date("2015-01-01"), as.Date("2015-12-31"), by = "1 month"), 
  labels = function(date){return(month(date, label = TRUE))})

という感じにした.


で,そうしてできた二つのグラフをくっつけてX軸を共有,Y軸のタイトルを共有,点線を上から下まで重ねて書く,ということをした.

f:id:what_alnk:20161128225433p:plain

https://whatalnk.github.io/r-tips/ggplot2-rbind.nb.htmlwhatalnk.github.io

X軸を共有してくっつける際に,上のグラフのX軸を消去した分だけ描画エリアの高さが増えてしまうことを回避するために,

rbind(ggplotGrob(gp1), ggplotGrob(gp2), size = "last")

とした.

Y軸のタイトルを共有するために,

grid.arrange(gt, 
  left = textGrob(label = expression("Temperature ("~degree~"C)"), rot = 90), 
  right = "Precipitation (mm)")

とした. expression()を渡すときは,grid::textGrob() で渡す.

点線を上から下まで重ねて書くのは,grid::segmentsGrob()を作って,それをgtable::gtable_add_grob()を使ってグラフに追加した.

gp12 <- rbind(ggplotGrob(gp1), ggplotGrob(gp2), size = "last")
gtable_add_grob(gp12, 
  segmentsGrob(x0 = 0.455, x1 = 0.455, y0 = 0.1, y1 = 0.98, gp=gpar(lty="dashed")), 
  t = 1, l = 1, b = 20, r = 7, z = 1)

このとき,tlbrで指定する範囲は,gtablerbind()した結果のやつ)を目視確認して決めた(ここでは20×7).