RStudio中VAR/SVAR模型FEVD图表重叠问题的优化咨询
解决VAR/SVAR模型FEVD图表重叠、图例显示不全的问题
问题描述
对14个变量拟合VAR/SVAR模型后绘制FEVD(预测误差方差分解)图表时,出现以下问题:
- 图表元素严重重叠
- 变量颜色图例显示不全,且部分区域与图表重叠
- 调整
par("mar")参数无效果
附示例数据及原绘图代码:
# 示例数据 data <- structure(c(-15.128286545, 9.54362378, -3.183102118, 2.455920412, 2.291578693, -2.375566455, -1.006170511, -0.3, 0.2, 0.07, -1.48, 1.66, 0.23, 2.69, 0.139816501, -0.067264912, 0.00820542499999988, 0.601791352, -0.534672832, 0.448348103, 0.201531496, 1.912707215, -2.298881719, 2.250845193, -100.270023362, 168.06388869, -29.13957144, -5.96895973, -65.094658064, 69.084085184, 77.852479576, -115.75847262, 1.07846378, 124.53936952, -136.67294405, 0.763694729, -3.181436503, 0.357452785, 1.419643891, -1.352477057, -0.352129671, -0.518658596,-40.982268397, 15.10208529, 8.81612737, 14.742141917, 0.331767914, -3.388439373, -1.705233303, 9.716651558, 17.163282893, -26.403831865, 5.522207566, -6.267360551, 8.793307298, 0.68190014, 6.571072841, 10.734436876, -15.768737701, 3.732193641, -3.013388691, 2.257042669, -3.092580854, -7.590788096, -0.377256109, -1.954321683, -0.655236714, 8.787007941, -11.048392421, -11.771665078, -9.286360071, 0.672766377, 4.540993395, -22.771472581, 33.33956332, -21.892993669, 3.082682577, -18.404892011, 6.039591015, -8.744388675, 4.5514676, 3.81637218,-8.616022054, 10.73600499, -27.792088246, 27.763201157, -20.582295417, 36.58994891, -33.462654905, 8.941944848, 4.666353971, -0.492222954, 0.443107902, -0.444468843, 0.378535534, 0.363633632, -0.396522691, 0.164774515), dim = c(7L, 14L), dimnames = list(NULL, c("QIM", "ML", "WPI", "BOT", "FDI", "TX", "FBT", "CP", "PHA", "NM", "AUT", "ISP", "FER", "ER"))) # 原绘图代码(假设estim已完成VAR拟合) vd <- fevd(estim, n.ahead=36) par(mar=c(1.2,5,1.5,4.7)) plot(vd)
解决方案
1. 调整绘图窗口尺寸与基础布局
vars包默认的FEVD绘图布局在变量较多时容易拥挤,可通过以下方式优化:
- 手动拖大RStudio绘图窗口,或用
dev.new()指定更大的画布尺寸:
dev.new(width = 12, height = 8) # 可根据变量数量灵活调整宽高 plot(vd)
- 使用
gridExtra包自定义子图布局,分散14个变量的FEVD子图:
library(gridExtra) # 将14个FEVD子图拆分为3行5列(可按需调整行列数) fevd_plots <- lapply(names(vd), function(var) { plot(vd[[var]], main = var, plot.type = "single", mar = c(3,3,2,1)) }) grid.arrange(grobs = fevd_plots, nrow = 3, ncol = 5)
2. 直接修改plot.fevd的参数
给plot()函数传递专属参数控制图例和间距:
- 调整图例位置与大小:用
legend.pos指定图例位置,legend.cex缩小图例文字:
plot(vd, legend.pos = "bottomright", legend.cex = 0.7)
- 手动设置子图边距与外间距:直接在
plot()中传递mar和oma参数(vars的plot.fevd支持该参数):
plot(vd, mar = c(4, 4, 2, 1), oma = c(0, 0, 2, 0)) # oma控制整体外边框距
3. 用ggplot2重绘FEVD(完全自定义样式)
将FEVD数据转换为长格式,用ggplot2实现精细化控制:
library(ggplot2) library(tidyr) # 将FEVD对象转换为可用于ggplot的数据框 fevd_df <- do.call(rbind, lapply(names(vd), function(response_var) { df <- as.data.frame(vd[[response_var]]) df$horizon <- 1:nrow(df) df$response_var <- response_var pivot_longer(df, cols = -c(horizon, response_var), names_to = "shock_var", values_to = "contribution") })) # 绘制分面FEVD图 ggplot(fevd_df, aes(x = horizon, y = contribution, color = shock_var)) + geom_line(linewidth = 0.8) + facet_wrap(~response_var, nrow = 3, ncol = 5) + # 按需调整行列数 labs(x = "预测期", y = "方差贡献占比", color = "冲击变量") + theme_minimal() + theme(legend.position = "bottom", legend.text = element_text(size = 8), axis.text = element_text(size = 7), strip.text = element_text(size = 9))
4. 精简变量(可选)
如果14个变量中有高度相关或逻辑上可合并的变量,可先合并变量后再绘制FEVD,从根源减少子图数量,避免拥挤。
内容的提问来源于stack exchange,提问作者Adeel Ahmed
相关产品推荐
相关产品推荐

