2012-04-27 18 views
100

Tengo una pregunta sobre las leyendas en ggplot2. Logré trazar tres líneas en el mismo gráfico y quiero agregar una leyenda con los tres colores utilizados. Este es el código utilizadoAgregar leyenda a la gráfica de línea 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 

y la salida

ggplot three lines

Me gustaría añadir una leyenda con los tres colores utilizados y el nombre de la variable (TempMax, TempMedia y TempMin) . He intentado

scale_colour_manual 

pero no puedo encontrar la manera exacta.

Lamentablemente, los datos originales se eliminaron del sitio vinculado y no se pudieron recuperar. Pero vinieron de archivos de datos meteo con este 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

Todavía estoy leyendas wether curiosos se pueden atar para separar los elementos de la trama (tales como diferente geom_line). –

+0

Si solo tiene 3 líneas, le sugiero que mire el paquete dirrectlabels. [(LINK)] (http://learnr.wordpress.com/2010/01/03/directlabels-adding-direct-labels-to-ggplot2-and-lattice-plots/) –

+0

@TylerRinker Lo había usado antes para otros fines, pero ahora la respuesta de csgillespie me funciona mejor – pacomet

Respuesta

58

tiendo a encontrar que si estoy especificando colores individuales en múltiples Geom, lo estoy haciendo mal. Así es como me gustaría trazar su datos:

##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")) 

Todo lo que queda es un simple comando ggplot:

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

Ejemplo parcela

enter image description here

+48

Todavía tengo curiosidad acerca de cómo agregar leyendas asociadas con la adición separada de elementos como geom_line, que pensé que era el propósito original de la pregunta. –

136

Desde @Etienne preguntó cómo hacerlo esto sin fundir los datos (que en general es el método preferido, pero reconozco que puede en algunos casos donde eso no es posible), presento la siguiente alternativa.

de inicio con un subconjunto de los datos originales:

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

Usted puede conseguir el efecto deseado (y esto también se limpia el código de trazado originales):

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

La idea es que cada línea recibe un color mapeando la estética colour en una cuerda constante. Elegir la cadena que es lo que desea que aparezca en la leyenda es la más fácil. El hecho de que en este caso sea el mismo que el nombre de la variable y que se está trazando no es significativo; podría ser cualquier conjunto de cadenas. Es muy importante que esto esté dentro de la llamada aes; está creando un mapeo a esta "variable".

scale_colour_manual ahora puede asignar estas cadenas a los colores apropiados. El resultado es enter image description here

En algunos casos, la correspondencia entre los niveles y colores necesita ser explicitado por nombrar los valores en la escala Manual (gracias a @DaveRGP por señalar esto):

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 misma figura que antes). Con valores con nombre, los descansos se pueden usar para establecer el orden en la leyenda y cualquier orden se puede usar en los valores.

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

Bien, me he estado preguntando por un tiempo cómo hacer esto. – mitchus

+21

Brian - Gracias por responder la pregunta ** como se lo pidieron ** porque tuve una situación similar y su respuesta me ayudó. – MikeTP

+2

Me encanta esta solución, pero creo que puede haber una limitación. ¿Existe un problema de clasificación alfabética entre el mapeo de las variables 'breaks' y 'values'? TempM {a] x, TempM {e} dia y TempM {i} n clasifican ordenadamente, aunque cuando lo adapto a mis nombres de variable, los colores parecen coincidir en orden alfabético con los 'breaks', no en la entrada de la orden . ¿Se puede aclarar/refinar lo anterior para reflejar/corregir esto? – DaveRGP

Cuestiones relacionadas