2012-04-27 247 views
100

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

我想添加图例与所使用的三种颜色和变量的名称(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 
+0

我仍然好奇阉图例可绑单独的情节的元素(如不同geom_line)。 – 2012-04-27 11:49:39

+0

如果你只有3条线我建议看dirrectlabels包。 [(LINK)](http://learnr.wordpress.com/2010/01/03/directlabels-adding-direct-labels-to-ggplot2-and-lattice-plots/) – 2012-04-27 13:13:56

+0

@TylerRinker我以前用过它其他目的,但现在从csgillespie的答案对我更好 – pacomet 2012-04-27 13:19:53

回答

58

我倾向于认为如果我在多个GEOM的指定单独的颜色,我做错了。以下是我会展现您的数据:

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

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

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

例情节

enter image description here

+48

我仍然对如何添加与单独添加元素相关的传奇有关,例如geom_line,我虽然是这个问题的最初目的。 – 2012-04-27 11:48:44

136

由于@Etienne问怎么办这没有融化的数据(这通常是首选的方法,但我承认可能在某些情况下,这是不可能的),我提出以下替代方案。

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

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唯美感为一个常量字符串赋予一种颜色。选择你想要出现在图例中的字符串是最简单的。在这种情况下,与被绘制的y变量的名称相同的事实并不重要;它可以是任何一组字符串。这是非常重要的,这是在aes呼叫内;你正在创建一个映射到这个“变量”。

scale_colour_manual现在可以将这些字符串映射到适当的颜色。其结果是 enter image description here

在一些情况下,水平和颜色之间的映射需要作出明确通过在手动规模命名的值(由于@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") 

+0

不错,我一直在想如何做到这一点。 – mitchus 2013-01-05 15:50:25

+21

布赖恩 - 感谢您回答问**,因为我有类似的情况,您的答案帮助我。 – MikeTP 2014-05-23 14:46:05

+2

我喜欢这个解决方案,但我认为可能有一个限制。在“休息”和“价值”变量的映射之间是否存在字母排序问题? TempM {a} x,TempM {e} dia和TempM {i} n整齐排列,但是当我将其适用于我的变量名称时,颜色似乎按照字母顺序与'中断'相匹配,而不是顺序输入。上面可以澄清/改进以反映/解决这个问题吗? – DaveRGP 2015-01-20 15:56:57