R ggplot2-组合几何图形栏和几何图形线图例

R ggplot2-组合几何图形栏和几何图形线图例,r,ggplot2,legend,R,Ggplot2,Legend,我似乎无法将geom_bar和geom_line图例结合起来。我知道关于这个问题有好几次讨论,我想我已经尝试了大多数建议,但都没有成功,但我不认为我理解这个问题。由于我在这方面花了几个小时,没有取得任何进展,所以我认为是时候问问专家了。谢谢你的帮助 我的数据: A <-data.frame("X"= 1:6, "New" = c(5,25,10,43,2,3), "Recaptured" = c(0,2,20,20,29,14), "Cumulative" = c(5,30,40,83,8

我似乎无法将geom_bar和geom_line图例结合起来。我知道关于这个问题有好几次讨论,我想我已经尝试了大多数建议,但都没有成功,但我不认为我理解这个问题。由于我在这方面花了几个小时,没有取得任何进展,所以我认为是时候问问专家了。谢谢你的帮助

我的数据:

A <-data.frame("X"= 1:6, "New" = c(5,25,10,43,2,3), "Recaptured" = c(0,2,20,20,29,14), "Cumulative" = c(5,30,40,83,85,88))
我的代码:

A$X<-factor(A$X, levels=A$X)
A[A==0]<-NA
p1<-A %>%
  gather(key,value,New,Recaptured) %>%
  ggplot(aes(x=X, y=value, fill=key,  color="Cumulative"))+
  geom_line(aes(y=Cumulative,group=1), size=1.25)+
  geom_bar(stat="identity", width = 0.4, position = position_dodge(), color="black")+
  scale_fill_grey(start = 0, end = 0.9)+
  xlab(NULL)+
  ylab(NULL)+
  ggtitle("none")+
  theme_minimal()+
  theme(axis.title.x = element_text(size = 12, hjust = 0.35))+
  theme(plot.title = element_text(hjust = 0.5)) +
  #theme(plot.margin = margin(t=4,1,1,1, "lines"))+
  theme(legend.direction="horizontal") +
  theme(legend.position = c(.25, 0.9))+
  theme(legend.background = element_rect(fill = "white", linetype = "solid", color="black"))+
  theme(legend.title = element_blank())
p1
当前绘图:


这个怎么样?我基本上只是使用legend.spacing.y=unit0.0,'cm'删除了图例之间的垂直间距,并将legend.background参数更改为element_blank,因为该参数将在每个单独的图例周围创建一个框,这不是您想要的,并添加了legend.box.background参数,以同时围绕两个图例绘制一个方框


这个怎么样?我基本上只是使用legend.spacing.y=unit0.0,'cm'删除了图例之间的垂直间距,并将legend.background参数更改为element_blank,因为该参数将在每个单独的图例周围创建一个框,这不是您想要的,并添加了legend.box.background参数,以同时围绕两个图例绘制一个方框


一个是颜色图例,另一个是填充图例。你能解释一下它们应该如何组合吗?谢谢。我只想把它们放在同一个框中,这样我就可以在绘图标题上方水平显示图例。如何+themelegend.position=top,但删除这些框。Edward,这非常接近,但图例仍未合并,因此在累积和新建之间仍有一个空间。一个是颜色图例,另一个是填充图例。你能解释一下它们应该如何组合吗?谢谢。我只想把它们放在同一个框中,这样我就可以在绘图标题上方水平显示图例。如何+themelegend.position=top,但删除这些框。Edward,这非常接近,但图例仍然没有合并,因此在累积和新建之间仍有一个空间。感谢清理我的代码,但这不是我所需要的。我需要的图例项目是在同一行,以便我可以在一行水平分布的图例。此绘图是多面板绘图的一部分,我希望图例位于主绘图标题上方。您需要做的只是添加legend.box=水平以使图例并排。不知道你的标题是什么意思,你上传的图片根本没有标题。你想要一个名为“无”的标题还是不想要标题?只是根据你刚才说的修改了答案。太接近了!但是,有可能消除图例中累积和新之间的差距吗?或者,增加新的和重新捕获之间的间隔,以平衡问题?感谢您清理了我的代码,但这并不是我所需要的。我需要的图例项目是在同一行,以便我可以在一行水平分布的图例。此绘图是多面板绘图的一部分,我希望图例位于主绘图标题上方。您需要做的只是添加legend.box=水平以使图例并排。不知道你的标题是什么意思,你上传的图片根本没有标题。你想要一个名为“无”的标题还是不想要标题?只是根据你刚才说的修改了答案。太接近了!但是,有没有可能消除传说中累积的和新的之间的差距?或者,或者,增加新的和重新捕获的之间的间隔,以平衡事情?
A %>% 
    ggplot(aes(x=X, y=value, fill=key,  color="Cumulative"))+
    geom_line(aes(y=Cumulative,group=1), size=1.25)+
    geom_col(width = 0.4, position = position_dodge(), color="black")+
    scale_fill_grey(start = 0, end = 0.9)+
    xlab(NULL) +
    ylab(NULL) +
    ggtitle("My title") +
    theme_minimal() +
    theme(
        axis.title.x = element_text(size = 12, hjust = 0.35),
        plot.title = element_text(hjust = 0.5),
        legend.direction="horizontal",
        legend.position = c(0.5, 1.2),
        legend.background = element_blank(),
        legend.box.background = element_rect(size = 1),
        legend.title = element_blank(),
        plot.margin = margin(4, 1, 1, 1, "lines"),
        legend.box = "horizontal",
        legend.spacing.y = unit(0.0, 'cm')
    )