2016-01-14 14 views
12

Sto riscontrando alcuni strani comportamenti nella mia legenda quando aggiungo uno geom_smooth() e uno geom_vline() nel mio diagramma ggplot2. Ecco un esempio riproducibile:R - combinato geom_vline e geom_smooth nella legenda

library(ggplot2) 
n <- 60 

set.seed(123) 
df <- data.frame(Area = sample(c("A", "B", "C", "D"), size = n, replace = TRUE), 
      x = runif(n), 
      y = runif(n), 
      Type = sample(c("I", "II"), size = n, replace = TRUE), 
      Result = sample(c("K", "L", "M"), size = n, replace = TRUE)) 

df.breaks <- data.frame(Area = c("B", "C"), x = c(0.8, 0.3)) 

ggplot(df, aes(x = x, y = y)) + 
    geom_point(aes(colour = Result, shape = Type), size = 3) + 
    geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) + 
    geom_hline(yintercept = 0.3) + 
    facet_wrap(~Area) + 
    geom_vline(data = df.breaks, aes(xintercept = x, linetype = "Break"), colour = "purple") + 
    scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
    scale_linetype_manual(name = "Lines", values = c("Break" = "dashed", "Smooth" = "solid")) 

enter image description here

Come noterete la scritta "Lines" è sia verticale e le linee horizontall in ogni elemento, e nel primo caso ci sono un paio di linee tratteggiate mentre nel secondo caso un paio di linee continue. Sto cercando di adattare il mio codice per produrre una legenda con (1) una linea verde orizzontale e una chiave accanto ad essa chiamata "Smooth" e (2) una linea viola dahsed verticale con una chiave accanto ad essa chiamata "Break". Gradirei qualche aiuto come, non importa quello che ho provato (incluso dentro/fuori aes() ecc., Oppure usando scale_linetype_identity(), o anche l'opzione override.aes in guides) Non riuscivo a trovare la combinazione giusta!

ho cercato esempi simili e anche se ho trovato altri post con una linea verticale sovrapposta colour, fill o shape ecc, ho coulnd't trovare uno con una linea verticale su una leggenda linetype come la mia. Qualsiasi aiuto sarà profondamente apprezzato! Grazie!

+2

forse questo potrebbe aiutare https://groups.google.com/forum/embed/#!topic/ggplot2/pv_CGdzPWnE – MLavoie

+1

L'unica cosa che sono riuscito a capire che anche venuto vicino era quello di utilizzare ' fill' per Smooth invece di 'linetype' per creare due legende separate. – aosmith

+0

Grazie a tutti e due per le vostre risposte. Sono andato con il suggerimento di @ aosmith che è più semplice. – Constantinos

risposta

1

Una risposta tardiva a questa domanda, ma ho pensato che sarebbe stato meglio avere una risposta disponibile nel caso in cui qualcun altro (o il mio futuro sé!) Fosse interessato a questo.

seguito @ suggerimento di aosmith nella sezione commenti e il suo incoraggiamento a fornire la risposta, alla fine ho sostituito il codice per la trama con:

ggplot(df, aes(x = x, y = y)) + 
    geom_point(aes(colour = Result, shape = Type), size = 3) + 
    geom_hline(yintercept = 0.3) + 
    facet_wrap(~Area) + 
    geom_vline(data = df.breaks, 
       aes(xintercept = x, linetype = "Break"), colour = "purple") + 
    scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
    scale_linetype_manual(name = "Lines", 
          values = c("Break" = "dashed", "Smooth" = "solid")) + 
    geom_smooth(aes(fill = "Smooth"), method = "loess", colour = "green", se = FALSE) + 
    scale_fill_discrete(name = "") 

Le ultime due righe sopra sostituire la seguente riga dall'originale codice:

geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) +.

Il grafico risultante ha ancora bisogno di un po 'di lavoro, in particolare della spaziatura delle legende, ma risolve il problema originale.

Vertical and Horizontal Line Legend

Problemi correlati