Plotly中含双Y轴的图表与子图组合及缺失问题解决
共享X轴子图中双Y轴曲线消失的问题解决
问题描述
创建两个共享X轴的子图,顶部子图包含双Y轴。单独展示顶部图表(top)时,df1和df2的曲线正常显示,但组合子图(both)后,df2的曲线消失。
代码示例:
library(plotly) library(tidyverse) df1 <- data.frame(t=seq(5)) %>% mutate(d1=t+7) df2 <- data.frame(t=seq(2,6)) %>% mutate(d2=t*t+20) df3 <- data.frame(t=seq(0,8)) %>% mutate(d3=-2-t) top <- plot_ly() %>% add_trace(x=~t,y=~d1,type="scatter",data=df1,mode="lines") %>% add_trace(x=~t,y=~d2,type="scatter",data=df2,mode="lines",yaxis = "y2") %>% layout(yaxis2 = list(overlaying = "y", side = "right")) bottom <- plot_ly() %>% add_trace(x=~t,y=~d3,type="scatter",data=df3,mode="lines") both <- list(top ,bottom ) %>% subplot(nrows=2,shareX=T)
原因分析
使用subplot()组合子图并开启shareX=T时,plotly会统一重置子图的轴配置,顶部子图中yaxis2的overlaying属性会失效,导致df2的曲线因轴配置错误被隐藏,或Y轴范围未适配数据而无法显示。
修复方法
组合子图后,重新指定yaxis2的配置,确保其overlaying属性生效。修改后的代码如下:
library(plotly) library(tidyverse) df1 <- data.frame(t=seq(5)) %>% mutate(d1=t+7) df2 <- data.frame(t=seq(2,6)) %>% mutate(d2=t*t+20) df3 <- data.frame(t=seq(0,8)) %>% mutate(d3=-2-t) top <- plot_ly() %>% add_trace(x=~t,y=~d1,type="scatter",data=df1,mode="lines") %>% add_trace(x=~t,y=~d2,type="scatter",data=df2,mode="lines",yaxis = "y2") %>% layout(yaxis2 = list(overlaying = "y", side = "right")) bottom <- plot_ly() %>% add_trace(x=~t,y=~d3,type="scatter",data=df3,mode="lines") # 组合后重新设置yaxis2配置,恢复overlaying属性 both <- list(top, bottom) %>% subplot(nrows=2, shareX=T) %>% layout(yaxis2 = list(overlaying = "y", side = "right")) both
核心是保证yaxis2的overlaying = "y"参数在组合后的布局中保留,也可以在创建顶部子图时明确轴的命名,再在组合后同步配置,效果一致。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

