2011-09-19 11 views
30

Sto provando a tracciare tre set di dati sullo stesso grafico. Un set di dati dovrebbe apparire sul grafico solo come un insieme di punti non connessi, mentre gli altri due dovrebbero apparire come punti dati collegati. posso costruire grafico utilizzando il seguente codice sotto:geom_point() e geom_line() per più dataset sullo stesso grafico in ggplot2

x <- c(1,2,3,4) 
y <- c(1.1,1.2,1.3,1.4) 
y2 <- c(2.1,2.2,2.3,2.4) 
x3 <- c(4,5,6,7) 
y3 <- c(3.1,3.2,3.3,3.2) 
p1 <- data.frame(x=x,y=y) 
p2 <- data.frame(x=x,y=y2) 
p3 <- data.frame(x=x3,y=y3) 

plot(x,y,type="o", col="red") 
points(x3,y3,col="darkgreen",pch=16) 
points(x,y2,type="o",col="blue") 

Come illustrato nel codice, ci sono due insiemi di punti che vengono rappresentati tipo "O", che significa che i punti sono collegati da una linea, dove una serie di punti non è collegata da una linea. Stavo cercando di ricrearlo in ggplot2. faccio la seguente in ggplot2:

zz <- melt(list(p1=p1,p2=p2,p3=p3), id.vars="x") 
ggplot(zz, aes(x.value, color = L1)) 
+ geom_point() + scale_color_manual("Dataset", 
values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) 

fare quanto sopra, ho le tre serie di punti in tre colori diversi, ma, naturalmente, i punti rossi e blu non sono collegati, rispettivamente. Se voglio collegare i punti che posso aggiungere geom_line() per il comando precedente in modo che io ho il seguente:

ggplot(zz, aes(x.value, color = L1)) + geom_point() + 
scale_color_manual("Dataset", values = 
c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) + geom_line() 

Ovviamente questo si traduce in linee che collegano tutti i punti, in modo che tutti i punti rossi sono collegati tra loro, tutti i punti blu sono collegati tra loro e tutti i punti verdi sono collegati tra loro. Tuttavia, mentre voglio che i punti rosso e blu siano collegati, non voglio che i punti verdi siano collegati. C'è un modo per fare questo?

ho potuto fare quanto segue (o simile ad esso):

ggplot(p2, aes(x,y)) + geom_point(color = "blue") + geom_line(color="blue") 
+ geom_point(data=p3, color = "red") + 
geom_line(data=p3, color="red") + geom_point(data=p1, color = "darkgreen") 

Con questo comando, i punti rossi sono collegati, il blu sono collegati, e verde sono scollegati. Tuttavia, non voglio farlo perché voglio essere in grado di visualizzare tutti i colori punto nella legenda (e nessuna leggenda appare in questa soluzione).

+1

C'è un piccolo errore negli script di esempio che ho trovato durante il tentativo di eseguirli. Dove dice 'aes (x.value, color = L1)' dovrebbe essere 'aes (x, value, color = L1)'. – pedromanoel

+0

Grazie, anche la tua domanda mi ha aiutato. –

risposta

35

Il trucco è che ogni livello può avere il proprio set di dati. Quindi devi sottoinsieme dei dati per escludere L1=="p1" dai dati forniti per geom_line:

ggplot(zz, aes(x, y=value, color=L1)) + 
    geom_point() + 
    geom_line(data=zz[zz$L1!="p1", ]) + 
    scale_color_manual("Dataset", 
     values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) 

enter image description here

9

Si può nutrire un insieme di dati diverso in ciascun geom. Quindi puoi passare in un set di dati escludendo p1 nel livello geom_line. Qualcosa di simile dovrebbe funzionare:

ggplot(zz, aes(x, value, color = L1)) + 
    geom_point() + 
    geom_line(data = subset(zz, L1 %in% c("p2", "p3")), aes(group = L1)) + 
    scale_color_manual("Dataset", values = c("p1" = "darkgreen", "p2" = "blue", "p3" = "red")) 
Problemi correlati