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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:28