ggplot2中如何仅为特定坐标轴刻度设置刻度标签名称
更简便的实现方案
你当前手动枚举所有刻度对应空标签的写法维护成本很高,不需要这么麻烦。核心逻辑是保留0.1间隔的全量刻度线设置,用动态判断的方式生成标签:仅当刻度值属于你需要展示标签的目标数值时返回对应文本,其余位置统一返回空字符串,最终效果和你手动设置的完全一致。
核心修改只需要替换scale_y_continuous()里的labels参数即可,不需要写几十位的标签向量:
scale_y_continuous( name = "pH", breaks = seq(4.7, 7.4, by = 0.1), # 和原有设置一致,保留所有细密刻度线 # 动态判断生成标签,目标显示值可自行调整 labels = ~ifelse(round(.x, 1) %in% c(5, 5.5, 6, 6.5, 7, 7.4), as.character(round(.x, 1)), "") )
加
round(.x, 1)是为了规避浮点数存储精度问题,避免出现实际值为7.4但存储为7.3999999导致匹配失败的情况。
完整优化后代码
library(tidyverse) library(reshape2) green <- c(6.95, 7.21, 6.98, 7.08, 7.06, 7.33, 7.12, 6.97, 7.03, 7.05, 6.83, 6.94, 6.96, 6.98, 7.21, 7.04, 6.92, 7.04, 7.15, 7.10, 7.01, 6.86) purple <- c(5.70, 5.80, 5.93, 5.33, 5.32, 5.68, 4.76, 4.93, 5.13, 5.78, 5.66, 5.85, 5.92, 5.61, 5.91, 7.16, 5.78, 5.98, 5.92, 6.01, 6.14, 5.90) red <- c(5.85, 6.04, 5.91, 5.77, 5.61, 5.93, 5.73, 5.36, 5.52, 5.38, 5.40, 5.51, 5.70, 5.33, 5.84, 7.22, 5.55, 5.70, 5.59, 5.66, 5.74, 5.71) d_long2 <- data.frame(green, purple, red) d_long2 <- melt(d_long2) ggplot(d_long2, aes(x = variable, y = value, colour = variable)) + geom_boxplot(show.legend = FALSE) + theme_classic() + scale_x_discrete(name = " ", labels = c("Control", "Aluminium Poor pH 5.8", "Aluminium Rich pH 5.8"), expand = c(0.15, 0.15) ) + scale_y_continuous(name = "pH", breaks = seq(4.7, 7.4, by = 0.1), labels = ~ifelse(round(.x, 1) %in% c(5, 5.5, 6, 6.5, 7, 7.4), as.character(round(.x, 1)), "") ) + scale_colour_manual(values = c("#00CC00", "#9966FF", "#FF0000"))
使用提示
- 后续如果需要调整显示的y轴标签,只需要修改
c(5, 5.5, 6, 6.5, 7, 7.4)里的数值即可,不需要逐个计数位置填空字符串 - 如果需要和你原有手动设置的标签格式完全一致(比如部分数值后带空格),只需要把匹配成功后的文本替换成对应格式即可,例如
paste0(round(.x, 1), " ") - 上述lambda风格的参数写法适配ggplot2 3.3.0及以上版本,目前主流安装的版本都可直接支持
内容的提问来源于stack exchange,提问作者asellus
相关产品推荐
相关产品推荐

