如何用ggplot2绘制以year为横轴、income为纵轴的双变量直方图?
在R中实现按年份展示收入分布的直方图
你要的需求本质是按年份分组展示收入的分布特征,传统直方图仅针对单变量做频数统计,没法直接满足双变量关联展示的需求。下面用ggplot2包给出几种贴合需求的实现方案:
1. 分面直方图(最清晰的年份分布展示)
这种方式给每个年份单独生成一个收入分布的直方图,适合直观对比各年份收入的分布差异:
首先模拟示例数据集(你可以替换成自己的真实数据):
set.seed(123) # 固定随机种子,保证结果可复现 df <- data.frame( year = rep(2018:2022, each = 200), income = c(rnorm(200, 50000, 8000), rnorm(200, 55000, 9000), rnorm(200, 60000, 10000), rnorm(200, 62000, 11000), rnorm(200, 65000, 12000)) )
然后绘制分面直方图:
library(ggplot2) ggplot(df, aes(x = income)) + geom_histogram(bins = 15, fill = "#2E86AB", color = "white") + facet_wrap(~ year, nrow = 1) + # 按年份横向分面排列 labs(x = "收入", y = "频数", title = "各年份收入分布直方图") + theme_minimal()
2. 分组直方图(同一图内对比年份分布)
如果想把所有年份的收入分布放在同一个图里,用颜色区分年份:
ggplot(df, aes(x = income, fill = factor(year))) + geom_histogram(bins = 15, position = "dodge", color = "white") + labs(x = "收入", y = "频数", fill = "年份", title = "各年份收入分布对比") + theme_minimal()
3. 柱状图展示收入汇总值(若需求是年份-收入统计量对应)
如果你其实想展示每年收入的统计值(比如均值、中位数)(而不是分布),那柱状图更贴合需求,因为直方图纵轴默认是频数/密度,而非收入本身的数值:
# 先计算每年的平均收入 year_income_stats <- aggregate(income ~ year, data = df, mean) ggplot(year_income_stats, aes(x = factor(year), y = income)) + geom_col(fill = "#2E86AB", color = "white") + labs(x = "年份", y = "平均收入", title = "各年份平均收入") + theme_minimal()
补充说明
传统直方图的核心是展示单个连续变量的分布,当需要结合分类变量(year)时,本质是对连续变量(income)做分组后再展示分布,上述方案可以根据你的实际需求选择。
内容的提问来源于stack exchange,提问作者Tutor GRRR
相关产品推荐
相关产品推荐

