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

