2011-09-19 13 views
30

Estoy tratando de trazar tres conjuntos de datos en el mismo gráfico. Un conjunto de datos debe aparecer en el gráfico como solo un conjunto de puntos no conectados, mientras que los otros dos deben aparecer como puntos de datos conectados. puedo construir el gráfico utilizando el código siguiente a continuación:geom_point() y geom_line() para múltiples conjuntos de datos en el mismo gráfico en 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") 

Como se muestra en el código, hay dos conjuntos de puntos que se trazan con el tipo de "O", lo que significa que los puntos están conectados por una línea, donde como un conjunto de puntos no está conectado por una línea. Estaba intentando recrear esto en ggplot2. hago lo siguiente en 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")) 

hacer lo anterior, consigo los tres conjuntos de puntos en tres colores diferentes, pero, por supuesto, los puntos rojos y azules no están conectados, respectivamente. Si quiero conectar los puntos que puedo añadir geom_line() para el comando anterior por lo que he lo siguiente:

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

Por supuesto, esto se traduce en líneas que conectan todos los puntos, por lo que todos los puntos rojos están conectados entre sí, todos los puntos azules están conectados entre sí, y todos los puntos verdes están conectados entre sí. Sin embargo, aunque quiero que los puntos rojo y azul estén conectados, no quiero que se conecten los puntos verdes. ¿Hay alguna forma de hacer esto?

que podía hacer lo siguiente (o similar):

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 este comando, los puntos rojos están conectados, el azul están conectados, y el verde están desconectados. Sin embargo, no quiero hacer esto porque quiero que todos los colores de los puntos aparezcan en la leyenda (y no aparece ninguna leyenda en esta solución).

+1

Hay un pequeño error en los scripts de ejemplo que encontré al intentar ejecutarlos. Donde dice 'aes (x.value, color = L1)' debe ser 'aes (x, value, color = L1)'. – pedromanoel

+0

Gracias, su pregunta también me ayudó. –

Respuesta

35

El truco es que cada capa puede tener su propio conjunto de datos. Así que hay que crear un subconjunto de datos para excluir L1=="p1" partir de los datos proporcionados a 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

se puede alimentar a un conjunto de datos diferente en cada uno geom. Entonces puede pasar un conjunto de datos excluyendo p1 a la capa geom_line. Algo como esto debería funcionar:

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")) 
Cuestiones relacionadas