2014-07-23 8 views
5

See Grundstück hier:ggplot2, zwei Skalen auf die gleiche Parzelle anwenden? Von oben nach unten BarPlot

enter image description here (von here)

Wie vermehren ich sowohl den oberen und unteren Teil der BarPlot ggplot2 mit?

Zum Beispiel kann ich den oberen Abschnitt mit

ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + scale_y_reverse() 

jedoch jetzt produzieren, wenn ich andere geom_ hinzuzufügen, wie beispielsweise einer anderen geom_bar() Die Skala für y umgekehrt wird. Ist es möglich, die scale_y_reverse() nur auf eine bestimmte geom_ anzuwenden?

Antwort

4

ggplot möchte nur eine y-Achsenskala haben. Am einfachsten wäre es, wenn Sie Ihre Daten grundlegend ändern. Hier können wir geom_rect verwenden, um die Daten dorthin zu zeichnen, wo immer wir möchten, und wir können sie auf Gruppenzeit konditionieren. Hier ist ein Beispiel

#sample data 
dd<-data.frame(
    year=rep(2000:2014, 2), 
    group=rep(letters[1:2], each=15), 
    count=rpois(30, 20) 
) 

Und jetzt können wir es plotten. Aber zunächst wollen wir die in den oberen Balken versetzt definieren, indem die Maxima Höhe in einem Jahr zu finden, und das Hinzufügen von ein wenig Platz

height <- ceiling(max(tapply(dd$count, dd$year, sum))*1.10) 

Und hier ist, wie wir

ggplot(dd) + 
    geom_rect(aes(xmin=year-.4, xmax=year+.4, 
    ymin=ifelse(group=="a", 0, height-count), 
    ymax=ifelse(group=="a", count, height), fill=group)) + 
    scale_y_continuous(expand=c(0,0)) 

plotten Und das wird uns

enter image description here

+0

Sehr klug Hack! – Vlo

8

Eine weitere Option ist zwei getrennte Parzellen zu machen und sie mit arrangeGrob aus dem Gride kombinieren xtra Paket. Nachdem Sie mit den Grundstücksrändern gespielt haben, können Sie etwas erreichen, das anständig aussieht.

library(gridExtra) 
library(ggplot2) 

set.seed(100) 
p2 <- ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + theme(plot.margin=unit(c(0,0,0,0), 'lines')) 
p1 <- p2 + scale_y_reverse() + 
    theme(plot.margin=unit(c(0, 0, -.8, 0), 'lines'), axis.title.x=element_blank(), 
      axis.text.x=element_blank(), axis.ticks.x=element_blank()) 

p <- arrangeGrob(p1, p2) 
print(p) 

enter image description here

+0

phantom downvoter! Nennen Sie Ihren Namen und erklären Sie sich selbst! –