Некоторое время назад я спросил о добавлении вторичной трансформированной оси x в ggplot, а Nate Pope предоставил превосходное решение, описанное в ggplot2: добавление вторичной трансформированной оси x поверх сюжет.
Это решение отлично поработало для меня, и я вернулся к нему, надеясь, что это сработает для нового проекта. К сожалению, решение не работает корректно в последней версии 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)
Запуск вышеуказанного кода приводит к двум критическим проблемам, которые я пытаюсь решить:
1) Как настроить ось x, добавленную в верхнюю часть графика, чтобы исправить проблемы "отсечения" и перекрытия?
2) Как включить ggtitle("stuff")
в первый график p1
в последнем графике?
Я пытаюсь решить эти проблемы весь день, но, похоже, не могу их решить. Буду признателен за любую оказанную помощь. Спасибо!