2012-07-13 36 views
5

Estoy tratando de trazar varias líneas como parte de una única "clase" en ggplot2. Me puede trazar algo como lo siguiente:ggplot: Líneas múltiples para un Color/clase

image with 5 classes

Pero mi problema es que yo quiero mostrar N1, N2 y N3 como una sola clase (líneas finas grises para cada uno con un único nombre en la leyenda) .

Mi problema es que si creo un nuevo factor en el marco de datos para agruparlos, termino dibujando la conexión de adición desde el final de n1 (arriba a la derecha) hasta el comienzo de n2 (abajo a la izquierda) añade una diagonal a través de mi gráfico:

graph with one class

que está más cerca de lo que quiero, pero tiene la línea diagonal adicional. Si es importante, estoy computando estos usando ROCR y luego extrayendo los puntos x e y del objeto resultante performance para producir estas líneas.

+1

Esto será mucho más fácil de responder si proporciona un ejemplo reproducible mínimo (datos + código). – joran

+0

Estoy de acuerdo. Lamentablemente, temía que el código requerido para reproducir dicho ejemplo ocupara más espacio que la pregunta real. Mi esperanza es que alguien reconozca la teoría y haya visto una solución al problema antes. –

+1

No entiendo preguntas sin ejemplos reproducibles, pero me parece que en la segunda gráfica, podría usar la misma variable que en la primera gráfica para especificar la estética del "grupo" y el nuevo factor para el color. – baptiste

Respuesta

1

Aquí es una manera, pero no creo que te gustará mucho:

d1 <- data.frame(x = 1:10, 
       y = rep(1:2,each = 5), 
       grp = factor(rep(letters[1:2],each = 5),levels = letters[1:3])) 
d1 <- rbind(d1,data.frame(x = 1:2,y = c(NA,NA),grp = c('c','c'))) 

d2 <- data.frame(x = 1:15, 
       y = rep(3:5,each = 5), 
       grp = rep(1:3,each = 5)) 

ggplot() + 
    geom_line(data = d1,aes(x = x,y = y,group = grp,colour = grp)) + 
    geom_line(data = d2,aes(x = x,y = y,group = grp),colour = "blue") 

enter image description here

Tenga en cuenta que su solución no va a funcionar bien con otros tipos de datos. Simplemente sucede que cada una de las tres líneas que desea fusionar en la misma categoría en la leyenda comienza y termina básicamente en el mismo lugar. Si ese no fuera el caso, terminarías con líneas de conector no deseadas.

El método anterior funcionará de manera más general, pero como puede ver no es menos incómodo. En todo caso, es más inconveniente.

Este tipo de problema ha surgido muchas veces, y podría ser que estoy olvidando una solución más simple.Pero en general, trate de tener en cuenta que a cambio de ggplot2 evitando tener que construir cada leyenda manualmente, usted (con frecuencia, pero no siempre) está sacrificando cierta flexibilidad, en comparación con los gráficos base.

+0

¡Gracias! Sería el primero en confesar que mi solución no debería ser universalmente adoptada. Esta es una buena solución, me enseñó algo nuevo sobre capas en ggplot2, pero estoy de acuerdo en que es menos que ideal. Creo que probablemente esté mejor con 'líneas' para este escenario, pero ya he formateado el resto de mis gráficos usando ggplot2, así que voy por consistencia sobre la conveniencia, en este punto. Gracias de nuevo. –

0

Obtuve rbind los elementos del objeto ROCR performance en un data.frame directamente al intentar trazar este gráfico. Me doy cuenta de que podría cortar el viaje desde la esquina superior derecha a la inferior izquierda invirtiendo el orden de la clase media de datos. es decir

n1 <- getPerformance(test1) 
n2 <- getPerformance(test2) 
n3 <- getPerformance(test3) 

crearía tres tramas de datos que parece

type x   y 
1 n1 0 0.000000000 
2 n1 0 0.003448276 
3 n1 0 0.006896552 
4 n1 0 0.010344828 
5 n1 0 0.013793103 
6 n1 0 0.017241379 
... 
26565 n1 0.9999619 1 
26566 n1 1.0000000 1 

El problema aquí es que cuando rbind n1 a n2, estaría une el punto de N1 (1,1) al punto de n2 (0,0) - creando la línea diagonal.

En mi caso, una solución (descuidada) era simplemente invertir el orden de cada otra línea para que no hubiera una línea diagonal.

n2_rev <- n2[nrow(n2):1,] 
ns <- rbind(n1,n2_rev,n3) 

Así que ahora la línea va hacia atrás y hacia adelante en lugar de inicio y fin en la misma posición constantemente, creando el siguiente gráfico:

desired graph

No obstante, supongo que hay un más universal Manera de manejar esto. ¿Hay una buena manera de agregar una línea a un gráfico ggplot2 como la función lines() para la base R?

Cuestiones relacionadas