2014-08-30 15 views
5

R-3.1.1, Win7x64imbarazzato da XLIM/comportamento ylim in R

Hi, Ho dati in cui due variabili sono misurate in modo tale che X va da 0 a 70, Y va da 0 a 100. voglio fare un semplice grafico a dispersione delle osservazioni. Il grafico a dispersione deve essere dimensionato, in modo tale che l'asse x (che va da 0 a 70) sia pari a 0,7 della dimensione dell'asse y (che va da 0 a 100).

Io uso il seguente codice

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

Sono sorpreso di vedere che questo produce un grafico come segue: enter image description here

due cose non sono come mi aspettavo: 1) l'asse x e l'asse y NON sono limitati ai loro valori xlim e ylim. (Perché è così?) E 2) la figura è quasi quadrata.

Posso ridimensionare la figura manualmente, ridimensionando manualmente la finestra R o la finestra Rstudio prima di utilizzare il codice, ma ciò non è fattibile, perché ho molte figure da disegnare, molte con dimensioni xlim e ylim diverse e queste figure devono essere inserite successivamente in report preformattati (ecco perché devono soddisfare queste esatte richieste di layout). Ho anche provato ad utilizzare

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

ma che non ha aiutato neanche.

La mia domanda è: 1) come posso "forzare" la figura a essere limitata agli esatti intervalli xlim e ylim passati alla funzione? e 2) come generare una figura con le esatte dimensioni relative (l'asse x essendo .7 volte largo quanto la lunghezza dell'asse y)

risposta

5

la discussione del asp nella Guida per plot.window implica che asp sarà ignorare xlim e ylim impostazioni (se si guarda l'aiuto per plot, esso si indirizza a plot.window per saperne di più su asp):

Se asp è un valore positivo finita allora la finestra è impostato in modo che un'unità dati nella direzione x è uguale in lunghezza alla asp * dati uno unità nella direzione y.

nota che in questo caso, par("usr") non è più determinata da, per esempio, par("xaxs"), ma piuttosto da asp e proporzioni del dispositivo. (Vedere cosa succede se si interattivo ridimensiona il dispositivo di stampa dopo l'esecuzione nell'esempio qui sotto!)

Il caso particolare asp == 1 produce trame in cui le distanze tra punti sono rappresentati con precisione sullo schermo. I valori con asp > 1 possono essere utilizzati per produrre mappe più precise quando si utilizza la latitudine e la longitudine .

Come @ mr.joshuagordon notato, è possibile utilizzare la funzione di pdf (o png o jpeg se si desidera uscita bitmap) e giocare con le dimensioni per ottenere il rapporto di aspetto che si desidera, durante la rimozione l'argomento asp da plot in modo che tu possa impostare i valori xlim e ylim.

Un'altra opzione è quella di passare a ggplot2, che lo rende facile impostare limiti assi e proporzioni separatamente:

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: Ecco come controllare xlim, ylim e le proporzioni indipendentemente in basso grafica: invece di asp, utilizzare il parametro grafico pin per impostare le dimensioni fisiche dell'area di stampa. Questa impostazione non influisce sui valori nominali di xlim e ylim, ma cambierà la misura della distanza fisica di 1 unità x e 1 unità y. Ecco alcuni esempi:

Esempio 1: Creeremo due pannelli in un'unica pagina PDF, ognuno con un diverso rapporto d'aspetto:

# 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() 

Esempio 2: Questa è la che si otterrà un errore se si impostare pin in modo che sia più grande della dimensione del dispositivo grafico. Useremo il dispositivo predefinito (RStudioGD nel mio caso).

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 

Esempio 3: Lo stesso errore si verifica se si supera la dimensione del dispositivo pdf (o png, ecc):

# 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

Grazie per aver aggiunto alla risposta di @ mr.joshuagordon. Questo spiega perché non ha funzionato, anche se trovo ancora sconcertante il motivo per cui xlim e ylim devono essere sostituiti da asp. Nel mio caso, ho bisogno di asp (poiché 1 x-step è esattamente uguale a 1 passo-passo, in quanto rappresentano i metri nei dati), ma voglio anche essere in grado di limitare la trama all'intervallo di dati che sto lavorando con. Grazie per la soluzione ggplot2, sembra che devo finalmente iniziare a imparare ggplot2 ... –

+0

Consiglio vivamente di imparare 'ggplot2'. L'ho anche evitato per un po ', perché sembrava molto lavoro per imparare un nuovo modo di pensare alla grafica. Ma non ci è voluto molto e raramente uso la grafica di base. – eipi10

+0

Grazie a @ eipi10, sei stato estremamente utile Gli aggiornamenti alla tua risposta sono MOLTO utili e sicuramente mi stimolerai a ritirare ggplot2. Uno dei motivi per cui ho resistito fino ad ora, è che sembra molto più lento il rendering della grafica rispetto alla grafica di base. –

5

È possibile salvare il disegno come pdf e specificare sua seguenti dimensioni

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

che funziona, grazie. Preferirei farlo senza dover scrivere in un file separato, ma questo risolve il problema in modo efficace, grazie! –