ggplot2: 分离每层图例

3

我试图绘制我的数据,并且已经取得了相当大的进展(因为我是R和ggplot的初学者)。现在我卡在了制作图例上:
我希望线条层和点层有单独的图例条目,这意味着像下面这样的东西
-- 女性
-- 男性
-- 图A
-- 图B
O 开始
O 结束
O 年份1

有什么建议解决这个问题吗?

test<-data.frame(id=1:6, sex=rep(c("female", "male"),times=3),   plot=rep(c("A", "B"), times=3), start=sample(seq(as.Date('2015/01/01'), as.Date('2016/01/01'), by="day"), 6), end=sample(seq(as.Date('2016/01/01'), as.Date('2016/10/01'), by="day"),6))  
test$duration <- difftime(test$end, test$start, units="days")  
test$Year1 <- as.Date(test$start+366)  
test$Year1[test$Year1>=Sys.Date() | test$duration<365] <-NA

startTime<- as.Date("2015-01-01")  
endTime <- Sys.Date()  
start.end <-c(startTime, endTime)

ggplot(test, aes(x=start, y=id, color=sex, linetype=plot))+             
      geom_segment(aes(x=start, xend=end, y=id, yend=id), size=.75)+          
      geom_point(aes(Year1), na.rm=TRUE, shape=16, size=3)+
      geom_point(aes(start), shape=1, size=3)+
  geom_point(data=subset(test, end!= Sys.Date()), aes(end), shape=13, size=3)+
      guides(color=guide_legend(title=NULL))+                                        
      scale_x_date(date_breaks="6 months", date_minor_breaks = "1 month", date_labels="%m/%Y", name="duration", limits=start.end)+  
      scale_color_discrete(name="", breaks=c("female", "male"), labels=c("f", "m"))+
      scale_linetype_manual(name="", breaks=c("A", "B"), labels=c("Plot A", "Plot B"), values=c("dotdash","solid"))+
      scale_shape_manual(name="", guide='legend', breaks=c("Year1", "start", "end"), labels=c("Year1", "start", "end"), values=c("16", "1", "13"))

在这里输入图片描述

这是一个关于IT技术的图片,无法直接翻译。
1个回答

2

您需要将startendYear1放在一个共同的变量中,并将shape美学映射到该变量。这应该可以工作:

library(ggplot2)
library(tidyr)
library(dplyr)
test<-data.frame(id=1:6, sex=rep(c("female", "male"),times=3),   plot=rep(c("A", "B"), times=3), start=sample(seq(as.Date('2015/01/01'), as.Date('2016/01/01'), by="day"), 6), end=sample(seq(as.Date('2016/01/01'), as.Date('2016/10/01'), by="day"),6))  
test$duration <- difftime(test$end, test$start, units="days")  
test$Year1 <- as.Date(test$start+366)  
test$Year1[test$Year1>=Sys.Date() | test$duration<365] <-NA

startTime<- as.Date("2015-01-01")  
endTime <- Sys.Date()  
start.end <-c(startTime, endTime)

test_melt <- test %>% 
  select(id, sex, start, end, Year1) %>% 
  gather(type, value, -sex,-id)


ggplot(test)+             
  geom_segment(aes(x=start, xend=end, y=id, yend=id, color=sex, linetype=plot), size=.75)+          
  geom_point(aes(x = value, y = id, color = sex, shape = type), data = test_melt, size = 3) + 
  guides(color=guide_legend(title=NULL))+                                        
  scale_x_date(date_breaks="6 months", date_minor_breaks = "1 month", date_labels="%m/%Y", name="duration", limits=start.end)+  
  scale_color_discrete(name="", breaks=c("female", "male"), labels=c("f", "m"))+
  scale_linetype_manual(name="", breaks=c("A", "B"), labels=c("Plot A", "Plot B"), values=c("dotdash","solid"))+
  scale_shape_manual(name="", guide='legend', breaks=c("Year1", "start", "end"), labels=c("Year1", "start", "end"), values=c(16, 1, 13))

1
形状编号不应该被引用(例如使用1而不是“1”)。 - Mark Peterson
不确定我是怎么失去引号的,但应该是将双引号写成了1。除此之外,答案很好。 - Mark Peterson
非常感谢,那个完美解决了!:) 目前唯一需要解决的问题是性别图例 - 它仍然具有线条和点,而应该只有线条... - Laura
经过一段时间的研究,我认为这并不容易实现。我向ggplot2提交了一个PR(https://github.com/hadley/ggplot2/pull/1760)来处理这个问题,我正在等待回复。 - Tutuchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接