2009-08-21 13 views
18

Ho sperimentato sia con ggplot2 sia con lattice per rappresentare graficamente pannelli di dati. Sto avendo un piccolo problema a ricomporre il modello ggplot2. In particolare, come faccio a tracciare un diagramma a dispersione di due serie di dati su ogni pannello:tracciamento di due vettori di dati su un grafico a dispersione GGPLOT2 utilizzando R

in lattice avrei potuto fare questo:

xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd) 

e che mi avrebbe dato un pannello per ogni State_CD con ogni colonna

posso fare una colonna con ggplot2:

pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) 
     + facet_wrap(~ State_CD) + opts(aspect.ratio = 1) 
print(pg) 

quello che non riesco Grok è come aggiungere ACTUAL_VALUE al ggplot sopra.

EDIT Hadley ha sottolineato che questo sarebbe davvero più semplice con un esempio riproducibile. Ecco il codice che sembra funzionare. C'è un modo migliore o più conciso per farlo con ggplot? Perché la sintassi per aggiungere un altro insieme di punti a ggplot è così diversa dall'aggiunta della prima serie di dati?

uscita
library(lattice) 
library(ggplot2) 

#make some example data 
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24))) 
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD") 

#plot with lattice 
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd) 

#plot with ggplot 
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1) 
print(pg) 

pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

Il reticolo si presenta così: alt text http://www.cerebralmastication.com/wp-content/uploads/2009/08/lattice.png

e ggplot si presenta così: alt text http://www.cerebralmastication.com/wp-content/uploads/2009/08/ggplot.png

+0

Sarebbe molto più semplice offrire suggerimenti se hai fornito un esempio riproducibile – hadley

+0

sì, questo è un buon punto. È stato pigro da parte mia non creare un esempio completo. Proverò a lavorarci su. –

risposta

19

Basta seguire ciò che Ian ha suggerito: per ggplot2 si desidera veramente tutto il materiale dell'asse y in una colonna con un'altra colonna come fattore che indica come si desidera decorarlo. È facile farlo con melt. Vale a dire:

qplot(x_value, value, 
     data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")), 
     colour=variable) + facet_wrap(~State_CD) 

Ecco che cosa assomiglia a me: alt text http://www.cs.princeton.edu/~jcone/example.png

Per avere un'idea di ciò che melt sta effettivamente facendo, ecco la testa:

> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value"))) 
    x_value State_CD  variable  value 
1 1.2898779  A Predicted_value 1.0913712 
2 0.1077710  A Predicted_value -2.2337188 
3 -0.9430190  A Predicted_value 1.1409515 
4 0.3698614  A Predicted_value -1.8260033 
5 -0.3949606  A Predicted_value -0.3102753 
6 -0.1275037  A Predicted_value -1.2945864 

Vedete, "fonde" Predicted_value e Actual_value in una colonna denominata value e aggiunge un'altra colonna denominata variable che ti consente di sapere da quale colonna proviene.

1

ben dopo la pubblicazione la domanda che mi sono imbattuto in this R Help thread che potrebbe mi hanno aiutato. Sembra che posso fare questo:

pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

è un buon modo di fare le cose? È strano per me perché aggiungere il secondo elemento ha una sintassi completamente diversa rispetto alla prima.

+0

Nota che devi solo cambiare le cose dai valori di default che hai impostato nella parte ggplot(). Nel tuo caso devi solo impostare il nuovo valore y e il colore. ggplot (dd, aes (x = x_valore, y = valore_predicato)) + punto_omatico (forma = 2) + facet_wrap (~ stato_CD) + opts (aspect.ratio = 1) + geom_line (aes (yActual_value, color = "verde ") – Thierry

2

Si potrebbe semplicemente voler modificare leggermente la forma dei dati, in modo da avere una variabile sull'asse y, con una variabile fattore aggiuntiva che indica se si tratta di una variabile prevista o effettiva.

È qualcosa di simile a quello che stai cercando di fare?

dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40), 
       x_value=rnorm(40),State_CD=rnorm(40)>0) 
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD) 
+0

ahhh .. Penso che sia quello che stanno facendo gli esempi nei documenti ggplot. Questo sicuramente aiuta il mio pensiero –

6

Aggiornamento: diversi anni ormai, ho quasi sempre utilizzare il metodo di Jonathan (attraverso il tidyr package) con ggplot2. La mia risposta di seguito funziona in un pizzico, ma diventa tediosa velocemente quando si hanno 3+ variabili.


sono sicuro Hadley avrà una risposta migliore, ma - la sintassi è diversa perché la sintassi ggplot(dd,aes()) è (credo) destinato principalmente per tracciare una sola variabile. Per due, userei:

ggplot() + 
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") + 
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) + 
facet_wrap(~ State_CD) + 
theme(aspect.ratio = 1) 

Tirando la prima serie di punti dei ggplot() dà la stessa sintassi del secondo. Trovo che sia più facile gestirli perché la sintassi è la stessa ed enfatizza la "grammatica della grafica" che è al centro di ggplot2.

+0

@MichaelChirico Infatti!' Aspect.ratio' è ora nella funzione 'theme()'. sottolineando questo. –