2016-06-15 7 views
5

Ich möchte jeder Zeile eines einspaltigen, facettenumwickelten Plots in R eine benutzerdefinierte Breite zuweisen. (Ich weiß, dass dies kein Standard ist .ggplot2: Weisen Sie jeder Zeile eines facet_grid/facet_wrap Plots eine eigene Breite zu

group1 <- seq(1, 10, 2) 
group2 <- seq(1, 20, 3) 
x = c(group1, group2) 
mydf <- data.frame (X =x , Y = rnorm (length (x),5,1), 
        groups = c(rep(1, length (group1)), rep(2, length(group2)))) 

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point() 
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point() 

grid.arrange(plot1, plot2, heights=c(1,2)) 

der obige Code gibt jede Zeile des Diagramms eine einzigartige Höhe::

)

mit grid.arrange kann ich eine eindeutige Höhe zu jeder Reihe von einer Facette umwickelte wie Plot mit dem folgenden Ausschnitt zuweisen

enter image description here

Ich frage mich, ob es möglich ist, eine eindeutige Breite zu jeder Zeile des Diagramms zuweisen, anstatt eine eindeutige Höhe zu jeder Zeile zuweisen. Ist das überhaupt möglich mit jeder ggplot2-Erweiterung?

+1

Was planen Sie mit den Breiten zu tun? Möchten Sie in jeder Zeile weitere Diagramme hinzufügen oder dient dies visuellen Zwecken? Eine Idee könnte sein, jeder Parzelle Ränder hinzuzufügen. Etwas wie: 'plot1 <- ggplot (mydf, aes (X, Y)) + geom_point() + theme (plot.margin = Einheit (c (1,10,1,1)," Linien "))' where the '10' in der' plot.margin' wäre Ihr rechter Rand und könnte als Ihre Breite angesehen werden. –

+0

Dank @MikeyMike im Wesentlichen das Ziel ist, dass die x-Achsen jeder Facette n Einheiten haben, wobei n die Anzahl der Beobachtungen für diese Facette ist. Jede Einheit sollte durch eine konsistente Menge an Raum repräsentiert sein, so dass Facetten, die mehr Beobachtungen sichtbar machen, physikalisch längere x-Achsen haben sollten. Der Randtrick kann funktionieren, wenn ich die Breite jeder Facette als Funktion ihrer Länge relativ zur maximalen Länge festlege! Ich werde das versuchen ... – duhaime

+0

@MikeyMike Weißt du, wo man Dokumentation über die verfügbaren Einheiten für 'plot.margin' finden kann? Ich bete, dass es etwas in der Art von Prozent gibt, aber Angst wird es nicht geben. – duhaime

Antwort

2

Ja, dies ist möglich, wenn Sie die Funktion plot.margin im ggplot theme() verwenden. Sie können jede Parzelle Breite als Prozentsatz der Gesamtlänge der Seite gesetzt, indem Sie:

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme(plot.margin = unit(c(0.01,0.5,0.01,0.01), "npc")) 
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme(plot.margin = unit(c(0.01,0.2,0.01,0.01), "npc")) 

Wenn wir npc s als unsere Einheit von Interesse in dem plot.margin Aufruf verwenden, setzen wir auf die Seitenbreite relativ. Die 0.5 und 0.2 entsprechen dem rechten Rand. Wie npc steigt, desto kleiner wird Ihre Handlung erhalten.

grid.arrange(plot1, plot2, heights=c(1,2)) 

enter image description here

2

Als weitere Option können Sie nullGrob (ein leeres grob, den Platz in Anspruch nimmt nur) verwenden horizontalen Raum in einer bestimmten Zeile zu vergeben. Zum Beispiel:

library(gridExtra) 
library(grid) 

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point() 
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point() 

grid.arrange(arrangeGrob(plot1, nullGrob(), widths=c(1,1)), 
      plot2, heights=c(1,2)) 

enter image description here

+0

oder 'grid.arrange (p1, p2, Layoutmatrix = Matrix (c (1,2, NA, 2), 2))' – baptiste

+0

Dank @baptiste . – eipi10

Verwandte Themen