Насколько я знаю, нет прямого способа сделать это в Plotly.Но вы можете установить range
для обеих осей вручную.
Для ваших баров добавьте следующую строку в ее макет:
range = c(max(df$VALUE) / max(df$LINE) * min(df$LINE), max(df$VALUE))
и для ваших линий:
range = c(min(df$LINE), max(df$LINE))
, что даст следующий график.
Более простым способом было бы установить нижний предел равным 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
)