Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将图例添加到ggplot2测线图_R_Ggplot2_Legend_R Faq - Fatal编程技术网

R 将图例添加到ggplot2测线图

R 将图例添加到ggplot2测线图,r,ggplot2,legend,r-faq,R,Ggplot2,Legend,R Faq,我有一个关于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

我有一个关于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
但是找不到确切的方法

遗憾的是,原始数据已从链接站点中删除,无法恢复。但它们来自具有这种格式的meteo数据文件

"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
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"))
示例图

既然有人问我如何在不融化数据的情况下做到这一点(这通常是首选方法,但我认识到在某些情况下这是不可能的),我提出了以下备选方案

从原始数据的子集开始:

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")
其思想是,通过将
颜色
美学映射到一个常量字符串,为每一行指定一种颜色。选择要显示在图例中的字符串是最简单的。在这种情况下,它与正在绘制的
y
变量的名称相同这一事实并不重要;它可以是任何一组字符串。这在
aes
调用中非常重要;您正在创建对此“变量”的映射

scale\u color\u manual
现在可以将这些字符串映射到适当的颜色。结果是

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

(给出与之前相同的数字)。对于命名值,可以使用分隔符设置图例中的顺序,也可以在值中使用任何顺序

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

我非常喜欢@Brian Diggs提出的解决方案。然而,在我的例子中,我在一个循环中创建线图,而不是显式地给出它们,因为我不知道我将有多少个图。当我试图修改@Brian的代码时,我在正确处理颜色方面遇到了一些问题。结果我需要修改美学功能。如果有人有同样的问题,这里是为我工作的代码

我使用了与@Brian相同的数据帧:

data <- structure(list(month = 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), 
                   TempMed = 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("month", "TempMax", "TempMed", "TempMin"), 
              row.names = c(NA, 20L), class = "data.frame")  
下面是情节:

p <-  ggplot(data, aes(x = month))

for (i in 1:3){
  p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
colnames(data[i+1])))#as.character(my.names[i])))
}
p + scale_colour_manual("", 
                        breaks = as.character(my.names),
                        values = my.cols)
p

p我仍然很好奇如何添加与单独添加元素(如geom_line)相关的图例,我认为这是问题的最初目的。因为这个答案涉及很多,而且因为Reforme2已经退役,所以最好显示
tidyr::pivot_longer()
数据重塑的方法。我仍然很好奇图例是否可以与绘图的单独元素(例如不同的几何图形线)相关联。如果您只有3条线,我建议您查看dirrectlabels包@TylerRinker我以前曾将其用于其他用途,但现在csgillespie的答案更适用于其他用途me@EtienneLow-你可以,但一般来说,只有当他们使用不同的美学。e、 g.将一组线映射到颜色,将另一组线映射到线型。在这种情况下,您通常会将单独的数据传递给每个geom。我喜欢这种解决方案,但我认为可能存在局限性。“break”和“values”变量之间的映射是否存在字母排序问题?TempM{a]x、TempM{e}dia和TempM{i}n整齐地排序,尽管当我将其调整到变量名称时,颜色似乎按字母顺序与“中断”匹配,而不是按顺序输入。能否澄清/细化上述内容以反映/修复此问题?我已设法找到解决我之前购买的问题的方法:颜色排序。使用表格
scale\u color\u manual(“,value=c(“TempMax”=“red”、“TempMedia”=“green”、“TempMin”=“blue”)
其中TempMax、TempMedia和TempMin被指定为上述答案中的颜色参数。@DaveRGP这可能被认为是ggplot的错误吗?@StellaBiderman谢谢。很高兴知道这个答案仍然有用(将近)5年(!)稍后。@BrianDiggs你不会碰巧知道如何让它在刻度上显示一个点而不是一条线,是吗?在这种复杂性下,将数据重塑成
ggplot
所期望的长格式真的变得容易多了。我不认为与@Brian发布的原始答案相比,它真的增加了复杂性。此外,一些人们可能希望在不改变数据形状的情况下完成这项工作……这种方法允许通过变量进行不同的几何图形(绘图类型)
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")
data <- structure(list(month = 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), 
                   TempMed = 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("month", "TempMax", "TempMed", "TempMin"), 
              row.names = c(NA, 20L), class = "data.frame")  
my.cols <- heat.colors(3, alpha=1)
my.names <- c("TempMin", "TempMed", "TempMax")
names(my.cols) <- my.names
p <-  ggplot(data, aes(x = month))

for (i in 1:3){
  p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
colnames(data[i+1])))#as.character(my.names[i])))
}
p + scale_colour_manual("", 
                        breaks = as.character(my.names),
                        values = my.cols)
p