You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2 sec.axis副坐标轴无法正常显示第二变量柱状图咨询

问题根因

ggplot2的次坐标轴本质是主坐标轴的刻度转换标记,不会自动将对应数据系列映射到次轴刻度空间,所有几何图层默认全部参照主坐标轴数值绘制。你代码里y2原始值最大仅80,在最高到12万量级的主坐标轴下自然会被压缩到几乎不可见。

修复方法

核心逻辑是手动做数值映射:

  1. 计算缩放系数:因为要求第二坐标轴(y2)上限固定为100,取y1的最大值除以100作为缩放系数,让y2数值乘以该系数后,在主坐标轴空间的高度和次轴刻度一一对应。
  2. 次轴转换公式设置为主轴数值除以缩放系数,即可还原y2的原始取值范围,自动对齐0-100的上限要求。
  3. 两个柱形系列保持一致的错位偏移参数,避免柱形错位。

修正后的可运行代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:39:05