ggplot使用函数设置坐标轴breaks与limits时被覆盖的问题
问题根因
你在外部测试时调用pretty(my_data[['x']])传入的是完整的4个值的x列向量,但ggplot传递给scale_x_continuous中limits、breaks自定义函数的入参,是仅包含数据最小值、最大值的二元向量c(10, 302),而非完整数据列。pretty()的默认参数n=5是期望刻度数的软约束,当入参为完整数据列和仅为范围二元向量时,最终输出的刻度序列可能出现差异,进而触发ggplot内部的刻度校验逻辑,覆盖你自定义的配置。你显式指定n=6时,两种入参场景下的pretty()输出始终一致,所以可以正常运行。
解决方案
如果不想每次手动指定n参数,可以直接使用ggplot2依赖的scales包封装好的breaks_pretty()工具,它已经适配了ggplot的传参逻辑:
library(ggplot2) library(scales) my_data <- data.frame(x = c(302, 116, 10, 11), y = letters[1:4]) ggplot(my_data, aes(x = x, y = y)) + geom_col() + scale_x_continuous( breaks = breaks_pretty(), limits = ~ range(breaks_pretty()(.x)) )
如果你不想额外引用scales的导出函数,也可以修改自定义函数的逻辑,保证计算逻辑一致性:
ggplot(my_data, aes(x = x, y = y)) + geom_col() + scale_x_continuous( breaks = function(x) pretty(c(min(my_data$x), max(my_data$x))), limits = function(x) range(pretty(c(min(my_data$x), max(my_data$x)))) )
内容的提问来源于stack exchange,提问作者koortzjg
相关产品推荐
相关产品推荐

