如何 ggplot 具有特定颜色的两个变量和具有缺失值的图例

How to ggplot two variables with a specific colour and legend with missing values

我正在尝试使用 ggplot2 随着时间的推移绘制两个变量。变量具有不同的缺失值。例如:

       Date   Var1      Var2
3 2016-06-16        NA    NA
4 2016-06-17    0.0035 0.004
5 2016-06-18        NA    NA
6 2016-06-19    0.0825 0.083
7 2016-06-20    0.0890    NA
8 2016-06-21    0.1725 0.173

我想用 geom_point() 和虚线连接的点来绘制它,在缺少数据的地方不留空隙,但也有一个图例,所以我有以下内容:

plot1 <- ggplot(mydata, aes(x=Date))

plot1 <- plot1 + geom_point(data= 
mydata[!is.na(mydata$Var1),],aes(y= Var1, colour = 
"Var1"), size =8, col = "navyblue") +
  geom_line(data= mydata[!is.na(mydata$Var1),],aes(y= Var1, 
group =1, colour = "Var1"), linetype = 6, lwd = 1, col = "navyblue") +
  geom_point(data = mydata[!is.na(mydata$Var2),], aes(y=cal5C, colour 
= "Var2"), size=8, col = "turquoise3") +
  geom_line(data = mydata[!is.na(mydata$Var2),],aes(y=Var2, group = 
1, colour = "Var2"), linetype =6, col = "turquoise3")

效果很好,两条线都绘制了所需的颜色,点和线连接,然后我可以调整主题等,使其看起来更漂亮。

但是图例没有显示 - 当我放弃我的颜色规范时它确实出现了,即:

plot1 <- ggplot(mydata, aes(x=Date))
plot1 <- plot1 + geom_point(data= mydata[!is.na(mydata$Var1),],aes(y= 
Var1, colour = "Var1"), size =8) +
  geom_line(data= mydata[!is.na(mydata$Var1),],aes(y= Var1, group =1, 
 colour = "Var1"), linetype = 6, lwd = 1) +
  geom_point(data = mydata[!is.na(mydata$Var2),], aes(y=Var2, colour = 
"Var2"), size=8) +
  geom_line(data = mydata[!is.na(mydata$Var2),],aes(y=Var2, group = 1, 
colour = "Var2"), linetype =6)

但我不想为图表使用预设颜色。我见过有人使用我试过的 reshape 包,但我不确定如何让线连接到点之间——我拥有的最好的是线连接在所有点之间,这是没有用的。

这是我使用重塑和融化将其变成长格式的内容:

library(reshape2)
mydata2 <- mydata[,c(1,26,28)] #subsets into 3 columns Date, Var1, Va2
mydata.m <- melt(mydata2, id.vars=c("Date"))
head(mydata.m)
   Date  variable  value  
1 2016-06-16 Var1     NA  
2 2016-06-17 Var1  0.0035  
3 2016-06-18 Var1      NA  
4 2016-06-19 Var1  0.0825  
5 2016-06-20 Var1  0.0890  
6 2016-06-21 Var1  0.1725  

然后绘制它:

plot1 <- ggplot(mydata.m, 
            aes(x=Date, y=value, color=variable))
plot1 <- plot1 + geom_point() + geom_line()               
plot1 <- plot1 + scale_color_manual(name="", values = 
c("navyblue","turquoise3"))  

这只绘制了点、图例和正确的颜色,但我不知道如何让 geom_line() 工作 - 我试过将 mydata.m[!is.na(mydata.m$value), ] 合并到 geom_line() 重塑后不起作用,geom_line(group = 2) 无济于事。

可以使用函数 complete.case()is.na() 从熔融数据集中删除具有缺失值的行 mydata.m 但它必须传递给 data参数,例如

plot1 <- ggplot(mydata.m[complete.cases(mydata.m), ], 
                aes(x = Date, y = value, color = variable, group = variable))

# or, using !is.na():
plot1 <- ggplot(mydata.m[!is.na(mydata.m$value), ], 
                aes(x = Date, y = value, color = variable, group = variable))

plot1 <- plot1 + geom_point() + geom_line()               
plot1 <- plot1 + scale_color_manual(name="", values = 
                                      c("navyblue","turquoise3")) 
plot1

注意 aes(..., group = variable) 告诉 ggplot2 哪些数据点属于一组,应该用一条线连接。