You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不拆分分布的情况下按指定值为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:42:58