求助用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
相关产品推荐
相关产品推荐

