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
相关产品推荐
相关产品推荐

