Одна зеролина для двух осей Y в графике - PullRequest
0 голосов
/ 21 сентября 2018

enter image description here

Этот график генерируется с помощью следующего кода:

library(tidyverse)
library(plotly)

df <- data.frame(
      DEP = c("ABC", "DEF", "GHI")
      , VALUE = c(100, 110, 120)
      , LINE = c(-0.1, 0.7, 0.9)
    )

xAxis <- list(
  title = ""
  , tickangle = 0
  , tickfont = list(size = 10)
)

yAxis <- list(
  side = "left"
  , showgrid = TRUE
  , zeroline = TRUE
  , title = ""
)

yAxis2 <- list(
  side = "right"
  , autotick = FALSE
  , ticks = "outside"
  , tick0 = 0
  , dtick = 0.1
  , showgrid = TRUE
  , zeroline = TRUE
  , overlaying = "y"
)

plot_ly(data = df, x = ~DEP) %>%
  add_trace(data = df, x = ~DEP, y = ~VALUE, name = 'VALUE', type = "bar", yaxis = "y", textposition = "auto") %>%
  add_trace(data = df, x = ~DEP, y = ~LINE, name = 'LINE', mode = "lines", type = "scatter",
            line = list(width = 4), yaxis = "y2") %>%
  layout(
    margin = list(r=50, b = 150)
    , xaxis = xAxis
    , yaxis = yAxis
    , yaxis2 = yAxis2
    , showlegend = FALSE
  )

Я хотел бы изменить график так, чтобы нулевое значениелевой оси Y смещен к нулю правой оси Y.Следовательно, бары также должны быть смещены:

enter image description here

1 Ответ

0 голосов
/ 30 сентября 2018

Насколько я знаю, нет прямого способа сделать это в Plotly.Но вы можете установить range для обеих осей вручную.

Для ваших баров добавьте следующую строку в ее макет:

range = c(max(df$VALUE) / max(df$LINE) * min(df$LINE), max(df$VALUE))

и для ваших линий:

range = c(min(df$LINE), max(df$LINE))

, что даст следующий график.enter image description here

Более простым способом было бы установить нижний предел равным 0, который усекает линейный график.

В приведенном ниже коде дополнительная переменная axis_buffer быладобавлено, чтобы избежать того, что диапазон точно равен нижнему и верхнему пределу ваших значений.

Для наглядности я удалил бы некоторые линии сетки или попытался бы нормализовать ваши данные и добавить необработанные данные к вашему наведению.информация.

library('plotly')
df <- data.frame(
  DEP = c("ABC", "DEF", "GHI")
  , VALUE = c(100, 110, 120)
  , LINE = c(-0.1, 0.7, 0.9)
)

axis_buffer <- 1.1

xAxis <- list(
  title = ""
  , tickangle = 0
  , tickfont = list(size = 10)
)

yAxis <- list(
  side = "left"
  , showgrid = TRUE
  , zeroline = TRUE
  , title = ""
  , range = c(max(df$VALUE) / max(df$LINE) * min(df$LINE) * axis_buffer, max(df$VALUE) * axis_buffer)
)

yAxis2 <- list(
  side = "right"
  , autotick = FALSE
  , ticks = "outside"
  , tick0 = 0
  , dtick = 0.1
  , showgrid = TRUE
  , zeroline = TRUE
  , overlaying = "y"
  , range = c(min(df$LINE) * axis_buffer, max(df$LINE) * axis_buffer)
)

plot_ly(data = df, x = ~DEP) %>%
  add_trace(data = df, x = ~DEP, y = ~VALUE, name = 'VALUE', type = "bar", yaxis = "y", textposition = "auto") %>%
  add_trace(data = df, x = ~DEP, y = ~LINE, name = 'LINE', mode = "lines", type = "scatter",
            line = list(width = 4), yaxis = "y2") %>%
  layout(
    margin = list(r=50, b = 150)
    , xaxis = xAxis
    , yaxis = yAxis
    , yaxis2 = yAxis2
    , showlegend = FALSE
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...