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

ggplot如何设置独立于主Y轴的次Y轴及调整图例单列布局

解决ggplot双Y轴与图例单列堆叠问题

一、实现独立视觉效果的次Y轴

ggplot默认仅支持基于主Y轴缩放的次Y轴,但可通过数值映射转换实现类似Excel的双轴折线图效果:

  1. 计算主Y轴(y1)和次Y轴(y2)的数值范围,将y2缩放至y1的区间内
  2. 绘制缩放后的y2折线,再通过sec.axis将次轴刻度转换回y2的原始数值

具体代码如下:

library(ggplot2)

# 计算y1和y2的数值范围
min_y1 <- min(dt$y1)
max_y1 <- max(dt$y1)
min_y2 <- min(dt$y2)
max_y2 <- max(dt$y2)

# 定义缩放/逆缩放函数,将y2映射到y1的范围
scale_y2 <- function(y) (y - min_y2) / (max_y2 - min_y2) * (max_y1 - min_y1) + min_y1
inv_scale_y2 <- function(y) (y - min_y1) / (max_y1 - min_y1) * (max_y2 - min_y2) + min_y2

# 绘制双轴折线图
p <- ggplot(data = dt, aes(x = time)) +
  geom_line(aes(y = y1, colour = "% change"), linewidth = 1) +
  geom_line(aes(y = scale_y2(y2), colour = "Index"), linewidth = 1) +
  # 配置主、次Y轴
  scale_y_continuous(
    name = "% change",
    sec.axis = sec_axis(trans = inv_scale_y2, name = "Index")
  ) +
  # 自定义折线颜色
  scale_colour_manual(values = c("% change" = "#1f77b4", "Index" = "#ff7f0e")) +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    # 开启图例垂直堆叠
    legend.direction = "vertical",
    legend.box = "vertical"
  )

print(p)

二、修复图例单列堆叠问题

你之前仅用legend.box = "vertical"未生效,是因为缺少legend.direction = "vertical"参数,两者配合才能让底部图例垂直排列为单列。也可通过guides()函数直接控制:

# 替代方案:用guides指定图例方向
p <- p + guides(colour = guide_legend(direction = "vertical"))

注意事项

  • 次Y轴本质仍是主Y轴的缩放映射,并非完全独立,但视觉效果与Excel双轴一致
  • 双Y轴易造成数据解读误导,仅在必要场景下使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:53:16