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
相关产品推荐
相关产品推荐

