如何使用dplyr为分组数据集中的各组绘制直方图?
用dplyr+ggplot2绘制分组数值直方图
要实现不同类别下的数值分布直方图,我们可以结合dplyr的管道语法让代码更连贯,搭配ggplot2完成绘图。group_by()主要用于分组数据计算,绘图时直接通过ggplot的分面或分组映射就能高效实现需求,以下是几种常见实现方式:
1. 加载所需包
library(dplyr) library(ggplot2)
2. 数据集(你的原始数据)
cat <- c(1, 0, 0, 1, 2, 1, 2, 3, 2, 1, 3) var <- c(10, 5, 3, 2, 5, 1, 2, 10, 50, 2, 30) df <- data.frame(cat, var)
3. 分面直方图(每个类别独立子图)
这种方式最直观,每个类别单独展示分布:
df %>% ggplot(aes(x = var)) + geom_histogram(bins = 5, fill = "steelblue", color = "white") + facet_wrap(~cat, ncol = 2) + # 按cat字段分面,设置2列布局 labs(title = "各类别数值分布直方图", x = "数值", y = "频数")
4. 重叠直方图(同一图中用颜色区分组别)
适合对比不同类别在相同数值区间的分布:
df %>% ggplot(aes(x = var, fill = factor(cat))) + geom_histogram(bins = 5, alpha = 0.7, position = "identity") + labs(title = "各类别数值分布重叠直方图", x = "数值", y = "频数", fill = "类别")
5. 堆叠直方图(数值区间内展示类别占比)
可以看到每个数值区间内各类型的数量分布:
df %>% ggplot(aes(x = var, fill = factor(cat))) + geom_histogram(bins = 5, position = "stack") + labs(title = "各类别数值分布堆叠直方图", x = "数值", y = "频数", fill = "类别")
用group_by()预处理后绘图
如果需要先通过group_by()手动计算分组频数再绘图,可以这样做(本质是统计后的柱状图):
df %>% group_by(cat, num_range = cut(var, breaks = 5)) %>% # 按类别+数值区间分组 summarise(count = n(), .groups = "drop") %>% # 计算每组频数,取消分组 ggplot(aes(x = num_range, y = count, fill = factor(cat))) + geom_col(position = "dodge") + # 并列柱状图 labs(title = "分组统计后的数值分布", x = "数值区间", y = "频数", fill = "类别")
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

