为ggplot分面密度图的每个分面添加均值竖线的技术问询
为每个分面绘制对应分组的均值竖线
嗨,我来帮你搞定这个需求!你当前的代码给所有分面加了统一的整体均值竖线,要实现每个分面显示自己对应分组的FOODEXP均值,这里有两种实用的方法:
方法1:提前计算分组均值(更直观可控)
先单独计算每个ADM1NAME分组的FOODEXP均值,再把这个结果传给geom_vline,这样每个分面会匹配到对应分组的均值:
# 加载dplyr用于数据分组计算(如果没装的话先运行install.packages("dplyr")) library(dplyr) # 计算每个ADM1NAME对应的FOODEXP均值,注意处理可能的NA值 group_means <- mexi_sf %>% group_by(ADM1NAME) %>% summarize(mean_foodexp = mean(FOODEXP, na.rm = TRUE)) # 绘制密度图+分组均值竖线 ggplot(mexi_sf, aes(FOODEXP)) + geom_density(alpha = 0.1, fill = "red", colour = "red") + facet_wrap(~ADM1NAME) + xlim(0, 436) + # 调用提前计算好的分组均值数据,绘制竖线 geom_vline(data = group_means, aes(xintercept = mean_foodexp), color = "blue", linetype = "dashed", size = 0.8) + ggsave("myplot.png")
方法2:用stat_summary自动计算(更简洁)
不需要提前处理数据,直接用stat_summary函数,它会自动按分面的分组(也就是ADM1NAME)计算均值并绘制竖线:
ggplot(mexi_sf, aes(FOODEXP)) + geom_density(alpha = 0.1, fill = "red", colour = "red") + facet_wrap(~ADM1NAME) + xlim(0, 436) + # stat_summary会自动按分面分组计算均值,绘制竖线 stat_summary(geom = "vline", aes(xintercept = stat(x)), fun = mean, na.rm = TRUE, color = "blue", linetype = "dashed", size = 0.8) + ggsave("myplot.png")
小提示
- 两种方法里都加了
na.rm = TRUE,是为了避免数据中存在NA值时导致均值计算失败,竖线无法显示; - 你可以调整
color、linetype、size这些参数,让竖线更符合你的可视化需求。
内容的提问来源于stack exchange,提问作者delcast
相关产品推荐
相关产品推荐

