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

R语言plotly绘制含双Y轴子图的问题及解决方法

R语言Plotly多子图双Y轴布局异常问题及修复

问题背景

我尝试使用R语言的plotly包绘制包含2张子图的组合图,每张子图都设置双Y轴,同时需要实现Y轴标签颜色与对应折线的颜色匹配。最初编写的基础示例代码如下:

library(plotly)
library(dplyr)
p1 <- economics %>% plot_ly()%
  add_trace( x = ~date, y = ~unemploy,yaxis='y1',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout( yaxis2 =  list(overlaying = "y1",side = "right"))
p2<-p1
p1

单张图p1的输出效果正常,符合预期。
当运行subplot合并代码时,绘图出现异常:

subplot(p1, p2 , nrows = 2 , shareX = TRUE)

问题原因

plotly在合并子图时会自动为每个子图的Y轴重新分配全局唯一的索引标识,手动指定yaxis='y1'的命名方式与subplot自动生成的索引规则冲突,导致双Y轴的绑定关系失效,出现布局错乱。

修复方案

调整每张子图的Y轴绑定配置,匹配subplot的索引规则即可正常运行:

2张子图实现代码

library(plotly)
library(dplyr)
p1 <- economics %>% plot_ly()%
  add_trace( x = ~date, y =~unemploy,yaxis='y',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout( yaxis =  list(side = "left"),yaxis2 =  list(overlaying = "y",side = "right"))
p2<-economics %>% plot_ly()%
  add_trace( x = ~date, y = ~unemploy,yaxis='y',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout(yaxis =  list(side = "left"), yaxis2 =  list(overlaying = "y3",side = "right"))
subplot(p1,p2,nrows=2)

扩展到3张子图的实现代码

3张子图时只需要按规则调整最后一张子图的overlaying参数即可:

library(plotly)
library(dplyr)
p1 <- economics %>% plot_ly()%
  add_trace( x = ~date, y = ~unemploy,yaxis='y',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout( yaxis =  list(side = "left"),yaxis2 =  list(overlaying = "y",side = "right"))
p2<-economics %>% plot_ly()%
  add_trace( x = ~date, y = ~unemploy,yaxis='y',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout(yaxis =  list(side = "left"), yaxis2 =  list(overlaying = "y3",side = "right"))
p3<-economics %>% plot_ly()%
  add_trace( x = ~date, y = ~unemploy,yaxis='y',type='scatter',mode="lines+markers")%
  add_trace(x = ~date, y = ~uempmed,yaxis='y2',type='scatter',mode="lines+markers") %>% 
  layout(yaxis =  list(side = "left"), yaxis2 =  list(overlaying = "y5",side = "right"))

subplot(p1,p2,p3,nrows=3)

配置规则说明

subplot纵向排列N张子图时,每张子图右侧Y轴的overlaying参数值遵循y + 2*(序号-1)的规则:

  • 第1张子图:overlaying = "y"
  • 第2张子图:overlaying = "y3"
  • 第3张子图:overlaying = "y5"
  • 第k张子图:overlaying = paste0("y", 2*(k-1)+1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:36:01