2012-12-12 11 views
7

Voglio una Hist e una densità sul terreno stesso, sto cercando questo:Get XLIM da una trama in R

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="") 
par(new=TRUE) 

Oldxlim <- myPlot$xlim 
Oldylim <- myPlot$ylim 

hist(m[,3],xlim=Oldxlim,ylim=Oldylim,prob=TRUE) 

ma non posso accedere XLIM e ylim di MyPlot.

C'è un modo per ottenerli da myPlot? Cos'altro dovrei fare invece?

+2

È possibile utilizzare 'hist (. .., add = TRUE) 'per disegnare sulla stessa trama. – liuminzhao

+0

@liuminzhao Probabilmente avrei impostato il tuo commento come risposta accettata – jimifiki

risposta

6

Avete considerato di specificare il proprio xlim e ylim nel primo grafico (impostandoli su valori appropriati) quindi semplicemente utilizzando nuovamente quei valori per impostare il limite è sull'istogramma nella seconda trama?

Basta disegnare la densità per conto proprio, dovresti essere in grado di elaborare valori sensibili per i valori minimo e massimo per entrambi gli assi, quindi sostituire xmin, xmax, ymin e ymax per quei valori nel codice seguente.

qualcosa come;

myPlot <- plot(density(m[,1])), main="", xlab="", ylab="", xlim =c(xmin, xmax), ylim = c(ymin, ymax) 

par(new=TRUE) 

hist(m[,3],xlim=c(min, max),ylim=c(min, max),prob=TRUE) 
2

Penso che la soluzione migliore sia correggerli quando si traccia la densità.

Altrimenti hacing nel codice di plot.default (plot.R)

xlab="" 
ylab="" 
log ="" 
xy <- xy.coords(x, y, xlab, ylab, log) 
xlim1 <- range(xy$x[is.finite(xy$x)]) 
ylim1 <- range(xy$y[is.finite(xy$y)]) 

o per utilizzare il codice di cui sopra per generare XLIM e ylim quindi chiamare il vostro diagramma per la densità

dd <- density(c(-20,rep(0,98),20)) 
plot(dd,xlim=xlim1,ylim=ylim1) 
x <- rchisq(100, df = 4) 
hist(x,xlim=xlim1,ylim=xlim1,prob=TRUE,add=TRUE) 

enter image description here

1

Perché non usare ggplot2?

library(ggplot2) 

set.seed(42) 
df <- data.frame(x = rnorm(500,mean=10,sd=5),y = rlnorm(500,sdlog=1.1)) 

p1 <- ggplot(df) + 
    geom_histogram(aes(x=y,y = ..density..),binwidth=2) + 
    geom_density(aes(x=x),fill="green",alpha=0.3) 
print(p1) 

density and hist

6

Utilizzando par(new=TRUE) è raramente, se mai, la soluzione migliore. Molte funzioni di stampa hanno un'opzione come add=TRUE che si aggiungerà al grafico esistente (inclusa la funzione di tracciamento per gli istogrammi come menzionato nei commenti).

Se avete veramente bisogno di farlo in questo modo poi guardare l'argomento usr alla funzione par, facendo mylims <- par("usr") darà la x e y limiti della trama esistente in coordinate utente. Tuttavia, quando si utilizzano tali informazioni su un nuovo grafico, assicurarsi di impostare xaxs='i' oppure le coordinate effettive utilizzate nel nuovo grafico verranno estese del 4% oltre a quanto specificato.

Le funzioni grconvertX e grconvertY sono anche utili da sapere. Potrebbero essere usati o per questo scopo, ma probabilmente sono overkill rispetto a par("usr"), ma possono essere utili per trovare i limiti in altri sistemi di coordinate o per trovare valori come il centro dell'area di disegno nelle coordinate dell'utente.

4

Se per qualsiasi motivo non si è in grado di utilizzare range() per ottenere i limiti, seguirei il suggerimento di @ Greg. Questo potrebbe funzionare solo se i parametri par "xaxs" e "yaxs" sono impostati su "s" (che è il default) e la gamma di coordinate è esteso dal 4%:

plot(seq(0.8,9.8,1), 10:19) 
usr <- par('usr') 
xr <- (usr[2] - usr[1])/27 # 27 = (100 + 2*4)/4 
yr <- (usr[4] - usr[3])/27 
xlim <- c(usr[1] + xr, usr[2] - xr) 
ylim <- c(usr[3] + yr, usr[4] - yr)