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

如何在ggplot2中调整第二个Y轴的刻度范围?

调整ggplot2双Y轴次轴的刻度范围至250-400

ggplot2的双Y轴本质是通过变量尺度转换实现的——次轴只是主轴刻度的标签映射,无法直接独立设置范围。要让次轴固定在250-400区间,同时让两条曲线趋势更贴近,需要先将var2的数值映射到主Y轴(var1)的尺度,再通过逆转换生成次轴的刻度。

完整修改代码

library(ggplot2)
library(data.table)
library(lubridate)

# 生成示例数据
df = data.table::data.table(
  date = seq(from = lubridate::ymd("2010-01-01"), 
             to = lubridate::ymd("2020-01-01"), length = 100),
  var1 = rpois(n = 100, lambda = 84),
  var2 = rpois(n = 100, lambda = 300)
)

# 定义尺度转换逻辑
var1_range <- range(df$var1)  # 获取var1的实际数据范围
var2_target_range <- c(250, 400)  # 次轴目标范围

# 正向转换:将var2映射到var1的尺度
trans_to_main <- function(x) {
  (x - var2_target_range[1]) * (var1_range[2] - var1_range[1]) / 
    (var2_target_range[2] - var2_target_range[1]) + var1_range[1]
}

# 逆向转换:将主轴数值还原为var2的原始刻度
trans_to_sec <- function(x) {
  (x - var1_range[1]) * (var2_target_range[2] - var2_target_range[1]) / 
    (var1_range[2] - var1_range[1]) + var2_target_range[1]
}

# 绘制调整后的双Y轴图
df |>
  ggplot(aes(x = date)) +
  geom_line(aes(y = var1), col = "royalblue") +
  # 使用转换后的var2数值适配主Y轴
  geom_line(aes(y = trans_to_main(var2)), col = "red") +
  scale_y_continuous(
    name = "var1",
    sec.axis = sec_axis(
      trans = trans_to_sec,
      name = "var2",
      limits = var2_target_range,
      breaks = seq(250, 400, 50)  # 自定义刻度间隔,可选
    )
  ) +
  theme_light()

关键说明

  1. 尺度转换:通过trans_to_main把var2的250-400区间拉伸/压缩到var1的数据范围,确保两条曲线在同一坐标系下的趋势对齐。
  2. 次轴配置:sec_axis使用trans_to_sec逆转换还原var2的原始刻度,limits参数强制次轴范围固定为250-400,breaks可按需调整刻度密度。
  3. 可选优化:如果希望主Y轴范围固定(不随var1波动),可以把var1_range设为固定值,比如c(60, 110),让曲线位置更稳定。

内容的提问来源于stack exchange,提问作者B.M Njuguna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:51:28