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

如何在ggplot直方图中结合exercise_style因子分组对比before-after数据?

结合Exercise Style分组展示Before/After对比直方图

嘿,先帮你修正代码里的几个小问题:你的CSV列名是before/after/Style,但代码里用了Exercise_before这类不匹配的变量名,还有frame1里的hours明显是笔误,应该对应Style列对吧?先把这些基础问题理顺,再实现按Style分组的效果。

先搞定数据预处理(匹配你的CSV结构)

library(ggplot2)
library(reshape2)

# 读取你的CSV,确保列名和文件一致
responses <- read.csv("dataframe.csv")
# 把Style转为因子,方便后续分组
responses$Style <- as.factor(responses$Style)
# 确保before和after是数值型(避免读取时意外变成字符)
responses$before <- as.numeric(as.character(responses$before))
responses$after <- as.numeric(as.character(responses$after))

# 重塑数据:把before和after转成键值对,保留Style作为分组依据
frame2 <- melt(responses, id.vars = "Style", measure.vars = c("before", "after"))

接下来给你两种常用的分组展示方式,按需选择:


方案1:用分面把不同Style拆成独立子图

这种方式会给每个Style单独生成一个Before/After对比图,能清晰看到每个分组内部的变化:

ggplot(frame2, aes(x = variable, y = value, fill = variable)) +
  geom_bar(stat = "identity", position = "dodge") +
  # 按Style分面,每个子图对应一种风格
  facet_wrap(~ Style) +
  # 自定义标签让图表更清晰
  labs(title = "Before vs After by Exercise Style", 
       x = "Time Point", 
       y = "Value") +
  # 给before/after设置辨识度高的颜色
  scale_fill_manual(values = c("before" = "#2c3e50", "after" = "#e74c3c"))

方案2:同一图表内按Style+时间点分组

如果想直接对比不同Style之间的Before/After差异,把Style放在x轴,每个Style下并排展示before和after的柱子:

ggplot(frame2, aes(x = Style, y = value, fill = variable)) +
  # 调整柱子的间距,避免重叠
  geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) +
  labs(title = "Before vs After by Exercise Style", 
       x = "Exercise Style", 
       y = "Value") +
  scale_fill_manual(values = c("before" = "#2c3e50", "after" = "#e74c3c")) +
  # 旋转x轴标签,避免拥挤
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

额外提示:如果是多样本数据,展示均值更合理

你的示例数据里每个Style有多个数据点,直接用stat="identity"会把数值相加,要是想展示每个分组的均值+误差棒(更科学的统计展示),可以用这个代码:

ggplot(frame2, aes(x = Style, y = value, fill = variable)) +
  # 绘制均值柱子
  stat_summary(fun = mean, geom = "bar", position = position_dodge()) +
  # 添加标准差误差棒
  stat_summary(fun.data = mean_se, geom = "errorbar", 
               position = position_dodge(width = 0.9), width = 0.2) +
  labs(title = "Mean Before vs After by Exercise Style", 
       x = "Exercise Style", 
       y = "Mean Value") +
  scale_fill_manual(values = c("before" = "#2c3e50", "after" = "#e74c3c"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:43:13