2010-01-14 9 views
17

Sono in esecuzione di una simulazione Monte Carlo e l'uscita è in forma:devo sempre usare i frame di dati in ggplot2

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4)) 
> d 
iter k1 k2 
1  0.2 0.3 
2  0.6 0.4 

Le trame voglio generare sono:

plot(d$iter, d$k1) 
plot(density(d$k1)) 

so come fare trame equivalenti utilizzando ggplot2, convertire in frame di dati

new_d = data.frame(iter=rep(d$iter, 2), 
        k = c(d$k1, d$k2), 
        label = rep(c('k1', 'k2'), each=2)) 

poi tramando è facile. Tuttavia il numero di iterazioni può essere molto grande e il numero di k può anche essere grande. Ciò significa pasticciare con un frame di dati molto grande.

Esiste comunque la possibilità di creare questo nuovo frame di dati?

Grazie

risposta

13

Risposta breve è "no", non è possibile evitare la creazione di un frame di dati. ggplot richiede che i dati si trovino in un frame di dati. Se si utilizza qplot, è possibile assegnare vettori separati per xey, ma internamente sta ancora creando un frame dati fuori dai parametri che si passano.

Sono d'accordo con il suggerimento di juba: impara a utilizzare la funzione reshape , o meglio ancora il pacchetto reshape con le funzioni melt/cast. Una volta che sei veloce con i tuoi dati nel formato lungo, la creazione di fantastici grafici ggplot diventa un passo avanti!

4

È possibile utilizzare la funzione di reshape per trasformare il vostro frame di dati in formato "lungo". Potrebbe essere un po 'più veloce del tuo codice?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2")) 
    iter time k id 
1.k1 1 k1 0.2 1 
2.k1 2 k1 0.6 2 
1.k2 1 k2 0.3 1 
2.k2 2 k2 0.4 2 
2

Quindi, per aggiungere alle risposte precedenti. Con qplot si potrebbe fare

p <- qplot(y=d$k2, x=d$k1) 

e quindi da lì costruirlo ulteriormente, ad es. con

p + theme_bw() 

Ma sono d'accordo: lo scioglimento/lancio è genericamente la via da seguire.

Problemi correlati