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

求助用R语言ggplot2绘制双连续变量的累积直方图

如何用ggplot2绘制两个连续变量的累积直方图

我明白你想要对比家庭总收入和单个成员收入的累积分布,之前的代码确实在分组逻辑和参数设置上有几个关键问题,我来一步步帮你修正并实现目标:

先说说你之前代码的问题

  • 你把连续变量individual用作group和fill参数,这是不对的——连续变量会被拆成无数个独立分组,ggplot根本没法识别你要对比的是「家庭收入」和「个人收入」这两个类别
  • 没有开启累积模式,默认的geom_histogram是普通的频数直方图,不是你要的累积效果
  • colour参数的写法有误,颜色映射应该配合手动比例尺来设置,而不是直接放在aes外面

正确的实现步骤

要对比两个连续变量的累积分布,核心是先把数据转换成长格式,这样ggplot才能正确识别我们要对比的两个类别。

1. 整理数据(转长格式)

我们需要把原来宽格式里的household和individual两列,转换成「收入类型」和「收入值」两列,用tidyr包的pivot_longer就能轻松搞定:

# 先加载需要的包
library(ggplot2)
library(tidyr)

# 把宽格式数据转成长格式
df_long <- df %>%
  pivot_longer(
    cols = c(household, individual),  # 指定要转换的两列
    names_to = "income_type",         # 新列:标记是家庭收入还是个人收入
    values_to = "income_value"        # 新列:存储具体的收入数值
  )

2. 绘制累积直方图

现在用整理好的长格式数据绘图,设置累积模式、分组颜色等:

ggplot(df_long, aes(x = income_value, fill = income_type, color = income_type)) +
  # 核心:开启累积统计,设置重叠显示
  geom_histogram(
    stat = "count",          # 统计累积频数
    cumulative = TRUE,       # 开启累积模式
    alpha = 0.6,             # 设置填充透明度,方便查看重叠部分
    position = "identity",   # 让两个直方图重叠,而非堆叠
    bins = 30                # 可以根据数据调整分箱数量
  ) +
  # 手动设置你想要的颜色:家庭收入蓝色,个人收入红色
  scale_fill_manual(values = c("household" = "blue", "individual" = "red")) +
  scale_color_manual(values = c("household" = "blue", "individual" = "red")) +
  # 设置x轴范围,和你之前的需求一致
  xlim(0, 350000) +
  # 添加标签让图表更清晰
  labs(
    x = "收入",
    y = "累积计数",
    fill = "收入类型",
    color = "收入类型",
    title = "家庭总收入与单个成员收入的累积直方图"
  ) +
  # 用简洁的主题美化图表
  theme_minimal()

3. 可选:绘制累积密度直方图

如果你想要看的是累积概率分布(y轴是0到1的累积密度),只需要把stat改成"density"即可:

ggplot(df_long, aes(x = income_value, fill = income_type, color = income_type)) +
  geom_histogram(
    stat = "density",
    cumulative = TRUE,
    alpha = 0.6,
    position = "identity",
    bins = 30
  ) +
  scale_fill_manual(values = c("household" = "blue", "individual" = "red")) +
  scale_color_manual(values = c("household" = "blue", "individual" = "red")) +
  xlim(0, 350000) +
  labs(
    x = "收入",
    y = "累积密度",
    fill = "收入类型",
    color = "收入类型",
    title = "家庭总收入与单个成员收入的累积密度直方图"
  ) +
  theme_minimal()

这样应该就能得到你想要的类似示例的累积直方图啦~

内容的提问来源于stack exchange,提问作者Emeline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:43:11