ggplot2 sec.axis副坐标轴无法正常显示第二变量柱状图咨询
问题根因
ggplot2的次坐标轴本质是主坐标轴的刻度转换标记,不会自动将对应数据系列映射到次轴刻度空间,所有几何图层默认全部参照主坐标轴数值绘制。你代码里y2原始值最大仅80,在最高到12万量级的主坐标轴下自然会被压缩到几乎不可见。
修复方法
核心逻辑是手动做数值映射:
- 计算缩放系数:因为要求第二坐标轴(y2)上限固定为100,取y1的最大值除以100作为缩放系数,让y2数值乘以该系数后,在主坐标轴空间的高度和次轴刻度一一对应。
- 次轴转换公式设置为主轴数值除以缩放系数,即可还原y2的原始取值范围,自动对齐0-100的上限要求。
- 两个柱形系列保持一致的错位偏移参数,避免柱形错位。
修正后的可运行代码:
library(tidyverse) data <- data.frame( x = c("A", "B", "C", "D", "E", "F", "G", "H"), y1 = c(10000, 70000, 120000, 75000, 500, 2000, 10000, 18000), y2 = c(22, 30, 36, 10, 1, 80, 33, 39) ) # 计算缩放系数,保证次轴上限为100 scale_coef <- max(data$y1) / 100 ggplot(data, aes(x = x)) + # 绘制y1柱形,参照主坐标轴 geom_col( aes(y = y1, fill = "y1"), position = position_dodge(width = 0.8), width = 0.7 ) + # 绘制缩放后的y2柱形,适配主坐标轴空间 geom_col( aes(y = y2 * scale_coef, fill = "y2"), position = position_dodge(width = 0.8), width = 0.7 ) + scale_y_continuous( name = "First axis (y1)", sec.axis = sec_axis( trans = ~ .x / scale_coef, name = "Second axis (y2)", limits = c(0, 100) ) )
说明
- 用
geom_col()替代geom_bar(stat = "identity")是ggplot2官方推荐的数值柱形写法,效果完全等价。 - 两个柱形图层设置完全一致的
position_dodge宽度和柱宽参数,保证并列对齐不偏移。 - 如果后续y1的数值范围变化,只需重新计算
scale_coef即可,次轴会自动保持0-100的取值范围。
内容的提问来源于stack exchange,提问作者Alessio
相关产品推荐
相关产品推荐

