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

如何在ggplot2中绘制双轴图并自定义坐标轴范围?

调整双轴折线图纵轴范围的解决方案

首先得明确:ggplot的双轴本质是把右侧轴的数据映射到左侧轴的刻度空间,所以得先算出左右轴的数值转换关系,再同步调整刻度范围和数据映射。

核心转换逻辑

  • 左轴(R)目标范围:[0.9, 1.0]
  • 右轴(M/A)目标范围:[0.1, 0.5]
  • 推导转换公式:
    把右轴数值转成左轴可识别的数值:左轴值 = 0.9 + (右轴值 - 0.1) * 0.25
    把左轴数值转回右轴刻度:右轴值 = (左轴值 - 0.9) / 0.25 + 0.1

修改后的完整代码

data <- data.frame(
  R = c(0.9649789,0.9700804,0.9632690,0.9523244,0.9339738),
  M = c(0.2465927,0.2263204,0.2520991,0.2982259,0.3614747),
  A = c(0.1427684,0.1428706,0.1642165,0.1937662,0.2353444),
  D = c(20,15,10,5,2)
)

p2 <- ggplot(data, aes(x = D, y = R)) +
  # 左轴R的线和点
  geom_line(color="#6FB585") +
  geom_point(size=3, color="#6FB585") +
  # 设置左右轴范围与转换关系
  scale_y_continuous(
    name = 'R',
    limits = c(0.9, 1.0),  # 左轴固定范围
    sec.axis = sec_axis(
      ~ (. - 0.9)/0.25 + 0.1,  # 左轴转右轴的刻度公式
      name = 'M and A',
      limits = c(0.1, 0.5)  # 右轴固定范围
    )
  ) +
  # 右轴M的线和点:先把M转成左轴刻度空间的数值
  geom_line(aes(y = 0.9 + (M - 0.1)*0.25), color="#E8BF80") +
  geom_point(aes(y = 0.9 + (M - 0.1)*0.25), size=3, color="#E8BF80") +
  # 右轴A的线和点:同样转换数值
  geom_line(aes(y = 0.9 + (A - 0.1)*0.25), color="#A8BF85") +
  geom_point(aes(y = 0.9 + (A - 0.1)*0.25), size=3, color="#A8BF85")

print(p2)

关键说明

原代码直接用M/A作为y值,它们的范围(0.1-0.4)和左轴(0.9-1.0)不重叠,导致线条被压在图底部。通过转换公式把M/A映射到左轴的刻度区间内,再用sec_axis反向转换显示右轴刻度,才能让双轴数值对应正确,同时精准锁定目标范围。

内容的提问来源于stack exchange,提问作者吳海濱

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:01:17