ggplot2
のsec.axis
を使ってみた.
https://whatalnk.github.io/r-tips/ggplot2-secondary-y-axis.nb.htmlwhatalnk.github.io
流れとしては,
- 第二軸としてプロットするデータを第一軸の範囲に合わせてスケールしてプロットする
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軸のタイトルを共有,点線を上から下まで重ねて書く,ということをした.
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)
このとき,t
,l
,b
,r
で指定する範囲は,gtable
(rbind()
した結果のやつ)を目視確認して決めた(ここでは20×7).