2016-05-16 3 views
2

Nutzen Sie die folgende Plotten Code:ggplot Gitter mit konstantem x-Achsen-Skala, aber variierender Achsgrenzen

library(ggplot2) 
library(cowplot) 
a <- data.frame(a1=1:10, a2=1:10) 
b <- data.frame(b1=1:5, b2=2*(1:5)) 
aplot <- ggplot(a, aes(x=a1, ymin=0, ymax=12)) + 
    geom_line(aes(y=a2)) 
bplot <- ggplot(b, aes(x=b1, ymin=0, ymax=12)) + 
    geom_line(aes(y=b2)) 
plot_grid(aplot,bplot, ncol=2) 

Es ergibt zwei Seite-an-Seite Plots von identischen Abmessungen zu ähnlichen Linien. Aber die X-Achsenskalen sind ziemlich unterschiedlich. Tatsächlich hat die zweite Linie die doppelte Steigung des ersten.

Ich bin auf der Suche nach einer Möglichkeit, diese Figur so zu plotten, dass die Breite eines Diagramms durch die Grenzen seiner x-Achse skaliert wird, so dass die Neigungen visuell verglichen werden können. Die tatsächlichen Plots, die ich visualisieren möchte, sind fünf an der Zahl, und es werden keine y-Achsen-Beschriftungen mit Ausnahme der am weitesten links liegen. Ich kann grid.arrange() verwenden, um sie alle in einer Reihe mit den Breiten zu plotten, die ich will, aber das Problem ist, dass ich nicht weiß, welche Breite jeder Platte zugewiesen werden muss, um sicherzustellen, dass sie richtig herauskommen (die Breite der Platte muss groß genug sein) um die Plot-Ränder, die Y-Achsen-Tick-Markierungen und den Y-Achsen-Text anzupassen). Ich kann die Ränder selbst einstellen und sie in meinen Feldbreiten berücksichtigen, aber ich kann keinen guten Weg finden, um herauszufinden, wie breit (z. B. in cm) der y-Achsen-Text ist.

+0

Hm, was ist, wenn wir die x-Achse Maximalpunkt als das gleiche für die beiden Grundstücke eingestellt? Es ist anders als Ihre ursprüngliche Absicht, aber wir können immer noch die verschiedenen Steigungen vergleichen – zyurnaidi

+2

klingt wie mit facetting und space = "free" wäre eine bessere Option – baptiste

+0

@zyurnaidi In dem Fall habe ich es mit (versuchen, eine Figur für ein Papier zu machen), wäre es eine unakzeptable Platzverschwendung, die maximale x-Achsen-Spannweite in jeder Platte zu verwenden, wenn mehrere Platten nur ein Viertel der maximalen Reichweite überspannen. –

Antwort

0

Sie können die Option rel_widths in plot_grid verwenden, um dies zu erreichen. Sie müssen die relative Größe berechnen, die jedes Plot das Verhältnis der Bereiche xmax-xmin jedes Panels verwenden soll. Aber es gibt einen zusätzlichen Fang. rel_widths legt die relative Breite des gesamten Panels einschließlich der Ränder fest. Daher müssen wir auch die Margen bei der Berechnung der relativen Größe berücksichtigen. Im folgenden Code wird dazu ein Offset-Wert von 2 zum Zähler und Nenner von relative.size hinzugefügt. Beachten Sie jedoch, dass sich dieser Versatzwert ändern kann, wenn Sie die Größe der Ränder ändern.

aplot <- ggplot(a, aes(x=a1, ymin=0, ymax=12, xmin=0, xmax=max(a$a1))) + 
    geom_line(aes(y=a2)) 

bplot <- ggplot(b, aes(x=b1, ymin=0, ymax=12, xmin=0, xmax=max(b$b1))) + 
    geom_line(aes(y=b2)) 

relative.size <- (2+max(b$b1))/(2+max(a$a1)) # the addition of 2 here is to account for the plot margins 
plot_grid(aplot,bplot, ncol=2, rel_widths=c(1,relative.size), align = "h") 

gibt

enter image description here

+0

übergeben. Ich bin hier vielleicht offline, aber ich glaube, dass es ein zusätzliches bisschen Buchhaltung gibt, die erledigt werden muss. Jenseits der X-Grenzen haben diese Plots Ränder (die wir wie angegeben steuern können), aber sie haben auch einen Axistext. Wie breit ist "12.5"? Die Antwort hängt von der Schriftgröße und auch von der Schriftart ab, und im Allgemeinen glaube ich nicht, dass es einfach ist, zu bestimmen, wie breit der Satz "12.5" ist (es ist auch notwendig, die Länge des Teilstrichs zurückzusetzen, aber das ist leichter). Liege ich damit falsch? –

+0

@JacobSocolar du hast Recht. Ich bin mir nicht sicher, wie ich diese Berechnung automatisch machen soll - lassen Sie mich darüber nachdenken. Wenn Sie nur wenige Diagramme zu bearbeiten haben, können Sie die Breite der Ticks plus Beschriftungen in X-Achsen-Einheiten manuell messen. In der Zwischenzeit lasse ich diese Antwort, da sie nahe an dem ist, was Sie wollen und anderen als einen Ansatz nützlich sein kann. Wenn ich herausfinden möchte, wie diese Berechnung zu automatisieren ist, werde ich diese Antwort aktualisieren. – dww

Verwandte Themen