Vor einiger Zeit erkundigte ich mich nach dem Hinzufügen einer sekundären transformierten X-Achse in ggplot, und Nate Pope lieferte die ausgezeichnete Lösung, die unter ggplot2: Adding secondary transformed x-axis on top of plot beschrieben wird.ggplot2 2.1.0 hat meinen Code zerstört? Die sekundär transformierte Achse erscheint nun falsch
Diese Lösung funktionierte gut für mich, und ich kehrte zu der Hoffnung zurück, dass es für ein neues Projekt funktionieren würde. Leider funktioniert die Lösung nicht korrekt in der neuesten Version von ggplot2. Jetzt führt der exakt gleiche Code zu einem "Clipping" des Achsentitels, sowie Überlappung der Teilstriche und Beschriftungen. Hier ist ein Beispiel, mit den Problemen in blau hervorgehoben:
Dieses Beispiel kann mit dem folgenden Code wiedergegeben werden (dies ist eine exakte Kopie von Nate Papst Code, der zuvor wunderbar gearbeitet):
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)
den obigen Code Laufen führt zu zwei kritischen Problemen, die ich zu lösen versuchen:
1) Wie die x-Achse auf die Oberseite des p hinzugefügt einzustellen viel, um die "Clipping" und Überlappungsprobleme zu beheben?
2) Wie sind die ggtitle("stuff")
mit dem ersten Grundstück p1
in dem letzten Plot hinzugefügt?
Ich habe versucht, diese Probleme den ganzen Nachmittag zu lösen, aber kann nicht scheinen, sie zu lösen. Jede Hilfe wird sehr geschätzt. Vielen Dank!