ggplot多分组柱状图及interaction序列顺序问题求助
问题解决:多分组柱状图修正方案
问题分析
你的代码存在两个核心问题:
- 绘图时调用了未定义的
df,实际数据框是df2 - 未指定因子水平,导致
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
相关产品推荐
相关产品推荐

