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

ggplot多分组柱状图及interaction序列顺序问题求助

问题解决:多分组柱状图修正方案

问题分析

你的代码存在两个核心问题:

  1. 绘图时调用了未定义的df,实际数据框是df2
  2. 未指定因子水平,导致interaction生成的分组顺序混乱,不符合你期望的每个方法下按RMSE→MAE→MAPE排列,每个指标下包含train/test子组的顺序

修正后的完整代码

library(grid)
library(ggplot2)

# 构建数据
MethodA= rep(c("ARIMA"), 6) 
MethodB=rep(c("LSTM"), 6)
MethodC = rep(c("ARIMA-LSTM"),6)
MethodD=rep(c("SSA"),6)
Method=c(MethodA, MethodB, MethodC, MethodD)
Measure = rep(c("RMSE", "RMSE", "MAE", "MAE", "MAPE", "MAPE"), 4)
trtest=rep(c("train", "test"), 12)
Value=sample(x = 4000:7000, size = 24, replace = TRUE)
df2 <- data.frame(Method, Measure, trtest, Value)

# 指定因子水平,强制排序
df2$Method <- factor(df2$Method, levels = c("ARIMA", "LSTM", "ARIMA-LSTM", "SSA"))
df2$Measure <- factor(df2$Measure, levels = c("RMSE", "MAE", "MAPE"))

# 生成有序的交互分组
df2$Group <- interaction(df2$Method, df2$Measure, drop = TRUE)

dodge <- position_dodge(width = 0.9)
g1 <- ggplot(data = df2, aes(x = Group, y = Value, fill = trtest)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  coord_cartesian(ylim = c(0, 7500)) +
  # 标注方法名称(每个方法对应3个指标,取每组中间值定位)
  annotate("text", x = seq(2, 12, 3), y = -100,
           label = c("ARIMA", "LSTM", "ARIMA-LSTM", "SSA")) +
  # 标注指标名称
  annotate("text", x = 1:12, y = -200,
           label = rep(c("RMSE", "MAE", "MAPE"), 4)) +
  theme_classic() +
  theme(plot.margin = unit(c(1, 1, 4, 1), "lines"),
        axis.title.x = element_blank(),
        axis.text.x = element_blank())

# 移除面板裁剪,显示底部注释
g2 <- ggplot_gtable(ggplot_build(g1))
g2$layout$clip[g2$layout$name == "panel"] <- "off"
grid.draw(g2)

关键修正点说明

  • 替换数据框:将ggplot中的data = df改为data = df2,解决未定义对象的报错
  • 强制因子顺序:通过factor()给Method和Measure指定自定义水平,确保交互分组的顺序严格符合你的预期
  • 调整交互分组:显式生成Group列,基于排序后的Method和Measure,保证分组逻辑为「ARIMA→RMSE/MAE/MAPE→train/test」
  • 修正注释坐标:根据新的分组数量(4个方法×3个指标=12个主分组)调整注释的x坐标,确保标注与分组一一对应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:54:14