2012-04-27 21 views
100

Ho una domanda sulle legende in ggplot2. Sono riuscito a tracciare tre linee nello stesso grafico e voglio aggiungere una legenda con i tre colori usati. Questo è il codice utilizzatoAggiungi legenda al diagramma di linee ggplot2

library(ggplot2)  
require(RCurl) 

link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt") 
datos<- read.csv(textConnection(link),header=TRUE,sep=";") 
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")  

temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) + 
      geom_line(colour="red") + opts(title="TITULO") + 
      ylab("Temperatura (C)") + xlab(" ") + 
      scale_y_continuous(limits = c(-10,40)) + 
      geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") + 
      geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") + 
      scale_colour_manual(values=c("red","green","blue")) 

temp 

e l'uscita

ggplot three lines

vorrei aggiungere una legenda con i tre colori utilizzati e il nome della variabile (TempMax, TempMedia e TempMin) . Ho provato

scale_colour_manual 

ma non riesco a trovare il modo esatto.

Purtroppo i dati originali sono stati cancellati dal sito collegato e non è stato possibile recuperarli. Ma sono venuti da file di dati meteo con questo formato

"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed" 
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4 
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83 
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87 
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29 
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22 
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27 
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61 
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85 
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49 
+0

io sono ancora leggende wether curiosi possono essere legati per separare gli elementi della trama (come diverso geom_line). –

+0

Se hai solo 3 righe ti suggerisco di guardare il pacchetto dirrectlabels. [(LINK)] (http://learnr.wordpress.com/2010/01/03/directlabels-adding-direct-labels-to-ggplot2-and-lattice-plots/) –

+0

@TylerRinker L'avevo usato prima per altri scopi, ma ora la risposta di csgillespie funziona meglio per me – pacomet

risposta

58

tendo a scoprire che se sto specificando singoli colori in geom più di, sto facendo male. Ecco come vorrei tracciare i dati:

##Subset the necessary columns 
dd_sub = datos[,c(20, 2,3,5)] 
##Then rearrange your data frame 
library(reshape2) 
dd = melt(dd_sub, id=c("fecha")) 

Tutto quello che resta è un semplice comando ggplot:

ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) + 
    scale_colour_manual(values=c("red","green","blue")) 

Esempio trama

enter image description here

+48

Sono ancora curioso di come aggiungere legende associate all'aggiunta separata di elementi come geom_line, che per me era lo scopo originale della domanda. –

136

Dal @Etienne chiesto come fare questo senza sciogliere i dati (che in generale è il metodo preferito, ma riconosco che possono esserlo in alcuni casi dove ciò non è possibile), presento la seguente alternativa.

Inizia con un sottoinsieme dei dati originali:

datos <- 
structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
"POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
"TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame") 

È possibile ottenere l'effetto desiderato da (e questo pulisce anche il codice di tracciato originale):

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         breaks = c("TempMax", "TempMedia", "TempMin"), 
         values = c("red", "green", "blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

L'idea è che ogni linea ha un colore mappando l'estetica colour con una stringa costante. La scelta della stringa che è ciò che si desidera visualizzare nella legenda è la più semplice. Il fatto che in questo caso sia uguale al nome della variabile y stampata non è significativo; potrebbe essere qualsiasi insieme di stringhe. È molto importante che questo sia all'interno della chiamata aes; stai creando una mappatura a questa "variabile".

scale_colour_manual può ora mappare queste stringhe ai colori appropriati. Il risultato è enter image description here

In alcuni casi, la mappatura tra i livelli e colori deve essere esplicitata da nominare i valori nella scala manuale (grazie al @DaveRGP per la precisazione):

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         values = c("TempMedia"="green", "TempMax"="red", 
           "TempMin"="blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

(dando la stessa figura di prima). Con i valori denominati, le interruzioni possono essere utilizzate per impostare l'ordine nella legenda e qualsiasi ordine può essere utilizzato nei valori.

ggplot(data = datos, aes(x = fecha)) + 
    geom_line(aes(y = TempMax, colour = "TempMax")) + 
    geom_line(aes(y = TempMedia, colour = "TempMedia")) + 
    geom_line(aes(y = TempMin, colour = "TempMin")) + 
    scale_colour_manual("", 
         breaks = c("TempMedia", "TempMax", "TempMin"), 
         values = c("TempMedia"="green", "TempMax"="red", 
           "TempMin"="blue")) + 
    xlab(" ") + 
    scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
    labs(title="TITULO") 

+0

Bene, mi sono chiesto per un po 'come fare questo. – mitchus

+21

Brian - Grazie per aver risposto alla domanda ** come richiesto ** perché avevo una situazione simile e la tua risposta mi ha aiutato. – MikeTP

+2

Amo questa soluzione, ma penso che ci possa essere una limitazione. Esiste un problema di ordinamento alfabetico tra la mappatura delle variabili "pause" e "valori"? TempM {a] x, TempM {e} dia e TempM {i} n ordinatamente, anche se adattando questo ai nomi delle variabili, i colori sembrano corrispondere in ordine alfabetico alle "interruzioni", non nell'ordine . È possibile chiarire/perfezionare quanto sopra per riflettere/correggere questo? – DaveRGP

Problemi correlati