如何在ggplot2中加入线条和功能区图例?

问题描述

我想加入传奇人物(“ Curva derarefação”)和丝带传奇人物(“Desvio-padrão”)。

hh <- data.frame(rr = sp5$richness,rc = sp1$richness,p = sp5$individuals,sd = sp5$sd)

ggplot(hh)+
  geom_line(aes(x = p,y = rr,color = "rr")) +
  geom_ribbon(aes(x = p,ymin = rr-sd*2,ymax = rr+sd*2,fill = "sd"),alpha = 0.2)+
  geom_line(aes(x = p,y = rc,color = "rc")) +
  theme_minimal()+
  scale_colour_manual("",breaks = c("rr","rc"),labels = c("Curva de rarefação","Curva do coletor"),values = c("black","red")) +
  scale_fill_manual("",breaks = "sd",labels = "Desvio-padrão",values = "grey") +
  xlab("\nIndivíduos")+
  ylab("Riqueza\n")

enter image description here

解决方法

这真是个hack。不确定是否有更简单的方法来获得所需的结果,但至少它能起作用。 (实际上,我希望您想要我在评论(;)中提供的第一个简便方法。

首先。几何图形没有任何传说,传说显示的是美学的尺度,即不同的fillcolorlinetype,...

因此,要获得理想的结果,第一步是对“黑色” geom_linegeom_ribbon使用相同的美学效果,但将 代表“红色” geom_line的美观。

  1. 因此,我在colorfill中使用geom_linegeom_ribbon aes,而对于第二个geom_line,我使用{{1 }}。这样,我们为“黑线”和“色带”获得了一个图例(实际上我们得到了两个),为“红线”获得了一个图例。

  2. 要合并颜色和填充图例,我们必须为两个图例设置相同的名称,这是通过linetype进行的,这使我摆脱了图例标题。

  3. 接下来,我们通过scale_xxx_manual设置颜色和填充颜色以及标签。

  4. 完成这些步骤之后,我们几乎到了,除了黑线labs(fill = NULL,color = NULL,linetype = NULL)周围的黑色边框。这确实是棘手的部分,但是通过反复试验,我发现可以通过将legend key的{​​{1}}设置为key_glyph来实现。

  5. 最后,我更改了图例的顺序,以便首先显示“双”图例。

使用一些随机示例数据进行验证:

geom_ribbon

编辑我想到的第二种方法是这样的。在这里,我首先将您的数据帧转换为长格式,这样一个"rect"就足以绘制两条线。但是,在这种情况下,我们还会为红线显示一个功能区。因此,我将第二个功能区的填充颜色设置为library(ggplot2) set.seed(42) hh <- data.frame(rr = (1:10) + runif(10),rc = (1:10) + runif(10),p = 1:10,sd = runif(10)) labels <- c(rr = "Curva de rarefacao",sd = "Desvio-padrao") values_fill <- c(rr = "transparent",sd = "grey") values_color <- c(rr = "black",sd = "transparent") ggplot(hh)+ geom_line(aes(x = p,y = rr,color = "rr",fill = "rr")) + geom_ribbon(aes(x = p,ymin = rr-sd*2,ymax = rr+sd*2,color = "sd",fill = "sd"),alpha = .2,key_glyph = "rect") + geom_line(aes(x = p,y = rc,linetype = "rc"),color = "red") + scale_fill_manual(labels = labels,values = values_fill) + scale_colour_manual(labels = labels,values = values_color) + scale_linetype_discrete(labels = c(rc = "Curva do coletor")) + guides(linetype = guide_legend(order = 2),fill = guide_legend(order = 1),color = guide_legend(order = 1)) + labs(fill = NULL,linetype = NULL) + theme_minimal() #> Warning: Ignoring unknown aesthetics: fill ,使其不可见。

geom_line