少し前に、ggplot に二次変換された x 軸を追加することについて問い合わせたところ、Nate Pope が ggplot2 で説明されている優れた解決策を提供してくれました。
そのソリューションは私にとって非常にうまく機能し、新しいプロジェクトで機能することを期待して戻ってきました. 残念ながら、ソリューションは ggplot2 の最新バージョンでは正しく機能しません。ここで、まったく同じコードを実行すると、軸のタイトルが「クリッピング」され、目盛りとラベルが重なります。以下に例を示します。問題は青色で強調表示されています。
この例は、次のコードで再現できます (これは、以前に素晴らしく機能した Nate Pope のコードの正確なコピーです)。
library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
## 'base' plot
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Elevation,y=Day)) +
scale_x_continuous(name="Elevation (m)",limits=c(75,125)) +
ggtitle("stuff") +
theme(legend.position="none", plot.title=element_text(hjust=0.94, margin = margin(t = 20, b = -20)))
## plot with "transformed" axis
p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Elevation, y=Day))+
scale_x_continuous(name="Elevation (ft)", limits=c(75,125),
breaks=c(90,101,120),
labels=round(c(90,101,120)*3.24084) ## labels convert to feet
)
## extract gtable
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))
## overlap the panel of the 2nd plot on that of the 1st plot
pp <- c(subset(g1$layout, name=="panel", se=t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name=="panel")]], pp$t, pp$l, pp$b,
pp$l)
g <- gtable_add_grob(g1, g1$grobs[[which(g1$layout$name=="panel")]], pp$t, pp$l, pp$b, pp$l)
## steal axis from second plot and modify
ia <- which(g2$layout$name == "axis-b")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
## switch position of ticks and labels
ax$heights <- rev(ax$heights)
ax$grobs <- rev(ax$grobs)
ax$grobs[[2]]$y <- ax$grobs[[2]]$y - unit(1, "npc") + unit(0.15, "cm")
## modify existing row to be tall enough for axis
g$heights[[2]] <- g$heights[g2$layout[ia,]$t]
## add new axis
g <- gtable_add_grob(g, ax, 2, 4, 2, 4)
## add new row for upper axis label
g <- gtable_add_rows(g, g2$heights[1], 1)
g <- gtable_add_grob(g, g2$grob[[6]], 2, 4, 2, 4)
# draw it
grid.draw(g)
上記のコードを実行すると、解決しようとしている 2 つの重大な問題が発生します。
1)プロットの上部に追加された x 軸を調整して、「クリッピング」とオーバーラップの問題を修正するにはどうすればよいですか?
2)ggtitle("stuff")
最初のプロットに追加されp1
たものを最終プロットに含める方法は?
私は午後中ずっとこれらの問題を解決しようとしてきましたが、解決できないようです。どんな助けでも大歓迎です。ありがとう!