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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:54:00