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

如何在ggplot中实现无需转换主y轴的独立第二y轴绘制

实现方法

ggplot的次轴本质是主y轴的映射,我们可以通过手动做线性缩放的方式,实现两个独立适配各自变量的y轴,效果和你提供的基础绘图代码完全一致,实现代码如下:

# 加载依赖包
library(ggplot2)

# 构造和示例完全一致的原始数据
set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000) 

# 计算两个变量的数值范围,构造缩放、逆变换函数
y_range <- range(y)
z_range <- range(z)
# 将z值缩放到y的数值范围,用于图层绘制
z_scaled <- (z - z_range[1])/diff(z_range) * diff(y_range) + y_range[1]
# 次轴刻度逆变换函数:将缩放后的绘图数值还原为z的原始范围
z_inv_trans <- function(scaled_val) {
  (scaled_val - y_range[1])/diff(y_range) * diff(z_range) + z_range[1]
}

# 构造绘图数据框
df <- data.frame(x = x, y = y, z_scaled = z_scaled)

# 最终绘图
ggplot(df, aes(x = x)) +
  # 主y轴对应原始y变量,绘制散点
  geom_point(aes(y = y), color = "black") +
  # 用缩放后的z值绘制折线,复用主y轴的显示区间
  geom_line(aes(y = z_scaled), color = "red") +
  # 配置y轴,次轴通过逆变换还原z的原始刻度
  scale_y_continuous(
    name = "y",
    sec.axis = sec_axis(trans = z_inv_trans, name = "z")
  ) +
  # 可选配置:调整主题区分两个轴的对应元素
  theme(
    axis.title.y.right = element_text(color = "red"),
    axis.text.y.right = element_text(color = "red")
  )

效果说明

  • 主y轴的刻度完全对应原始y变量的数值,未做任何修改
  • 次y轴的刻度完全对应原始z变量的数值,通过逆变换函数自动计算生成
  • 最终展示效果和你提供的基础绘图代码完全一致,两个轴相互独立,分别适配各自变量的数值范围

内容的提问来源于stack exchange,提问作者Maria Provelegiou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:54:04