geom_bar绘图中Y轴指定刻度未显示的问题求助
解决ggplot2 Y轴刻度不显示及数值格式问题
问题根源
- 你的
value列是字符类型(从数据结构可见,数值被包裹在引号中),且部分值存在空格(如"158 .277"),导致ggplot无法正确识别为连续数值。 - 错误使用
scale_y_discrete()处理连续型数据:你要展示的是连续性能数值,却用了离散型刻度设置,导致指定的数值breaks无法匹配字符型数据,刻度不显示。
解决步骤
- 清理并转换数值列:先去除
value中的空格,再转为数值类型。 - 替换刻度设置函数:用
scale_y_continuous()替代scale_y_discrete(),指定整数刻度的breaks,同时可通过labels参数强制显示整数格式。 - 保留原有图表主题和分面设置。
完整修正代码
# 加载包 library(ggplot2) # 数据(直接用dput的结构,也可以读取csv后处理) data <- structure(list(specie = c("gmx mdrun -s benchMEM.tpr -nsteps 10000", "gmx mdrun -s benchMEM.tpr -nsteps 10000", "gmx mdrun -s benchPEP.tpr -nsteps 10000 ", "gmx mdrun -s benchPEP.tpr -nsteps 10000 ", "gmx mdrun -s benchPEP-h.tpr -nsteps 10000 ", "gmx mdrun -s benchPEP-h.tpr -nsteps 10000 ", "gmx mdrun -s MD_5NM_WATER.tpr -nsteps 10000 ", "gmx mdrun -s MD_5NM_WATER.tpr -nsteps 10000 ", "gmx mdrun -s data/MD_10NM_WATER.tpr -nsteps 10000 ", "gmx mdrun -s data/MD_10NM_WATER.tpr -nsteps 10000 ", "gmx mdrun -s MD_15NM_WATER.tpr -nsteps 10000 ", "gmx mdrun -s MD_15NM_WATER.tpr -nsteps 10000 "), condition = c("CUDA", "SYCL", "CUDA", "SYCL", "CUDA", "SYCL", "CUDA", "SYCL", "CUDA", "SYCL", "CUDA", "SYCL"), value = c("54.682", "77.649", "0.673", "0.841", "0.86", "0.986", "452.48", "158 .277", "81.426", "80.454", "33.449", "34.363")), class = "data.frame", row.names = c(NA, -12L)) # 处理value列:去除空格,转为数值 data$value <- as.numeric(gsub(" ", "", data$value)) # 绘制图表 myplot <- ggplot(data, aes(fill=condition, y=value, x=condition)) + geom_bar(position="dodge", stat="identity") + scale_fill_manual(values=c("#ffffb2", "#fecc5c"))+ # 用连续型刻度设置,指定整数breaks,labels强制显示整数 scale_y_continuous(breaks=c(0,10,20,30,40,50,60,70,80,100,450), labels=as.character(c(0,10,20,30,40,50,60,70,80,100,450)))+ ylab("Performance (ns/day) on Extreme") + facet_wrap(~specie,nrow=3, labeller = label_wrap_gen(width = 85)) + theme_bw() + theme(panel.grid = element_blank(), panel.spacing = unit(0, "mm"), legend.title=element_blank(), axis.title.x = element_blank(), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) # 叠加最终主题设置 myplot + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.title=element_blank(), panel.background = element_blank(), axis.title.x = element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank(), axis.title.y = element_text(angle = 90, hjust = 0.5, size = 20))
关键说明
gsub(" ", "", data$value):清理数值中的空格(如"158 .277"转为"158.277"),确保转数值时不报错。scale_y_continuous():针对连续型Y轴设置刻度,breaks包含你需要的整数刻度(额外添加了0、100、450适配数据最大值),labels参数确保刻度显示为整数格式。- 若不需要显示超过80的刻度,可调整breaks为
c(0,10,20,30,40,50,60,70,80),但注意数据中有452.48这样的大值,图表会自动适配Y轴范围。
内容的提问来源于stack exchange,提问作者anikaM
相关产品推荐
相关产品推荐

