2014-08-30 7 views
5

R-3.1.1, Win7x64verwirrt durch xlim/ylim Verhalten in R

Hallo, ich habe Daten, bei denen zwei Variablen, wie gemessen werden, dass X von 0 bis 70 läuft und Y läuft von 0 bis 100. Ich möchte um ein einfaches Streudiagramm der Beobachtungen zu erstellen. Das Streudiagramm sollte so dimensioniert werden, dass die x-Achse (von 0-70) 0,7 der Größe der y-Achse (von 0-100) entspricht.

Ich verwende den folgenden Code

plot.new() 
plot(0, 0, asp = 1, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", type = "n") 

Ich bin überrascht zu sehen, dass dies ein Diagramm ergibt sich wie folgt: enter image description here

Zwei Dinge sind nicht, wie ich es erwartet: 1) die x-Achse und die y-Achse sind NICHT auf ihre xlim- und ylim-Werte beschränkt. (Warum ist das?) Und 2) die Figur ist fast quadratisch.

Ich kann die Größe manuell ändern, indem ich das R-Fenster oder das Rstudio-Fenster vor der Verwendung des Codes manuell skaliere, aber das ist nicht machbar, weil ich sehr viele Figuren zeichnen muss, viele mit variierenden xlim- und Ylim-Größen Diese Zahlen müssen später in vorformatierte Berichte eingefügt werden (daher müssen sie genau diese Layoutanforderungen erfüllen). Ich habe auch versucht

dev.new(width = 7, height = 10) 

verwenden, aber das hat auch nicht geholfen.

Meine Frage ist: 1) Wie kann ich die Figur "zwingen", auf die exakten xlim und ylim Bereiche beschränkt zu werden, die an die Funktion übergeben werden? und 2), wie eine Figur mit den genauen relativen Abmessungen (die x-Achse ist 0,7-mal so breit wie die Länge der y-Achse)

Antwort

5

die Diskussion über asp in der Hilfe für plot.window impliziert, dass aspxlim und ylim Einstellungen außer Kraft setzen wird (wenn Sie für plot auf die Hilfe suchen, ist es Ihnen plot.window lenkt mehr über asp, um herauszufinden,):

Wenn asp ein endlicher positiver Wert ist, dann wird das Fenster so eingerichtet ist, dass eine Dateneinheit in der x-Richtung in der Länge asp * ein Datum Einheit in der y-Richtung gleich ist.

Beachten Sie, dass in diesem Fall wird par("usr") nicht mehr durch, zum Beispiel par("xaxs"), sondern vielmehr durch asp und das Seitenverhältnis des Geräts. (Siehe , was passiert, wenn Sie interaktiv die Plotvorrichtung der Größe nach das Beispiel unten läuft!)

Der Sonderfall asp == 1 erzeugen Flächen, auf denen Abstände zwischen Punkten sind genau auf dem Bildschirm dargestellt. Werte mit asp > 1 können verwendet werden, um genauere Karten zu erzeugen, wenn Breitengrad und Längengrad verwendet werden.

Wie @ mr.joshuagordon erwähnt, können Sie die pdf (oder png oder jpeg wenn Sie Bitmap ausgegeben werden soll) Funktion und mit den Abmessungen spielen das Seitenverhältnis erhalten Sie wollen, während das Entfernen des asp Argument von plot Damit können Sie die Werte xlim und ylim einstellen.

Eine weitere Möglichkeit ist ggplot2 zu wechseln, das macht es einfach separat Achsgrenzen und Seitenverhältnis einzustellen:

library(ggplot2) 

# Some fake data 
dat = data.frame(x=c(2,30,50), y=c(10, 60, 90)) 

# 1 y-unit = 1 x-unit, so the plot area is not square 
ggplot(dat, aes(x,y)) + 
    geom_point() + 
    scale_x_continuous(limits=c(0,70)) + 
    scale_y_continuous(limits=c(0,100)) + 
    coord_fixed(ratio=1) 

# 1 y-unit = 0.7 * 1 x-unit, so the plot is square, but the physical distance 
# of each x-unit and y-unit are no longer the same 
ggplot(dat, aes(x,y)) + 
    geom_point() + 
    scale_x_continuous(limits=c(0,70)) + 
    scale_y_continuous(limits=c(0,100)) + 
    coord_fixed(ratio=70/100) 

UPDATE: Hier ist, wie xlim zu steuern, ylim und das Seitenverhältnis unabhängig in der Basis graphics: Verwenden Sie anstelle von asp den grafischen Parameter pin, um die physischen Abmessungen der Zeichnungsregion festzulegen. Diese Einstellung hat keinen Einfluss auf die Nennwerte von xlim und ylim, ändert jedoch den physikalischen Abstand von 1 x-Einheit und 1 y-Einheit. Hier sind einige Beispiele:

Beispiel 1: Wir zwei Platten auf einer PDF-Seite erstellen werden, die jeweils mit einem anderen Seitenverhältnis:

# Create a 12" x 6" pdf graphics device 
pdf("test.pdf", width=12, height=6) 

# Divide graphics device into two regions, each of which will contain a plot 
par(mfrow=c(1,2)) 

# Left Panel: 5" x 5" plot area (plot region is square, so 1 y-unit = 
# 0.7 * 1 x-unit in terms of physical distance in the plot region) 
par(pin=c(5,5)) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n",main='par(pin=c(5,5)') 

# Right Panel: 0.7*5" x 5" plot area (so 1 x-unit = 1 y-unit 
# in terms of physical distance in the plot region) 
par(pin=c(0.7*5,5)) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n",main='par(pin=c(5,0.7*5)') 

dev.off() 

Beispiel 2: Zeigen, dass Sie einen Fehler erhalten, wenn Sie Stellen Sie größer als die Größe des Grafikgeräts ein. Wir verwenden das Standardgerät (RStudioGD in meinem Fall).

par(pin=c(10, 10)) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n",main='par(pin=c(5,4)') 

# Get dimensions of the default plot device 
par("din") 

# Create a plot that takes up an area just a bit smaller than the device size 
par(pin=par("din")-0.2) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n",main='par(pin=c(5,4)') 

# Create a plot that takes up an area just a bit larger than the device size 
# (we'll get an error this time) 
par(pin=par("din") + 0.01) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n") 

> Error in plot.new() : plot region too large 

Beispiel 3: Der gleiche Fehler tritt auf, wenn Sie die Größe Ihres pdf (oder png, etc.) Gerät überschreiten:

# Create a 5" x 5" pdf graphics device 
pdf("test.pdf", 5,5) 
# Create a plot that takes up a little bit less than the device size 
par(pin=c(5,5)-0.2) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n") 
dev.off() 

# Create a plot that takes up a little bit more than the device size 
pdf("test.pdf", 5,5) 
par(pin=c(5,5)+0.01) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "", 
    type = "n") 
# Gives the following error: Error in plot.new() : plot region too large 
dev.off() 
+0

Danke für das Hinzufügen zu @ mr.joshuagordon's Antwort. Dies erklärt, warum es nicht funktioniert hat, obwohl ich immer noch rätselhaft finde, warum xlim und ylim von asp übersteuert werden müssten. In meinem Fall brauche ich asp (da 1 x-step genau 1 y-step entspricht, da sie Meter in den Daten darstellen), aber ich möchte auch in der Lage sein, den Plot auf den Datenbereich zu beschränken, den ich gerade bearbeite mit. Danke für die ggplot2-Lösung, es scheint, als müsste ich endlich anfangen, ggplot2 zu lernen ... –

+0

Ich empfehle sehr, 'ggplot2' zu lernen. Ich habe es auch eine Zeit lang vermieden, weil es eine Menge Arbeit war, eine neue Art zu denken über Grafik zu lernen. Aber es hat nicht lange gedauert und ich benutze nur selten Basisgrafiken. – eipi10

+0

Danke @ eipi10, du warst extrem hilfreich Die Updates deiner Antwort sind SEHR nützlich und du stimulierst mich auf jeden Fall zum Abholen von ggplot2. Ein Grund, warum ich es bisher abgelehnt habe, ist, dass es viel langsamer erscheint, Grafiken als Basisgrafiken zu rendern. –

5

Sie den Plot als PDF speichern kann, zu erzeugen, und gibt ihre Dimensionen wie folgt:

pdf("SampleGraph.pdf",width=7,height=10) 
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), asp=NA, xlab = "", ylab = "", type = "n") # change asp to NA 
dev.off() # turn off plotting 
+0

das funktioniert, danke. Ich würde es vorziehen, dies zu tun, ohne in eine separate Datei schreiben zu müssen, aber das löst das Problem effektiv, danke! –