如何在R中对收入变量划分十分位并绘制指定可视化图表?
收入十分位划分与可视化解决方案
需求
- 给
despesa_llar数据集新增基于ingressosmensualsllar(家庭月收入)的十分位分组变量 - 绘制两张图表:
- 分组柱状图:X轴为收入十分位,Y轴为
despesamonetaria(货币支出),按grup_CNAE_Red类别填充 - 直方图:展示各收入十分位的观测频率
- 分组柱状图:X轴为收入十分位,Y轴为
数据集核心结构
structure(list(grup_CNAE_Red = structure(c("Habitatge", "Habitatge", "Habitatge", "Habitatge", "Comunicacions", "Restaurants i hotels", "Altres béns i serveis", "Aliments i begudes no alcohòliques", "Aliments i begudes no alcohòliques", "Aliments i begudes no alcohòliques", "Aliments i begudes no alcohòliques"), label = "grup_CNAE_Red", format.stata = "%35s"), despesatotal = structure(c(57629.21, 186827.47, 210879.71, 105439.85, 91381.21, 344980.45, 117155.39, 44334.78, 426350.53, 199874.51, 41750.52), label = "despesatotal", format.stata = "%9.0g"), despesamonetaria = structure(c(57629.21, 186827.47, 210879.71, 105439.85, 91381.21, 344980.45, 117155.39, 44334.78, 426350.53, 199874.51, 41750.52), label = "despesamonetaria", format.stata = "%9.0g"), ingressosmensualsllar = structure(c(782, 782, 782, 782, 782, 782, 782, 1283, 1283, 1283, 1283), label = "ingressosmensualsllar", format.stata = "%9.0g")), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
原代码问题点
- 绘制柱状图时误用原数据集
despesa_llar,但decile变量仅存在于处理后的renda_decils中 fill参数排序逻辑错误:reorder(despesamonetaria, grup_CNAE)写法颠倒,应基于grup_CNAE_Red排序- 直方图针对离散的十分位值,默认设置会出现bin宽度不合理的情况
修正后的完整代码
1. 生成收入十分位变量
# 加载必要工具包 library(dplyr) library(ggplot2) # 按月收入从低到高划分10组,新增十分位变量 renda_decils <- despesa_llar %>% mutate(decile = ntile(ingressosmensualsllar, 10)) %>% ungroup()
2. 绘制收入十分位频率直方图
ggplot(renda_decils, aes(x = factor(decile))) + geom_bar(fill = "#2c3e50") + # 用bar适配离散的十分位值,避免直方图bin宽度问题 labs( x = "收入十分位", y = "观测数量", title = "各收入十分位的观测频率分布" ) + theme_minimal()
3. 绘制按消费类别分组的支出柱状图
ggplot(renda_decils, aes(x = factor(decile), y = despesamonetaria, fill = grup_CNAE_Red)) + geom_col(position = "dodge", alpha = 0.8) + # position="dodge"实现类别并列显示 labs( x = "收入十分位", y = "货币支出", fill = "消费类别", title = "不同收入十分位的消费支出分布(按类别分组)" ) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

