【问题标题】:Secondary axis in plotly does not work for different scales绘图中的次轴不适用于不同的比例
【发布时间】:2020-10-10 03:55:31
【问题描述】:

如何在 plotly 中重现下图

library(dplyr)
library(ggplot2)

tibble(x =1:10, y = 1:10) %>% 
        ggplot(aes(x,y)) +
        geom_line() + 
        scale_y_continuous(sec.axis = ~.*2)

我根据这个答案here尝试了以下代码

library(dplyr)
library(plotly)

tibble(x =1:10, y = 1:10) %>% 
      mutate(y2 = y*2) %>% 
      plot_ly() %>%  
      add_lines(x =~x, y =~y) %>% 
      add_lines(x= ~x, y=~y2, 
                yaxis = "y2", color = I("transparent"), 
                hoverinfo='skip', showlegend=FALSE) %>% 
      layout(yaxis2 = list(side = "right", overlaying = "y", showgrid = FALSE), 
             margin = list(r = 50))

虽然乍一看它似乎可以工作,但它只提供了部分解决方案,因为如果我以交互方式尝试更改生成图形上主(左)y 轴的比例(通过向上或向下拖动),右轴不随图形移动(因为它仅链接到第二个不可见图形)。这当然是不可接受的,因为它不允许可靠地使用 plotly 的任何交互功能,这就是我想用它而不是 ggplot 开始的原因。

编辑:刚刚意识到,在轴之间的非线性变换的情况下,这个情节解决方案似乎根本不起作用(而 ggplot 处理得很好)。

【问题讨论】:

    标签: r ggplot2 plotly r-plotly


    【解决方案1】:

    您只需要设置 dticktick0 即可让 plotly 拥有与 ggplot2 相同的图形。见下文;

    library(plotly)
    library(dplyr)
    
    tibble(x =1:10, y = 1:10) %>% 
      mutate(y2 = y*2) -> df1
    
    n0 <- 4
    y0 <- max(df1$y)/n0
    x0 <- max(df1$x)/n0
    
    df1 %>% 
     plot_ly(data = . , x = ~x, y = ~y,
             type = "scatter", mode = "lines", width = 800, 
             color = I("red"), name = "") %>%
      
       add_trace(x = ~x, y = ~y2, yaxis = "y2", 
                 color = I("red"), name = "") %>%
      
       layout(yaxis = list(showline = FALSE, side = "left",
                           title = "", color = "red", 
                           dtick = y0, tick0 = y0, fixedrange=TRUE),
              
              yaxis2 = list(showline = FALSE, side = "right", overlaying = "y", position = 1,
                            title = "", anchor = "free", color = "blue",
                            dtick = 2*y0, tick0 = 2*y0, fixedrange=TRUE),
              
              xaxis = list(showline = FALSE, zeroline = FALSE, title = "",
                           dtick = x0, tick0 = x0),
              
              showlegend = FALSE,
              margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4)
      )
    

    reprex package (v0.3.0) 于 2020 年 6 月 19 日创建

    【讨论】:

    • 这只会对齐最初生成的图表中的刻度,但不能解决我的问题,因为您仍然可以独立移动任一轴,任意更改轴之间的关系。 (同样在您的代码中,通过为第二条轨迹设置颜色,如果您移动其中一个轴,您将看到两条线,因此我将颜色设置为“透明”)
    • @Sasha 我用fixedrange=TRUE 解决了这个问题,并添加了margin 参数以保持两个y 轴标签在所有缩放时都可见。如果您希望仍然能够放大 y 轴并保持两个轴相同,那么您需要考虑闪亮的应用程序。使用闪亮,您可以根据一个用户正在更改来更新另一个轴。阅读plotlyProxy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多