R语言如何基于table对象绘制相对频率条形图
解决方案
报错原因
你遇到的报错是因为ggplot2仅支持传入数据框或可被fortify()方法转换的结构,table类对象无法直接作为绘图数据源。
更简便的完整实现(无需手动循环计算)
你可以直接用dplyr的分组汇总逻辑完成占比计算,全程用数据框结构,避免后续格式转换:
# 加载依赖包 library(dplyr) library(ggplot2) # 1. 计算目标占比 df_calc <- df %>% # 统计每个月+每个严重等级的事故数 count(Month, Accident_Severity, name = "count") %>% # 按严重等级分组,计算该月在该等级总事故中的占比 group_by(Accident_Severity) %>% mutate(ratio = round(count / sum(count), 3)) %>% ungroup() %>% # 把月份转成因子保证x轴顺序正确 mutate(Month = factor(Month, levels = sprintf("%02d", 1:12))) # 2. 绘制条形图 ggplot(df_calc, aes(x = Month, y = ratio, fill = as.factor(Accident_Severity))) + # 并排条形 geom_col(position = position_dodge(width = 0.8), width = 0.7) + # y轴格式转百分比 scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) + # 坐标轴和图例标签 labs( x = "事故发生月份", y = "同严重等级事故的月度占比", fill = "事故严重等级" ) + theme_bw()
注意:请根据你的实际数据集调整变量名的大小写,避免取值报错。
现有table对象的转换方法
如果你要继续使用已经计算好的pivot_rel table对象,可以先转成数据框再重构为绘图所需的长格式:
# table转数据框宽表 pivot_rel_df <- as.data.frame.matrix(pivot_rel) %>% # 把行名(月份)转为列 rownames_to_column("Month") %>% # 转成长格式适合ggplot pivot_longer( cols = -Month, names_to = "Accident_Severity", values_to = "ratio" ) %>% mutate( Month = factor(Month, levels = sprintf("%02d", 1:12)), Accident_Severity = as.factor(Accident_Severity) ) # 后续直接传入ggplot绘图即可,绘图逻辑和上面一致
内容的提问来源于stack exchange,提问作者Oliver F
相关产品推荐
相关产品推荐

