ggplot中修改geom_bar起始值并修复双Y轴显示异常
问题原因解析
scale_y_continuous(limits)导致柱状图消失:geom_bar默认从y=0开始绘制到指定y值(即ss+250),设置limits = c(250, 510)后,y<250的部分会被过滤,柱子的主体(0-250段)被移除,剩余的小高度段(等于ss)因视觉不明显被误认为消失。coord_cartesian(ylim)导致副轴数值异常:该函数仅缩放视图不删除数据,柱子实际底部仍在主轴0(对应副轴-250),视图从250开始后,柱子看似从250向上延伸,但副轴按~.-250转换主轴刻度,会让用户误以为柱子数值低于0。
解决方案
方法1:用geom_rect精准控制柱状图边界
直接定义柱子的上下起始点,彻底避免从0绘制的问题:
set.seed(42) df <- data.frame( cat = runif(10, 1, 20), mean = runif(10, 350, 450), ss = runif(10, 1, 50)) ggplot(data = df) + # 绘制从主轴250开始的柱状图,x轴范围微调避免重叠 geom_rect(aes(xmin = cat - 0.3, xmax = cat + 0.3, ymin = 250, ymax = 250 + ss), fill = "red") + geom_point(aes(x = cat, y = mean)) + geom_smooth(aes(x = cat, y = mean), method = "loess", se = TRUE) + # 主轴固定250-510,副轴转换为"主轴值-250",自定义刻度匹配ss范围 scale_y_continuous(limits = c(250, 510), sec.axis = sec_axis(trans = ~ . - 250, name = "sample size", breaks = seq(0, 60, 10))) + labs(y = "mean") + theme_bw()
方法2:保留geom_col的优化写法
通过位置偏移将柱子整体上移,配合轴设置实现需求:
ggplot(data = df) + # 将柱子整体上移250,使其底部对齐主轴250 geom_col(aes(x = cat, y = ss), fill = "red", position = position_nudge(y = 250)) + geom_point(aes(x = cat, y = mean)) + geom_smooth(aes(x = cat, y = mean), method = "loess", se = TRUE) + scale_y_continuous(limits = c(250, 510), sec.axis = sec_axis(trans = ~ . - 250, name = "sample size", breaks = seq(0, 60, 10))) + labs(y = "mean") + theme_bw()
两种方法均可实现:左Y轴下限固定为250、柱状图从250(对应副轴0)开始绘制、副轴显示正确的ss数值。
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

