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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:44:55