仅包含某些系列数据的图例-ggplot-R

仅包含某些系列数据的图例-ggplot-R,r,ggplot2,legend,R,Ggplot2,Legend,我有两个系列:2019-2018的道奇酒吧和三个不同系列:2015-2017的道奇酒吧,每年按周注册。在使用图例时,我只需要显示2018-2019(条形)和2017(黑线)的键。对于其他系列,我将使用注释文本,这很好。因此,我的问题是,当我至少有2个几何图形线对象(一个用于2017年,另一个用于2015-2016年)或3个几何图形线对象(2015-2017年每年一个)时,我只在图例中添加一行。有两件事发生了:要么2019年的图例没有显示,要么在我的第二个版本的代码中,该行位于图例中条形图的键内。

我有两个系列:2019-2018的道奇酒吧和三个不同系列:2015-2017的道奇酒吧,每年按周注册。在使用图例时,我只需要显示2018-2019(条形)和2017(黑线)的键。对于其他系列,我将使用注释文本,这很好。因此,我的问题是,当我至少有2个几何图形线对象(一个用于2017年,另一个用于2015-2016年)或3个几何图形线对象(2015-2017年每年一个)时,我只在图例中添加一行。有两件事发生了:要么2019年的图例没有显示,要么在我的第二个版本的代码中,该行位于图例中条形图的键内。请参见下面我的代码:

# This is my simulated data - plot looks horrible but with real data looks way better -please do not judge
data <- data.frame(week=rep(1:52,5),
                   year=rep(2015:2019, each=52),
                   freq=sample(100,260, TRUE))
data$year <- as.character(data$year)
data$freq[data$year=="2019"] <- sample(30,52, TRUE)
data$freq[data$year=="2018"] <- sample(30,52, TRUE)

# Making the bars
ggplot() + 
  geom_bar(data = subset(data, year %in% c("2019", "2018")), aes(x=week, y=freq, fill = year),       
  stat= "identity", position=position_dodge()) + 
   # I need the keys for bars in the legend
  scale_fill_manual(name = "", 
                    values = c("2019" = "deepskyblue", "2018" = "coral1"), 
                    labels = c("2019 enrollment", "2018 enrollment")) + 

  # This is the line that I need to be included in legend, for 2017
  geom_line(data = subset(data, year=="2017"), aes(x=week, y=freq), color = "black",           
  show.legend = FALSE ,size = 2) + 

  # Here I have the geom_line for 2015-2016 years
  # Here I have two problems, first, I am missing one series, and second these two
  # should not be included in the legend
  geom_line(data = subset(data, year %in% c("2016", "2015")), aes(x=week, y=freq, color="year"), 
            show.legend = FALSE, alpha = 0.4, size = 1.5) + 

  # adding some other details that are not important actually for my question
  scale_y_continuous(breaks = seq(0, 75,10), labels =seq(0,70,10)) +
  scale_x_continuous(breaks = seq(0, 53,1), labels =seq(0,53,1) ) +
  theme(axis.line = element_line(color = "black"),
        panel.grid = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text.x  = element_text(colour="black", size = 12, face = "bold"),
        axis.text.y  = element_text(colour="black", size = 12, face = "bold"),
        axis.title.x = element_text(colour="black", size = 14, face = "bold", hjust=0.5, margin = margin(t = 20, r = 0, b = 20, l = 0)),
        axis.title.y = element_text(colour="black", size = 14, face = "bold", hjust=0.5, margin = margin(t = 0, r = 20, b = 0, l = 0)),
        plot.title   = element_text(colour="black", size = 22, face = "bold", hjust=0.5),
        legend.title = element_blank(),
        legend.text  = element_text(colour="black", size = 18, face = "bold"),
        legend.position = c(0.5, 0.98),
        legend.direction = "horizontal") +
  labs(title = "Title",x = "weeks",y = "number")


非常感谢你的帮助

一个可能的解决方案是使用
ggnewscale
软件包中的
new\u scale\u color
功能来区分2015/2016年线路的绘制与2017年线路的绘制

简单地说,您可以使用选项
show.legend=FALSE
绘制2015年和2016年的第一行,使用
scale\u color\u manual
设置它们的颜色。然后通过
new\u scale\u color
功能,绘制2017线,并为此颜色设置适当的属性

总之,您的代码可以是这样的:

库(ggnewscale)
图书馆(GG2)
ggplot(数据,aes(x=周,y=频率))+
几何图形颜色(位置=位置减淡(),aes(填充=年份),颜色=NA,数据=子集(数据,年份%in%2018:2019))+
比例填充手册(名称=”,
价值=c(“2019年”=“深蓝”,“2018年”=“coral1”),
标签=c(“2019年注册”、“2018年注册”))+
geom_线(数据=子集(数据,年百分比,2015:2016),aes(组=年,颜色=年),show.legend=假)+
比例颜色手册(名称=”,数值=c(“2015”=“红色”,“2016”=“绿色”))+
新比例颜色()+
geom_线(数据=子集(数据,年份==2017),aes(组=年份,颜色=年份))+
缩放颜色手册(名称=”,值=”黑色”,标签=”2017年报名”)+
刻度连续(断开=顺序(0,110,10),标签=顺序(0110,10))+
比例x连续(中断=顺序(0,53,1),标签=顺序(0,53,1))+
主题(axis.line=元素线(color=“黑色”),
axis.text.x=元素\文本(角度=60,hjust=1),
panel.grid=element\u blank(),
panel.border=元素_blank(),
panel.background=元素_blank(),
legend.title=元素_blank(),
legend.text=元素\文本(color=“black”,size=10,face=“bold”),
legend.position=“top”,
legend.direction=“水平”,
plot.title=元素\文本(color=“black”,size=10,face=“bold”,hjust=0.5))+
实验室(title=“title”,x=“weeks”,y=“number”)


它看起来像您想要实现的吗?

一个可能的解决方案是使用
ggnewscale
软件包中的
new\u scale\u color
功能来区分2015/2016年线的绘制与2017年线的绘制

简单地说,您可以使用选项
show.legend=FALSE
绘制2015年和2016年的第一行,使用
scale\u color\u manual
设置它们的颜色。然后通过
new\u scale\u color
功能,绘制2017线,并为此颜色设置适当的属性

总之,您的代码可以是这样的:

库(ggnewscale)
图书馆(GG2)
ggplot(数据,aes(x=周,y=频率))+
几何图形颜色(位置=位置减淡(),aes(填充=年份),颜色=NA,数据=子集(数据,年份%in%2018:2019))+
比例填充手册(名称=”,
价值=c(“2019年”=“深蓝”,“2018年”=“coral1”),
标签=c(“2019年注册”、“2018年注册”))+
geom_线(数据=子集(数据,年百分比,2015:2016),aes(组=年,颜色=年),show.legend=假)+
比例颜色手册(名称=”,数值=c(“2015”=“红色”,“2016”=“绿色”))+
新比例颜色()+
geom_线(数据=子集(数据,年份==2017),aes(组=年份,颜色=年份))+
缩放颜色手册(名称=”,值=”黑色”,标签=”2017年报名”)+
刻度连续(断开=顺序(0,110,10),标签=顺序(0110,10))+
比例x连续(中断=顺序(0,53,1),标签=顺序(0,53,1))+
主题(axis.line=元素线(color=“黑色”),
axis.text.x=元素\文本(角度=60,hjust=1),
panel.grid=element\u blank(),
panel.border=元素_blank(),
panel.background=元素_blank(),
legend.title=元素_blank(),
legend.text=元素\文本(color=“black”,size=10,face=“bold”),
legend.position=“top”,
legend.direction=“水平”,
plot.title=元素\文本(color=“black”,size=10,face=“bold”,hjust=0.5))+
实验室(title=“title”,x=“weeks”,y=“number”)


它看起来像你想要实现的吗?

这正是我所需要的,我不知道新的“缩放”颜色功能,这是关键。非常感谢,拯救了我的理智和我的一天。不客气;)很高兴能够“拯救”你的思想;)这正是我需要的,我不知道新的颜色函数,这是关键。非常感谢,拯救了我的理智和我的一天。不客气;)很高兴能够“拯救”你的思想;)
# bar plot
ggplot() + 
  geom_bar(data = subset(data, year %in% c("2019", "2018")), aes(x=week, y=freq, fill = year), stat= "identity", position=position_dodge()) + 
  scale_fill_manual(name = "", 
                    values = c("2019" = "deepskyblue", "2018" = "coral1"), 
                    labels = c("2019 enrollment", "2018 enrollment")) + 
# Year 2017- I need the key for this one in legend  
  geom_line(data = subset(data, year=="2017"), aes(x=week, y=freq), color = "black", show.legend = TRUE ,size = 2) + 

# Year 2016- I don't need it in legend 
  geom_line(data = subset(data, year=="2016"), aes(x=week, y=freq), color = "green", show.legend = FALSE ,size = 2) +

# Year 2015- I don't need it in legend 
  geom_line(data = subset(data, year=="2015"), aes(x=week, y=freq), color = "red", show.legend = FALSE ,size = 2) +
# additional details not important to the question that I have 
  scale_y_continuous(breaks = seq(0, 110,10), labels =seq(0,110,10)) +
  scale_x_continuous(breaks = seq(0, 53,1), labels =seq(0,53,1) ) +
  theme(axis.line = element_line(color = "black"),
        panel.grid = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(),
        axis.text.x  = element_text(colour="black", size = 12, face = "bold"),
        axis.text.y  = element_text(colour="black", size = 12, face = "bold"),
        axis.title.x = element_text(colour="black", size = 14, face = "bold", hjust=0.5, margin = margin(t = 20, r = 0, b = 20, l = 0)),
        axis.title.y = element_text(colour="black", size = 14, face = "bold", hjust=0.5, margin = margin(t = 0, r = 20, b = 0, l = 0)),
        plot.title   = element_text(colour="black", size = 22, face = "bold", hjust=0.5),
        legend.title = element_blank(),
        legend.text  = element_text(colour="black", size = 18, face = "bold"),
        legend.position = c(0.5, 0.98),
        legend.direction = "horizontal") +
  labs(title = "Title",x = "weeks",y = "number")