2016-03-01 6 views
6

Gibt es eine Möglichkeit, die Höhen/Längen der y-Achse für einzelne Facetten in facet_grid oder facet_wrap zu ändern?Anpassen des relativen Abstandes von Panels in einem Facettengitter/facet_wrap in ggplot2

Zum Beispiel

library(ggplot2) 
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + 
    geom_line() + 
    facet_grid(variable~., scales = "free_y") + 
    theme(strip.background = element_blank()) 

enter image description here

In der obigen Plot, würde ich die Pop-Zeitreihe y-Achse Höhe/Länge wie, sagen wir, doppelt so groß wie die uempmed y- zu sein Achsenlänge (2: 1), unabhängig davon, ob die beiden Zeitreihen unterschiedliche y-Achsenskalen haben.

Wie, was Kohske tut hier, in einer viel älteren Version von ggplot2, die nicht in ggplot funktioniert> = 2.0.0:

https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/

Ich weiß, dass ich das Argument angeben space = "free" in facet_grid , aber ich glaube nicht, dass dieses Argument verwendet werden kann, um ein 2: 1-Y-Achsen-Verhältnis festzulegen?

Ich möchte auch nicht eine "grid.arrange type" -Lösung für die Einrichtung separat erstellter ggplots verwenden (wo ich die 2 separaten Plots mit unterschiedlichen y-Achsenlängen machen kann), weil ich das am liebsten machen würde Verwendung von Shinys interaktiven ggplot2-Funktionen in diesem einen einzelnen facet_wrap Plot (zB ein interaktives glänzendes Facettenbeispiel mit einem Pinsel ist hier auf halbem Weg die Seite: http://shiny.rstudio.com/articles/selecting-rows-of-data.html).

+1

Haben Sie jemals eine Lösung für Ihr Problem gefunden? Ich frage, wie ich genau die gleiche Frage habe. Und was zu tun ist, wenn Sie 3 Gitter haben und Sie in einem Verhältnis (2, 1, 1) wollen. Es ist ziemlich einfach mit grid_extra und dem heights-Parameter zu arbeiten, aber sie sind nicht gut vertikal ausgerichtet. – Franky

+0

Leider noch nicht. Vielleicht gibt es einen Weg dazu, insbesondere mit den Updates zu ggplot2 im letzten Jahr oder so, aber ich bin mir dessen nicht bewusst. Meine Vermutung ist, dass es wahrscheinlich noch in der Quelle ggplot2 implementiert werden muss, die mir überhaupt nicht bekannt ist. – FXQuantTrader

Antwort

1

Es gibt mehrere Optionen.

Mit facets können Sie facet_grid(..., space='free_y') verwenden, um die Höhe jeder Zeile an die Länge der y-Skala anzupassen. In Ihrem Datensatz wird jedoch die untere Zeile auf eine einzige Zeile minimiert (0-25 vs. 200.000 - 320.000).

Wenn ggplot2 Objekte geplottet/gedruckt werden, werden sie zuerst in gtable Objekte konvertiert. Speichern Sie Ihr Diagramm als , können wir ggplotGrob aufrufen, um das Gtable-Objekt zu erhalten. Dies ist eine einseitige Prozedur; Nach der Konvertierung können Sie den gtable nicht wieder in ein ggplot2-Objekt konvertieren!

(g <- ggplotGrob(p)) 
TableGrob (12 x 8) "layout": 18 grobs 
    z   cells  name         grob 
1 0 (1-12, 1- 8) background  rect[plot.background..rect.3766] 
2 1 (6- 6, 4- 4) panel-1-1    gTree[panel-1.gTree.3696] 
3 1 (8- 8, 4- 4) panel-1-2    gTree[panel-2.gTree.3711] 
4 3 (5- 5, 4- 4) axis-t-1       zeroGrob[NULL] 
5 3 (9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.3725] 
6 3 (6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.3733] 
7 3 (8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.3741] 
8 3 (6- 6, 6- 6) axis-r-1       zeroGrob[NULL] 
9 3 (8- 8, 6- 6) axis-r-2       zeroGrob[NULL] 
10 2 (6- 6, 5- 5) strip-r-1       gtable[strip] 
11 2 (8- 8, 5- 5) strip-r-2       gtable[strip] 
12 4 (4- 4, 4- 4)  xlab-t       zeroGrob[NULL] 
13 5 (10-10, 4- 4)  xlab-b titleGrob[axis.title.x..titleGrob.3714] 
14 6 (6- 8, 2- 2)  ylab-l titleGrob[axis.title.y..titleGrob.3717] 
15 7 (6- 8, 7- 7)  ylab-r       zeroGrob[NULL] 
16 8 (3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.3763] 
17 9 (2- 2, 4- 4)  title  zeroGrob[plot.title..zeroGrob.3762] 
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.3764] 

Alle Elemente sind in einem gitterartigen Layout angeordnet. Die Höhe jeder Zeile in dem Layout wird durch g$heights gegeben:

> g$heights 
[1] 5pt     0cm     0cm     0cm     0cm     1null    5pt     1null    0.396281911581569cm 1grobheight   
[11] 0cm     5pt  

Spiel der Koordinate des ‚Panel-1-1‘ und ‚Panel-1-2‘ zu diesen Höhen, und Sie werden die sechste finden und 8. Element sind beide 1null. Sie können sie in jede Einheit, cm, in, pt, ... ändern. Die 1null ist einfach das, was nach den anderen Elementen übrig ist, und wird unter ihnen aufgeteilt. So können wir den 6.en heigth zu 2null (man beachte die doppelten eckigen Klammern Verwendung) ändern:

> g$heights[[6]] <- unit(2, 'null') 
> grid.draw(g) 

enter image description here

+0

Danke, ich kenne diesen Ansatz für die Erstellung von ggplots (ich erwähnte die Lösungen vom Typ 'grid.arrange' in der Frage). Aber ich glaube nicht, dass dies tatsächlich meine spezifische Frage beantwortet ... Ich möchte schließlich die y-Achse in facet_wrap anpassen können, damit ich die interaktiven ggplot2-Diagramme innerhalb von Shiny verwenden kann ... Siehe das Beispiel mit gebürsteten Punkten mit die 'facet_wrap' im ersten audio link habe ich in der frage. Ich bin mir nicht bewusst, dass so etwas mit den 'grob's – FXQuantTrader

+0

überhaupt möglich ist. Es ist unklar, wie brushedPoints funktioniert; Meine Vermutung ist, dass es die einzelnen Punkte im Diagramm nicht erkennt, sondern die abgedeckten x- und y-Koordinaten extrapoliert und einen beliebigen Punkt aus dem gegebenen Datenrahmen zurückgibt, der in die Region fällt. Beachten Sie, dass die Funktion data.frame nicht aus dem ggplot-Objekt liest, sondern explizit angegeben werden muss. Zusätzlich müssen Sie angeben, welche Facetten verwendet werden. Sie werden viel Arbeit für Sie haben, wenn Sie versuchen, diese beiden Funktionen in der Art und Weise zu kombinieren, wie Sie es versuchen; Versuchen Sie stattdessen, zwei separate Ausgabe-Plot-Gadgets zu verwenden. – MrGumble