如何在R语言ggplot2中调整Y轴并修改分组柱状图样式
求助:调整ggplot2分组柱状图至目标样式
我用R语言的ggplot2包编写了分组柱状图代码,读取mae_random.csv数据生成图表,但希望修改为指定的目标样式,不清楚如何调整代码,寻求帮助。
当前代码
# Install and load necessary packages library(ggplot2) library(tidyr) # Your data data <- read.csv("./mae_random.csv") # Reshape data for ggplot data_long$Model.Names <- factor(data_long$Model.Names, levels = unique(data$Model.Names)) # Define colors for each Model Name model_colors <- c("#1f78b4", "#33a02c", "#e31a1c", "#ff7f00", "#6a3d9a", "#a6cee3", "#b2df8a", "#fb9a99", "#fdbf6f", "#cab2d6", "#ffff99") # Create grouped bar chart with increased size and custom colors ggplot(data_long, aes(x = Model.Names, y = Value, fill = Model.Names)) + geom_bar(position = position_dodge2(width = 1.2, preserve = "single"), stat = "identity", color = "black") + labs(title = "Grouped Bar Chart", x = "Model Names", y = "Mean Absolute Error") + scale_y_continuous(breaks = seq(0, max(data_long$Value), by = 0.1)) + scale_fill_manual(values = model_colors) + theme_minimal() + theme( plot.title = element_text(size = 16, hjust = 0.5), axis.text.x = element_text(angle = 45, hjust = 1), axis.title.x = element_text(size = 14), axis.title.y = element_text(size = 14), axis.text.y = element_text(size = 12), legend.title = element_text(size = 12), legend.text = element_text(size = 10), plot.margin = margin(1, 1, 1, 1, "cm") )
当前生成图表

目标样式图表

CSV数据结构
Model Names,TPE,Random,Grid SVM MACCS,0.36,0.41,0.39 SVM Morgan,0.27,0.28,0.27 RF MACCS,0.31,0.31,0.26 RF Morgan,0.24,0.24,0.24 XGBoost MACCS,0.4,0.36,0.32 XGBoost Morgan,0.37,0.42,0.34 FFNN MACCS,0.7,0.67,0.64 FFNN Morgan,0.41,0.4,0.46 GCN,0.72,0.7,0.63 DMPNN,0.63,0.63,0.59 MAT,0.56,0.65,0.66
修正后的代码及说明
调整后的完整代码
library(ggplot2) library(tidyr) # 读取数据 data <- read.csv("./mae_random.csv") # 修正数据重塑:将宽格式转为长格式,提取优化方法(TPE/Random/Grid)作为分组 data_long <- pivot_longer(data, cols = c(TPE, Random, Grid), names_to = "Optimizer", values_to = "MAE") # 设置模型名称的顺序,保持和原数据一致 data_long$Model.Names <- factor(data_long$Model.Names, levels = data$Model.Names) # 定义目标图表的配色(对应TPE/Random/Grid) optimizer_colors <- c("#1f78b4", "#ff7f00", "#33a02c") # 绘制目标样式的分组柱状图 ggplot(data_long, aes(x = Model.Names, y = MAE, fill = Optimizer)) + geom_bar(position = position_dodge(width = 0.8), stat = "identity", color = "black", width = 0.7) + labs(title = "Mean Absolute Error by Model and Optimizer", x = "Model Names", y = "Mean Absolute Error", fill = "Optimizer") + scale_y_continuous(breaks = seq(0, 0.8, by = 0.1), limits = c(0, 0.8)) + scale_fill_manual(values = optimizer_colors) + theme_minimal() + theme( plot.title = element_text(size = 16, hjust = 0.5), axis.text.x = element_text(angle = 45, hjust = 1, size = 10), axis.title.x = element_text(size = 14), axis.title.y = element_text(size = 14), axis.text.y = element_text(size = 12), legend.title = element_text(size = 12), legend.text = element_text(size = 10), panel.grid.major.x = element_blank(), # 去掉垂直网格线,和目标图一致 plot.margin = margin(1, 1, 1, 1, "cm") )
关键调整点
- 修正数据重塑:原代码未定义
data_long,使用pivot_longer将TPE/Random/Grid列转为分组列Optimizer,这是实现目标分组样式的核心——按优化方法而非模型填充颜色。 - 调整映射关系:将
fill映射改为Optimizer,确保每个模型下的三个柱子对应三种优化方法,颜色按方法区分。 - 修正柱子排列:使用
position_dodge(width = 0.8)替代原position_dodge2,让分组柱子紧凑排列,和目标图一致。 - 配色调整:使用三种颜色对应目标图的三个优化方法,而非原代码的11种模型颜色。
- 主题优化:移除垂直网格线,调整Y轴范围(适配最大值0.72),让图表更贴近目标样式。
内容的提问来源于stack exchange,提问作者Zayyan Masud
相关产品推荐
相关产品推荐

