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

R语言使用dplyr生成频率表并结合ggplot绘制分组直方图

dplyr管道直连ggplot实现分箱状态频数绘图

实现逻辑

  • 全程通过dplyr管道%>%串联全流程,不单独存储任何中间计算结果,分箱、频数统计完成后直接将结果传入ggplot绘图
  • 等宽分箱在mutate()步骤内调用cut()完成,默认按需求设置5单位等宽区间,覆盖0-100取值范围
  • 按「参考值分箱+传感器状态」双维度分组统计频数,提前将status转为因子,避免绘图时分类顺序错乱
  • 采用分面柱状图展示结果,每个分面对应一个参考值区间,柱子高度对应该区间内不同传感器状态的出现频数

完整可运行代码

library(dplyr)
library(ggplot2)

# 示例数据
sample1 <- structure(list(test_data = c(1.2, 0.2, 0.6, 1.6, 1, 1, 0.4, 
0.4, 0.8, 0.8, 0.4, 0.2, 15.8, 59.2, 55.4, 54.8, 54.6, 54.2, 
49, 53, 47.2, 44, 40.2, 39, 34.2, 35.8, 33.4, 30.6, 29.4, 29.2, 
27.6, 24.8, 24, 22, 21.2, 20.6, 18.6, 18, 17, 17.2, 14.8, 15.2, 
13.2, 13.4, 12, 11.8, 11, 10.8, 10, 9.2, 8.8, 8.8, 8.4, 7.8, 
7.6, 6.6, 6.4, 6.2, 6, 5.8, 5.4, 5, 4.8, 4.4, 4.2, 4, 3.8, 3.6, 
3.6, 3.6, 3, 2.8, 3, 2.8, 2.6, 2.4, 2.4, 2.2, 2, 2.2, 2.2, 1.8, 
1.8, 1.6, 1.8, 1.8, 2.2, 71.2, 75.8, 74.6, 74.6, 74.2, 67.2, 
66.2, 60.6, 60.6, 54.8, 53.6, 48.4, 45.2), status = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), row.names = 113:212, class = "data.frame")

# 全流程管道串联:分箱→计数→绘图
sample1 %>%
  mutate(
    # 生成5单位等宽分箱
    test_bin = cut(
      test_data,
      breaks = seq(0, 100, 5),
      # 自定义区间标签为"1-5""6-10"格式
      labels = paste0(seq(1, 96, 5), "-", seq(5, 100, 5)),
      include.lowest = TRUE
    ),
    # 固定status分类顺序
    status = as.factor(status)
  ) %>%
  # 按分箱、状态分组统计频数
  count(test_bin, status, name = "freq") %>%
  # 直接传入ggplot绘图
  ggplot(aes(x = status, y = freq, fill = status)) +
  geom_col(width = 0.7) +
  # 按分箱分面,每个分面对应一个参考值区间
  facet_wrap(~test_bin, scales = "free_y") +
  labs(
    x = "传感器状态值",
    y = "频数",
    fill = "传感器状态",
    title = "不同参考值区间下的传感器状态频数分布"
  ) +
  theme_bw()

参数调整说明

  • 若需修改分箱宽度,仅需调整seq()函数的步长参数,对应标签生成的步长同步修改即可
  • 若需严格从1开始分箱、排除小于1的观测,可将breaks参数修改为seq(1,100,5),同步调整标签序列,在count步骤前加filter(!is.na(test_bin))过滤无效值即可
  • 无观测值的高值区间(如示例数据未覆盖的76-80、81-85等区间)会自动不展示,无需额外过滤
  • 若需单独输出每个区间的单图而非分面合并图,可将ggplot部分替换为group_walk()函数实现分图输出,全程仍无需存储中间表

内容的提问来源于stack exchange,提问作者trailblazer_1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:45:37