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

如何在R的ggplot中为两个列向量绘制双Y轴图表?

解决ggplot2次坐标轴绘制问题

你的报错原因是sec_axis()的第一个参数需要转换函数,而非直接传入数据列v2。ggplot2的次坐标轴本质是基于主坐标轴的数值转换,需要先把v2的数值缩放到v1的取值范围,再通过反转换让次坐标轴显示v2的原始刻度。

正确实现步骤

  1. 计算主坐标轴(v1)和次坐标轴(v2)的缩放比例与偏移量,用于数值转换
  2. 将v2转换为适配v1范围的数值后绘制线条
  3. 在sec_axis()中定义反转换函数,还原v2的原始刻度

完整代码

library(tidyverse)

# 生成目标数据框
date = seq(as.Date("2022/1/1"), as.Date("2022/1/12"), by = "day")
v1 = rnorm(12,0,1)
v2 = rnorm(12,10,1)
df = data.frame(date,v1,v2)

# 计算缩放比例与偏移量
v1_min <- min(df$v1)
v1_max <- max(df$v1)
v2_min <- min(df$v2)
v2_max <- max(df$v2)

scale_ratio <- (v1_max - v1_min) / (v2_max - v2_min)
offset_val <- v1_min - v2_min * scale_ratio

# 绘制双坐标轴折线图
ggplot(df, aes(x = date)) +
  # 绘制v1主坐标轴线条
  geom_line(aes(y = v1), size = 1, color = "#2E86AB") +
  # 绘制转换后的v2线条(适配主坐标轴范围)
  geom_line(aes(y = v2 * scale_ratio + offset_val), size = 1, color = "#D83A56") +
  # 设置x轴日刻度
  scale_x_date(date_labels = "%d", date_breaks = "1 day") +
  # 设置双y轴
  scale_y_continuous(
    name = "v1",
    sec.axis = sec_axis(
      trans = ~ (. - offset_val)/scale_ratio,  # 反转换还原v2原始值
      name = "v2"
    )
  ) +
  theme_minimal()

关键说明

  • scale_ratio:v1与v2取值范围的比例,用于将v2数值缩放到v1的区间内
  • offset_val:偏移量,保证转换后的v2数值与v1的起始点对齐
  • sec_axis()的trans参数:反转换函数,将主坐标轴的数值转换回v2原始值,让次坐标轴显示正确刻度

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:30:45