ggplot2中geom_col柱形与网格线不对齐是Bug还是功能设计?
ggplot2 geom_col柱形与网格线不对齐问题解答
问题描述
绘制数值类柱形图时,通常预期柱形顶部边框与网格线对齐。但使用ggplot2的geom_col绘图时发现,数值为10、5的柱形对齐正常,数值为2、1的柱形无法对齐,该问题属于Bug还是设计特性?
可复现示例
加载依赖
library(tidyverse, scales)
测试数据
x1 <- c("a", "b", "c", "d", "e") y1 <- c(1, 10, 2, 1, 5) xy <- data.frame(x1, y1)
基础绘图代码
xy %>% ggplot(aes(x = fct_reorder(x1, desc(y1)), y = y1)) + geom_col() + geom_text(aes(label = y1), vjust = 1.5, colour = "white") # 标注柱形数值
问题原因
这不是Bug,属于使用方法错误导致的问题:
你在异常配置的代码中重复调用了scale_y_continuous函数,后一次调用会直接覆盖前一次调用的所有未显式声明的参数,包括你设置的minor_breaks(小刻度)。
你观察到的“对齐异常”是视觉错觉:柱形高度本身和Y轴实际坐标是严格匹配的,只是你预期显示的小刻度被后一次的scale_y_continuous调用抹除了,当前显示的网格线和实际坐标刻度不匹配,才会看起来“不对齐”。
修复方案
把所有Y轴相关配置合并到同一次scale_y_continuous调用中即可,示例代码如下:
xy %>% ggplot(aes(x = fct_reorder(x1, desc(y1)), y = y1)) + geom_col() + scale_y_continuous( minor_breaks = seq(0, 10, .5), labels = scales::number_format(accuracy = .5) ) + geom_text(aes(label = y1), vjust = 1.5, colour = "white")
如果不需要自定义小刻度,也可以直接显式设置Y轴的limits和breaks参数,让坐标轴刻度和你的数值范围完全匹配,也不会出现对齐问题。
内容的提问来源于stack exchange,提问作者sergiouribe
相关产品推荐
相关产品推荐

