如何为ggplot2密度图中的geom_area灰色区域添加图例?
给密度图灰色区域添加图例的解决方案
嘿,我来帮你搞定这个灰色区域的图例问题~你当前的代码里,geom_area是直接把fill="grey"写在图层参数里,没有通过aes()进行映射,所以ggplot没法自动生成对应的图例。下面给你两种简单可行的方法:
方法一:将填充色映射到aes,自定义图例
这是最规范的做法,把填充色的定义放到aes()里,然后用scale_fill_manual来指定颜色和图例的显示内容:
# 保留原有的密度计算逻辑(修正density函数的参数笔误) dd <- density(x, na.rm = TRUE) dd <- data.frame(x=dd$x,y=dd$y ) ggplot(dd, aes(x,y)) + geom_line(color="black") + xlim(range(0, 45)) + # 把fill放到aes里,指定图例显示的文本 geom_area(data = subset(dd, x >41), aes(fill = "Election Window"), color="grey") + # 自定义填充色,将图例文本对应颜色设为灰色 scale_fill_manual(values = c("Election Window" = "grey")) + scale_x_discrete(limits=seq(from=0, to=45, by =5), labels=c("45", "40" , "35" , "30", "25","20","15" , "10" , "5" , "Election")) + theme_minimal() + labs(title="Local Election", y="Density", x="Distance to the election(in Months)", fill = "Legend Title") # 可自行修改图例标题
说明
通过把fill映射到aes()里的自定义字符串(比如"Election Window"),ggplot会自动将这个字符串作为图例项;再用scale_fill_manual把该字符串对应的颜色设置为灰色,最后通过labs()可以灵活修改图例的标题。
方法二:用空白图层手动生成图例(快速适配)
如果你不想改动太多原有代码,可以添加一个geom_blank图层来生成图例,再配合guides调整样式:
dd <- density(x, na.rm = TRUE) dd <- data.frame(x=dd$x,y=dd$y ) ggplot(dd, aes(x,y)) + geom_line(color="black") + xlim(range(0, 45)) + geom_area(data = subset(dd, x >41), color="grey", fill = "grey") + # 添加空白图层,通过映射fill触发图例生成 geom_blank(aes(fill = "Election Window")) + # 指定填充色,调整图例样式为实心方块 scale_fill_manual(values = "grey", guide = guide_legend(override.aes = list(linetype = 0, shape = 15))) + scale_x_discrete(limits=seq(from=0, to=45, by =5), labels=c("45", "40" , "35" , "30", "25","20","15" , "10" , "5" , "Election")) + theme_minimal() + labs(title="Local Election", y="Density", x="Distance to the election(in Months)", fill = "Legend Title")
说明
geom_blank不会绘制任何实际内容,但它的aes映射会让ggplot生成图例;我们用override.aes把图例的样式改成实心方块(对应灰色填充),这样就能快速得到符合需求的图例。
另外补充:原代码里的density(x, y, , na.rm = TRUE)是笔误,density()函数只需传入要计算密度的向量x即可,y是计算后得到的密度值,不需要额外传入。
内容的提问来源于stack exchange,提问作者Tiago Ventura
相关产品推荐
相关产品推荐

