ggplot绘制柱状图自定义Y轴主网格线代码不生效问题
问题原因
代码不生效的核心错误是Y轴使用了错误的刻度函数:
- 你调用的
scale_y_discrete()是离散分类轴专用函数,仅适用于Y值为分类/字符类型的场景 - 你的图表Y轴是堆叠柱状图的计数总和,属于连续数值类型,给离散轴传入连续数值断点
seq(0,20,2)时,ggplot2不会抛出报错,但会直接忽略不匹配的断点设置,最终使用默认刻度输出。
另外你的原始数据中value列被设置为字符串类型的"1",也会干扰ggplot对轴类型的自动判断。
修复方案
- 将
value列改为数值类型,避免类型识别偏差 - 将Y轴刻度函数替换为连续轴专用的
scale_y_continuous(),在函数内指定你需要的断点和轴范围
修正后的完整可运行代码:
library(tidyverse) Grade <- c(rep("6th" , 12) , rep("7th" , 13) , rep("8th" , 16) , rep("9th" , 9), rep("10th" , 10) , rep("11th" , 6), rep("12th" , 3)) Gender <- c(rep("Male" , 5), rep("Female" , 7), rep("Nonbinary" , 0), rep("Male" , 5), rep("Female" , 8), rep("Nonbinary" , 0), rep("Male" , 7), rep("Female" , 8), rep("Nonbinary" , 1), rep("Male" , 4), rep("Female" , 4), rep("Nonbinary" , 1), rep("Male" , 6), rep("Female" , 4), rep("Nonbinary" , 0), rep("Male" , 2), rep("Female" , 4), rep("Nonbinary" , 0), rep("Male" , 0), rep("Female" , 3), rep("Nonbinary" , 0)) value <- rep(1, 69) datas <- data.frame(Grade,Gender,value) datas <- datas %>% arrange(desc(Grade)) %>% mutate(rank = c(rep("4" , 9) , rep("3" , 16) , rep("2" , 13) , rep("1" , 12), rep("7" , 3) , rep("6" , 6), rep("5" , 10))) %>% arrange(desc(rank)) ggplot(datas, aes(x = rank, y = value, fill = Gender)) + geom_col(position = position_stack(reverse = TRUE)) + scale_x_discrete(labels=c("1" = "6th", "2" = "7th","3" = "8th","4" = "9th", "5" = "10th", "6" = "11th", "7" = "12th")) + scale_y_continuous(breaks = seq(0,20,2), limits = c(0,20)) + xlab('Grade') + ylab('')
运行代码后即可实现Y轴0-20范围、每间隔2个单位显示一条主网格线的预期效果。
原始错误代码输出效果参考:
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

