2012-09-22 18 views
12

Tengo algunos datos que estoy usando para trazar un histograma. También tengo dos conjuntos de umbrales que tienen cierta importancia.¿Agregar vline a la gráfica existente y hacer que aparezca en la leyenda ggplot2?

Puedo trazar el histograma y las vlines con los estilos apropiados. Sin embargo, no puedo hacer que mis vlines aparezcan en la leyenda. Creo que algo así debería funcionar, sin embargo, los elementos de la leyenda nunca se muestran.

df <- data.frame(val=rnorm(300, 75, 10)) 

cuts1 <- c(43, 70, 90) 
cuts2 <- c(46, 79, 86) 

ggplot(data=df, aes(x=val)) + 
    geom_histogram() + 
    geom_vline(xintercept=cuts1, 
      linetype=1, 
      color="red", 
      labels="Thresholds A", 
      show_guide=TRUE) + 
    geom_vline(xintercept=cuts2, 
      linetype=2, 
      color="green", 
      labels="Thresholds B", 
      show_guide=TRUE) 

Alternativamente, si construyo un hoja.de.datos para mis cortes y hacer un mapeo bien estructurado, que esté en mis vlines a aparecer en la leyenda. Por desgracia, la leyenda me da dos ejemplos de los diferentes tipos de líneas superpuestas unas sobre otras:

cuts1 <- data.frame(Thresholds="Thresholds A", vals=c(43, 70, 90)) 
cuts2 <- data.frame(Thresholds="Thresholds B", vals=cuts2 <- c(46, 79, 86)) 

ggplot(data=df, aes(x=val)) + 
    geom_histogram() + 
    geom_vline(data=cuts1, aes(xintercept=vals, shape=Thresholds), 
      linetype=1, 
      color="red", 
      labels="Thresholds A", 
      show_guide=TRUE) + 
    geom_vline(data=cuts2, aes(xintercept=vals, shape=Thresholds), 
      linetype=2, 
      color="green", 
      labels="Thresholds B", 
      show_guide=TRUE) 

enter image description here

Así que, al final, lo que estoy buscando, es la forma más sencilla de forma manual agregue dos conjuntos de líneas a un gráfico, y luego haga que aparezcan correctamente en la leyenda.

Respuesta

22

El truco es poner los datos de umbral de todos en la misma trama de datos , y luego trazar la estética, en lugar de introducirlos:

cuts <- rbind(cuts1,cuts2) 

ggplot(data=df, aes(x=val)) + 
    geom_histogram() + 
    geom_vline(data=cuts, 
      aes(xintercept=vals, 
       linetype=Thresholds, 
       colour = Thresholds), 
      show_guide = TRUE) 

enter image description here

Cuestiones relacionadas