为多个geom_segments添加图例,同时在ggplot2中保持“实线”线型

时间:2019-03-28 18:06:02

标签: r ggplot2

我已经使用geom_segment创建了一个图,我想为不同的线色添加一个图例。我发现的唯一解决方案是建议修改aes()中的线型,但这仅适用于一个线段-当我在另一个geom_segment中添加第二个标签时,线型变为虚线,图例仅更改为新颜色。 >

这是剧情的代码:

library(ggplot2)

rib_x <- seq(1,10,0.5)
rib_ymin <- seq(3,12,0.5)
rib_ymax <- c(3.0,4.4,5.55,6.55,7.28,8.1,8.6,9.1,9.52,9.98,10.3,10.62,10.98,11.2,11.4,11.52,11.7,11.8,12)

ggplot(data.frame())+
  geom_segment(aes(x=1, xend=10, y=12, yend=3),colour="dark red",size=1.5)+
  geom_segment(aes(x=1, y=3,xend=10,yend=12),colour="green",size=1.5)+
  stat_smooth(aes(x=rib_x,y=rib_ymax),se=FALSE,colour="dark green",size=1.5)+
  xlab("Agroecological zone")+
  ylab("Productivity")+
  geom_segment(aes(x=0, xend = 0, y=2, yend=12), size=1.5, arrow=arrow(length=unit(0.6,"cm")))+
  theme_bw()+
  annotate("text", label="Arid", x=2, y=1)+
  annotate("text", label="Semi-arid", x=5, y=1)+
  annotate("text", label="Humid", x=8, y=1)+
  theme(axis.title=element_text(size=14),axis.text=element_blank(),legend.title=element_blank(),
        axis.ticks=element_blank(),panel.border=element_blank(),
        panel.grid.major = element_blank(),panel.grid.minor = element_blank())

我想为三种线色添加一个图例,在这里我还可以指定图例中使用的文本。

非常感谢!

1 个答案:

答案 0 :(得分:1)

colour内移动aes()美学,并使用要用来标记每种颜色的实际字符串来命名它们。然后在末尾添加scale_colour_manual(),以获得所需的特定颜色。请参见下面的示例。

在“标准” ggplot2工作流程中,您需要将一些分类列映射到colour(例如,aes())内的ggplot(iris, aes(x=Petal.Width, y=Sepal.Width, colour=Species)) + geom_smooth(se=FALSE, method="lm"),然后是几何体(例如,点,线,平滑等)对于映射到colour的分类列的每个唯一值将以不同的颜色显示。在这里,我们没有使用数据框,因此我们创建了“虚拟”映射到色彩美学。将它们放在aes()中会导致ggplot生成图例。

ggplot() +
  geom_segment(aes(x=1, xend=10, y=12, yend=3, colour="name1"), size=1.5) +
  geom_segment(aes(x=1, y=3,xend=10,yend=12, colour="name2"), size=1.5) +
  stat_smooth(aes(x=rib_x,y=rib_ymax, colour="name3"),se=FALSE,size=1.5) +
  labs(x="Agroecological zone", y="Productivity", colour="Type") +
  geom_segment(aes(x=0, xend = 0, y=2, yend=12), size=1.5, arrow=arrow(length=unit(0.6,"cm"))) +
  annotate("text", label="Arid", x=2, y=1) +
  annotate("text", label="Semi-arid", x=5, y=1) +
  annotate("text", label="Humid", x=8, y=1) +
  theme_void() +
  theme(axis.title=element_text(size=14, margin=margin(b=3)),
        axis.title.y=element_text(angle=90)) +
  scale_color_manual(values=c("name1"="darkred", "name2"="green", "name3"="darkgreen"))

enter image description here