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

R语言ggplot:变量子集设为填充与y轴的堆叠柱状图实现问询

嘿,咱们一步步拆解你的问题,帮你搞定这个绘图需求~

你的绘图需求完全可行!

不过得先调整下数据结构和ggplot的映射逻辑,咱们来逐个解决:

1. 先把数据结构捋顺

你已经做了熔解和过滤,但目前的md1可能还没匹配好Exp和Dur的对应关系。你需要的是长格式数据:

  • 一列存xExp/yExp这类分组(作为x轴)
  • 一列存对应的xDur/yDur数值(作为y轴)
  • 一列存Yes/No标记(作为堆叠填充色)

如果原始数据是宽格式(比如有xExp, yExp, xDur, yDur, Yes_No这些列),可以用pivot_longer来成对匹配Exp和Dur:

library(tidyr)
# 假设原始数据叫df,包含所有Exp、Dur和Yes_No列
md1 <- df %>%
  # 把所有Exp列转成长格式
  pivot_longer(cols = ends_with("Exp"), 
               names_to = "Exp_group", 
               values_to = "Exp_label") %>%
  # 把所有Dur列转成长格式
  pivot_longer(cols = ends_with("Dur"), 
               names_to = "Dur_group", 
               values_to = "Dur_value") %>%
  # 匹配Exp和Dur的分组(比如xExp对应xDur)
  filter(str_remove(Exp_group, "Exp") == str_remove(Dur_group, "Dur")) %>%
  # 只保留绘图需要的列
  select(Exp_group, Dur_value, Yes_No)

2. 修正ggplot代码

你之前的代码里fill=str_detect("Exp")是固定值,不会随数据变化,这是踩坑点!正确的映射应该把Yes_No作为填充,Exp_group(xExp/yExp)作为x轴,Dur_value作为y轴:

library(ggplot2)
ggplot(md1, aes(x = Exp_group, y = Dur_value, fill = Yes_No)) +
  geom_col(position = "stack") # geom_col和geom_bar(stat="identity")等价,更简洁

3. 关于是否保留更多Exp/Dur为单独列

绝对不建议保留宽格式的单独列!ggplot天生偏好长格式数据(一行对应一个观测),如果有更多比如zExp、zDur这类分组,只需要在pivot_longer里用匹配规则(比如ends_with("Exp"))就能自动把所有Exp列转成统一的分组列,对应的Dur列也会自动匹配,后续绘图代码完全不用改,扩展性极强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:10