ggplot2: Dodanie wtórnej transformowanej osi x na górze wykresu

[ Edytuj kwiecień 2016: rozwiązanie w tym wątku nie wyświetla już poprawnie dodanej osi - został otwarty nowy wątek w tej sprawieggplot2 2.1.0 złamał mój kod? Drugorzędna oś przekształcona pojawia się teraz nieprawidłowo ]

Pracuję ze skalowanymi danymi x i muszę dodać nieskalowaną oś x do górnej części wykresu, aby ułatwić interpretację. Natknąłem się na podejście do dodawania drugiej osi Y wJak mogę umieścić przekształconą skalę po prawej stronie ggplot2?. Jednak nie mogę sprawić, by działał poprawnie dla osi x. Jestem pewien, że nie rozumiem jakiejś części kodu, ale nie mogę zrozumieć, co to jest. Próbowałem zajrzeć do plików pomocy ggplot2, a także książki Wickham ggplot2: Elegancka grafika do analizy danych, ale jeśli ktoś może wskazać mi odpowiednią dokumentację, naprawdę bym to docenił!

Pracuję z danymi o temperaturze, ale użyję danych z jeziora z powyższego linku, ponieważ kod został do tego napisany. Oto kod pocztowy z tego linku:

library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Day,y=Elevation)) + 
      scale_y_continuous(name="Elevation (m)",limits=c(75,125))

p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Day, y=Elevation))+
    scale_y_continuous(name="Elevation (ft)", limits=c(75,125),           
    breaks=c(80,90,100,110,120),
             labels=c("262", "295", "328", "361", "394"))

#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)

ia <- which(g2$layout$name == "axis-l")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)

# draw it
grid.draw(g)

Aby przetestować metodę dodawania osi X zamiast osi Y, zmieniłem osie x i y i zmieniłemaxis-l doaxis-b dawać:

library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Elevation,y=Day)) + 
scale_x_continuous(name="Elevation (m)",limits=c(75,125))

p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Elevation, y=Day))+
scale_x_continuous(name="Elevation (ft)", limits=c(75,125),           
                   breaks=c(80,90,100,110,120),
                   labels=c("262", "295", "328", "361", "394"))

#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)

ia <- which(g2$layout$name == "axis-b")
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths)
ax$grobs <- rev(ax$grobs)
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)

# draw it
grid.draw(g)

Daje to nową oś x, ale jest kilka problemów: 1) znajduje się w środku wykresu 2) nie tworzy nowej etykiety x dla „Elevation (ft)”

Potrzebuję osi, aby pojawiła się na górze wykresu i potrzebuję powiązanej etykiety osi. Czy ktoś może mi powiedzieć, co robię źle?

Ponadto, jak wspomniano powyżej, pracuję ze skalowanymi danymi temperatury, więc idealnie kleszcze nie byłyby wyrównane na górnej i dolnej osi, tak jak w tym przykładzie. Czy jest jakiś sposób, aby to zrobić w ggplot2? Dowolny przykład z sieci to:

questionAnswers(1)

yourAnswerToTheQuestion