使用scale_x_discrete添加次要网格线的方法及报错解决
给离散X轴添加次要网格线的解决方案
问题说明
使用scale_x_discrete时尝试添加minor_breaks参数报错,无法实现次要网格线效果。
报错信息(翻译后)
Error in discrete_scale(c("x", "xmin", "xmax", "xend"), "position_d", : 存在未使用的参数 (minor_breaks = c(1, 2, 3, ..., 52))
原因:scale_x_discrete是针对类别型轴的刻度设置工具,本身不支持minor_breaks参数,该参数仅适用于连续型轴配置(scale_x_continuous)。
解决方案
将X轴变量转为连续型处理,通过scale_x_continuous设置主、次要刻度,再配合主题样式启用次要网格线。修改后的完整代码如下:
library(tidyverse);library(scales) # 数据 w_dat <- structure(list(IDWeek = c(1, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52), race = c("W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W", "W"), FishPassage = c(3102, 8, 115, 197, 334, 1184, 67350, 80494, 351200, 1113, 217242, 1927, 219973, 104983, 85756, 66239, 75423, 140612, 33838, 10152)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L)) # 实现次要网格线的代码 ggplot(w_dat,aes(x=IDWeek,y=FishPassage, fill=race)) + geom_bar(stat='identity', show.legend=FALSE, width=1) + # width=1让柱子填满刻度区间,模拟离散轴效果 theme_bw(base_size = 9) + xlab("Week") + facet_grid(race~. , scales = "free_y") + scale_fill_brewer(palette = "Set1") + scale_y_continuous(labels=comma) + scale_x_continuous( limits = c(0.5, 52.5), # 调整范围让柱子居中对齐刻度 breaks = seq(1,52,3), # 设置主刻度(对应原离散轴的显示刻度) minor_breaks = seq(1,52,1), # 设置次要刻度(对应次要网格线) labels = as.character(seq(1,52,3)) # 主刻度显示的文本标签 ) + theme( panel.grid.minor.x = element_line(color = "gray80", linetype = "dashed"), # 自定义次要网格线样式 panel.grid.major.x = element_line(color = "gray60") )
关键调整说明
- 将
x=factor(IDWeek)改为x=IDWeek,把X轴转换为连续型变量 - 使用
scale_x_continuous替代scale_x_discrete,配置breaks(主刻度)和minor_breaks(次要刻度) - 给
geom_bar添加width=1,让柱子填满每个连续刻度的区间,还原离散轴的视觉效果 - 通过
theme中的panel.grid.minor.x启用并自定义次要网格线的颜色、线型
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

