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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:35:41