ggplot薪资统计可视化:如何优化多变量分布对比图表?
薪资分布可视化方案优化
问题核心
你需要对比两个同城市数据集里4组薪资变量(data_1$New_wage、data_1$Old_wage、data_2$New_wage、data_2$Old_wage)的分位数分布,以及中位数/均值的差异。当前用密度图叠加的方式效果差,核心原因是两组数据集的薪资跨度差距极大(data1薪资集中在500-2400,data2在1700-2800),叠加后密度曲线重叠混乱,手动添加的中位数竖线也缺乏对应标识,可读性极低。
推荐的图表类型及实现
1. 分组箱线图(优先推荐)
箱线图天生为展示分位数统计量设计,能直接呈现最小值、第一四分位数、中位数、第三四分位数、最大值,同时清晰对比多组数据的中心趋势和离散程度。
步骤1:整理数据为长格式
ggplot对长格式数据支持更好,先合并数据集并添加分组标识:
library(tidyverse) # 转换data_1为长格式并添加数据集标识 data_1_long <- data_1 %>% mutate(Dataset = "data_1") %>% pivot_longer(cols = c(New_wage, Old_wage), names_to = "Wage_Type", values_to = "Wage") # 转换data_2为长格式并添加数据集标识 data_2_long <- data_2 %>% mutate(Dataset = "data_2") %>% pivot_longer(cols = c(New_wage, Old_wage), names_to = "Wage_Type", values_to = "Wage") # 合并两个长格式数据集 combined_data <- bind_rows(data_1_long, data_2_long)
步骤2:绘制分组箱线图
ggplot(combined_data, aes(x = interaction(Dataset, Wage_Type), y = Wage, fill = Wage_Type)) + geom_boxplot(width = 0.6, alpha = 0.7) + # 可选:添加均值点,和中位数做对比 stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "white") + labs( x = "数据集与薪资类型", y = "薪资", title = "四组薪资数据的分位数分布对比", fill = "薪资类型" ) + theme_classic() + # 旋转x轴标签避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
这个图表能直观看到每组数据的四分位距、中位数(箱线中间的实线)、均值(白色实心点),完全满足你展示分位数和中心趋势的需求。
2. 小提琴图+箱线图(进阶选择)
如果还想同时展示数据的密度分布形态,可将小提琴图和箱线图结合,兼顾统计量和分布特征:
ggplot(combined_data, aes(x = interaction(Dataset, Wage_Type), y = Wage, fill = Wage_Type)) + geom_violin(alpha = 0.5, scale = "width") + geom_boxplot(width = 0.2, alpha = 0.8) + stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "white") + labs( x = "数据集与薪资类型", y = "薪资", title = "薪资数据分布与分位数统计对比", fill = "薪资类型" ) + theme_classic() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
现有密度图的优化(若坚持使用)
如果一定要用密度图,建议用分面解决数据跨度差异问题,避免曲线重叠:
ggplot(combined_data, aes(x = Wage, fill = Wage_Type)) + geom_density(alpha = 0.6) + geom_vline(aes(xintercept = median(Wage)), color = "black", linetype = "dashed") + facet_wrap(~Dataset, scales = "free_x") + labs( x = "薪资", y = "密度", title = "不同数据集的薪资密度分布", fill = "薪资类型" ) + theme_classic()
分面后每个数据集单独展示,自动添加每组的中位数虚线,可读性大幅提升。
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

