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()
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 ... –
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
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. –