Вторичная ось в plotly не работает для разных масштабов - PullRequest
1 голос
/ 19 июня 2020

Как я могу воспроизвести следующий график в графическом виде

library(dplyr)
library(ggplot2)

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

Я пробовал следующий код на основе этого ответа здесь

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 на созданном графике (перетащив ее вверх или вниз), правая ось не будет перемещаться вместе с граф (потому что он связан только со вторым невидимым графом). Это, конечно, неприемлемо, поскольку не позволяет надежно использовать какие-либо интерактивные функции, поэтому я хотел использовать его для начала вместо ggplot.

Изменить: Только что понял, что это графическое решение, похоже, вообще не работает в случае нелинейного преобразования между осями (в то время как ggplot прекрасно справляется с этим).

1 Ответ

2 голосов
/ 20 июня 2020

Вам просто нужно настроить dtick и tick0, чтобы 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)
  )

Created on 2020-06-19 by the пакет REPEX (v0.3.0)

...