使用ggplotly转换双Y轴ggplot图表时丢失第二Y轴的求助
解决ggplotly转换双Y轴图表时第二Y轴消失的问题
问题重现
用ggplot制作的双Y轴图表,通过ggplotly()转换后右侧第二Y轴消失。尝试用plotly的layout()添加第二Y轴,仅修改了现有标签,未成功新增第二轴。原始代码如下:
#packages library(tidyverse) library(plotly) #Create functional double-y plot dbly<-mtcars %>% ggplot(aes(x = disp)) + geom_point(aes(y = hp), color = "red")+ geom_point(aes(y = mpg * 9), color = "blue")+ scale_y_continuous(name = "hp", sec.axis = sec_axis(~ . /9, name = "mpg")) dbly #Double-y plot loads both datasets but not both axes egads<-ggplotly(dbly) egads #attempted to apply layout - second y axis, overwrites other #labels but does not add second y ay <- list( tickfont = list(color = "red"), overlaying = "y", side = "right", title = "<b>secondary</b> yaxis title") egads%>% layout( title = "Double Y Axis Example", yaxis2 = ay, xaxis = list(title="xaxis title "), yaxis = list(title="<b>primary</b> yaxis title") )
解决方案
ggplotly转换时不会自动映射ggplot的sec.axis到plotly的yaxis2,需要手动指定对应图层的Y轴,并配置双轴参数。以下是修正后的代码:
# 加载依赖包 library(tidyverse) library(plotly) # 创建原始ggplot双Y轴图表 dbly <- mtcars %>% ggplot(aes(x = disp)) + geom_point(aes(y = hp), color = "red")+ geom_point(aes(y = mpg * 9), color = "blue")+ scale_y_continuous(name = "hp", sec.axis = sec_axis(~ . /9, name = "mpg")) # 转换为plotly对象 egads <- ggplotly(dbly) # 修正双Y轴显示:指定第二个图层用yaxis2,配置双轴属性 egads_fixed <- egads %>% # 第二个图层(蓝色mpg点)绑定到yaxis2 style(trace = 2, yaxis = "y2") %>% layout( title = "双Y轴示例", xaxis = list(title = "disp"), # 主Y轴(hp)配置 yaxis = list( title = "<b>hp</b>", tickfont = list(color = "red") ), # 第二Y轴(mpg)配置 yaxis2 = list( title = "<b>mpg</b>", tickfont = list(color = "blue"), overlaying = "y", side = "right", # 对应ggplot中的mpg*9转换,将刻度值转回原始mpg范围 tickvals = seq(0, 360, by = 40), ticktext = seq(0, 40, by = 5) ) ) # 查看修正后的图表 egads_fixed
关键说明
style(trace = 2, yaxis = "y2"):ggplotly转换后,第一个轨迹是红色的hp点,第二个是蓝色的mpg点,需明确指定第二个轨迹使用yaxis2。yaxis2的tickvals和ticktext:对应原ggplot中mpg * 9的缩放逻辑,将刻度值转换回原始mpg范围,保证和ggplot的副轴效果一致。可根据实际数据调整刻度范围与间隔。
内容的提问来源于stack exchange,提问作者Robert Sucsy
相关产品推荐
相关产品推荐

