将图例添加到ggplot2线图

我有一个关于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 

和输出

ggplot三行

我想用三种颜色和variables名称(TempMax,TempMedia和TempMin)添加一个图例。 我努力了

 scale_colour_manual 

但是找不到确切的方法。

不幸的是原始数据从链接网站删除,无法恢复。 但他们来自这种格式的气象数据文件

 "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 

我倾向于发现,如果我指定多个几何的个人颜色,我做错了。 以下是我如何绘制你的数据:

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

剩下的就是一个简单的ggplot命令:

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

示例图

在这里输入图像描述

由于@Etienne问如何在不融化数据的情况下做到这一点(一般来说这是首选的方法,但是我承认可能有些情况下这是不可能的),我提出了以下的select。

从原始数据的一个子集开始:

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

你可以得到所需的效果(这也清理了原始的绘图代码):

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

这个想法是通过将colour美感映射到一个常量string来给每一行赋予一种颜色。 select你想要出现在图例中的string是最简单的。 在这种情况下,与被绘制的yvariables的名称相同的事实并不重要; 它可以是任何一组string。 这是非常重要的,这是在aes呼吁, 你正在创build一个映射到这个“variables”。

scale_colour_manual现在可以将这些string映射到适当的颜色。 结果是 在这里输入图像描述

在某些情况下,级别和颜色之间的映射需要通过命名手动缩放中的值来明确(感谢@DaveRGP指出这一点):

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

(和以前一样)。 使用命名值,可以使用中断来设置图例中的顺序,并且可以在值中使用任何顺序。

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