如何在不拆分分布的情况下按指定值为ggplot2密度图分色?
解决ggplot密度图按平均值分色不拆分图形的问题
直接把fill=AV<平均值映射给geom_density会让ggplot把数据拆分成两组分别计算密度,导致出现虚假的双峰。要保留单峰形态并分色,需要让密度基于整个数据集计算,再按平均值分割填充区域,修改后的代码如下:
首先计算平均值(也可以直接用你指定的602226.34):
avg_val <- mean(FY23$AV, na.rm = TRUE)
修改后的绘图代码:
ggplot(FY23, aes(x = AV)) + # 用stat_density绘制连续的密度面积图,按x与平均值的关系分色 stat_density(aes(fill = after_stat(x < avg_val)), geom = "area", group = 1, # 强制整个数据集作为一个组计算密度 alpha = 0.7) + labs(x = "House Value", y = "Count", title = "Frequency of Housing Values") + scale_x_continuous(breaks = c(250000, 500000, 750000, 1000000, 1250000), labels = c("$250,000", "$500,000", "$750,000", "$1,000,000", "$1,250,000"), limits = c(50000, 1250000)) + scale_y_continuous(breaks = c(0, 0.000002, 0.000004, 0.000006), labels = c("0", "500", "1,000", "1,500")) + geom_vline(xintercept = 576200, linetype = "dashed") + annotate(x = 576200, y = +Inf, label = "Median", vjust = 4, geom = "label") + scale_fill_discrete(name = "FY 23 Average Home Value", labels = c("Above Average", "Below Average")) + theme_minimal()
关键改动说明:
stat_density搭配geom="area"替代原geom_density,确保密度曲线基于全量数据计算。group=1强制ggplot不按fill的分类拆分数据,保留单峰形态。after_stat(x < avg_val)在密度计算完成后,根据每个x坐标与平均值的关系分配填充色,实现单峰曲线的分区域着色。
内容的提问来源于stack exchange,提问作者Rmullen53
相关产品推荐
相关产品推荐

