能否用ggplot2绘制多模型分时段FEVD分组并排柱状图?
用ggplot2实现按时间点分组的FEVD并排柱状图
当然可以用ggplot2轻松实现你想要的效果!下面我会结合模拟数据和代码,一步步教你怎么做:
1. 先整理你的数据结构
首先确保你的数据集包含以下关键列:
Horizon: 时间点(比如1到16的数值或因子)Model: 模型名称(比如"模型1"、"模型2"、"模型3",最好设置为因子类型,保证绘图时顺序正确)FEVD: 预测误差方差分解的占比数值(比如0、5、3这类百分比数值)
这里我先模拟一份符合你需求的样本数据:
library(tidyverse) # 模拟样本数据 set.seed(123) # 保证结果可重复 fevd_data <- expand.grid(Horizon = 1:16, Model = paste0("模型", 1:3)) %>% mutate(FEVD = sample(c(0,3,5,8,10), nrow(.), replace = TRUE))
2. 绘制核心图表
这里提供两种常见的实现方式,你可以根据需求选择:
方式一:每个时间点作为独立分面,内部展示3个模型的并排柱子
这种方式每个时间点单独成一块,视觉上分组更清晰:
ggplot(fevd_data, aes(x = Model, y = FEVD, fill = Model)) + geom_col(width = 0.7, show.legend = FALSE) + # 绘制柱状图,隐藏重复图例 facet_wrap(~Horizon, nrow = 4) + # 按时间点分面,设置行数为4(可按需调整) labs( title = "各时间点下不同模型的FEVD占比", x = "模型", y = "FEVD占比(%)" ) + theme_minimal() + theme( strip.text = element_text(size = 10, face = "bold"), # 分面标题样式 plot.title = element_text(hjust = 0.5, size = 14, face = "bold") # 标题居中加粗 ) + scale_fill_brewer(palette = "Set2") # 设置柱子颜色
方式二:同一坐标轴下,每个时间点对应3个并排柱子
这种方式适合对比不同时间点之间的模型表现:
ggplot(fevd_data, aes(x = factor(Horizon), y = FEVD, fill = Model)) + geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 并排柱子设置 labs( title = "各时间点下不同模型的FEVD占比", x = "时间点(Horizon)", y = "FEVD占比(%)", fill = "模型" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.text.x = element_text(angle = 45, hjust = 1) # x轴标签倾斜,避免重叠 ) + scale_fill_brewer(palette = "Set2")
3. 自定义调整细节
如果你需要更个性化的效果,可以做这些调整:
- 如果你的FEVD是小数(比如0.05代表5%),可以用
scale_y_continuous(labels = scales::percent)将y轴转为百分比显示 - 可以用
geom_text()在柱子上方添加数值标签,比如:geom_text(aes(label = paste0(FEVD, "%")), position = position_dodge(width = 0.8), vjust = -0.5, size = 3) - 调整分面的排列方式:用
facet_grid()替代facet_wrap(),比如facet_grid(.~Horizon)可以让所有时间点横向排列
内容的提问来源于stack exchange,提问作者André Cordeiro Valério
相关产品推荐
相关产品推荐

