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

R/ggplot2条形图绘制失败求助:多类别副作用数据可视化

解决ggplot2绘制横向分组条形图的问题

嘿,我来帮你搞定这个条形图的问题!你目前的代码只是初始化了ggplot的基础框架,还缺了几个关键步骤——首先得把宽格式数据转换成ggplot更适配的长格式,然后添加几何对象来生成条形,最后设置你想要的颜色映射。

第一步:把宽数据转成长格式

你的数据现在是宽格式(每个作者对应三列副作用数据),而ggplot需要长格式(每一行对应一个作者+一种副作用类型+对应人数)。我们可以用tidyr包的pivot_longer函数来转换:

# 先加载需要的包
library(ggplot2)
library(tidyr)

# 转换数据格式
d_long <- pivot_longer(
  data = d,
  cols = c(nAE, AE, SAE),  # 要转换的列
  names_to = "side_effect",  # 新的分类列名称
  values_to = "patient_count"  # 新的数值列名称
)

转换后的数据结构会变成这样(前几行示例):

# A tibble: 18 × 3
  author       side_effect patient_count
  <fct>        <chr>               <int>
1 Bahr et al   nAE                    22
2 Bahr et al   AE                      3
3 Bahr et al   SAE                     0
4 Fuller et al nAE                    34
...

第二步:绘制横向条形图

现在用转换后的长数据来画图,我们可以选择堆叠条形图(把三个副作用数值叠在一起)或者并列条形图(三个条形并排),两种方式都给你参考:

方式1:堆叠横向条形图

ggplot(data = d_long, aes(x = patient_count, y = author, fill = side_effect)) +
  geom_col(position = "stack") +  # 堆叠模式
  # 手动设置你要的颜色:nAE红、AE绿、SAE蓝
  scale_fill_manual(values = c("nAE" = "red", "AE" = "green", "SAE" = "blue")) +
  # 添加标题和轴标签
  labs(
    title = "药物A副作用研究统计",
    x = "患者人数",
    y = "研究作者",
    fill = "副作用类型"
  ) +
  theme_minimal()  # 用简洁的主题美化

方式2:并列横向条形图

如果你想让三个副作用的条形并排展示,只需要把position = "stack"改成position = "dodge":

ggplot(data = d_long, aes(x = patient_count, y = author, fill = side_effect)) +
  geom_col(position = "dodge") +  # 并列模式
  scale_fill_manual(values = c("nAE" = "red", "AE" = "green", "SAE" = "blue")) +
  labs(
    title = "药物A副作用研究统计",
    x = "患者人数",
    y = "研究作者",
    fill = "副作用类型"
  ) +
  theme_minimal()

为什么你的初始代码没成功?

你原来的代码ggplot(data=d, aes(x=nAE, y=author, fill=AE))有两个核心问题:

  1. 只映射了nAE和AE两个变量,完全没包含SAE,没法同时展示三个数值;
  2. fill映射的是数值型的AE列,而不是分类的副作用类型,ggplot没法正确识别颜色分组。

这样调整后就能得到你想要的效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:29