ggplotly чертит несколько временных рядов как диаграмму с dynamicTicks = T - PullRequest
0 голосов
/ 03 октября 2018

Я хочу построить несколько временных рядов в виде диаграммы с plotly + ggplot2, но у меня возникают проблемы при использовании dynamicTicks = TRUE.Ширина столбца одного набора данных увеличивается и распространяется на больший таймфрейм по сравнению с другим набором данных, которого я хочу избежать.

При установке dynamicTicks = FALSE ширина (в этом примере красных столбцов) выглядит правильно, но метки оси X исчезают при увеличении.

Изменение значений x на символ также приведет к тому, что ширина будет выглядеть правильно, но метки оси X перекрываются и не наследуют никакой логики.

Как установить ширину полосы одного набора данных на ту же, что и у другого набора данных, сохраняя значения x в формате даты и имея dynamicTicks = TRUE?

library(ggplot2)
library(plotly)
library(data.table)

## Data
data1 <- {data.table(
  time_stamp = seq.Date(as.Date("2018-01-01"), to = as.Date("2018-07-04"), by = 1),
  q = runif(185, 100, 5000), qall = sample(1:8, size = 185, T),
  col = sample(c("green", "lightgreen", "yellow"), 185,T)
)}
data2 <- {data.table(
  time_stamp = seq.Date(as.Date("2018-01-01"), to = as.Date("2018-07-01"), by = 7),
  q = runif(26, 100, 5000), qall = sample(1:8, size = 26, T)
)}


key <- highlight_key(data1, ~time_stamp)
maxY = max(data1$q)
p <- ggplot() +
  geom_col(data = data2, aes(x = (time_stamp), y = maxY, 
                         text = paste("I AM TOO WIDE: <br>Date: ", (time_stamp))), 
           width = 1, fill = "red", alpha=0.4) +
  geom_col(data = key, aes(x = (time_stamp), y = q),
           width = 1, color="gray", fill = data1$col) +
  theme(text = element_text(size=9), axis.text.x = element_text(angle=0, hjust=1))

## Too Wide red bars + Correct x labels
dp <- ggplotly(p, source = "src", dynamicTicks = T, 
               tooltip = c("text")) %>% 
  highlight(off="plotly_doubleclick", color = "blue", opacityDim = 0.8); 
dp

Изображение слева имеет dynamicTicks = T и слишком широкие красные полосы, а изображение справа имеет dynamicTicks = FALSE, правильные красные полосы, но нет реальной логики xAxis.

Я попытался установить эти параметры безуспешно:

# plotly_json(dp)

dp$x$data[[1]]$width = rep(1, length(dp$x$data[[1]]$width))
dp
dp$x$data[[1]]$width = s$time_stamp
dp
dp$x$data[[1]]$marker$line$width = 1
dp

1 Ответ

0 голосов
/ 05 октября 2018

С помощью dynamicTicks = TRUE, ggplotly регулирует ширину столбца в зависимости от расстояния между наблюдениями отдельных трасс.В случае data2 это 7 дней, в то время как для data1 это только один день.

Чтобы решить эту проблему, добавьте наблюдения к data2;например, замените data2 на следующее:

library(tidyverse)
data3 = 
  data2 %>%
  mutate(maxY = max(data1$q)) %>% 
  complete(time_stamp = seq.Date(from = min(data2$time_stamp),
                                 to = max(data2$time_stamp),
                                 by = 1)
  ) %>% 
  replace_na(list(maxY=0))

Обратите внимание, что вам нужен последний replace_na, поскольку столбцы с y=0 не будут отображаться с помощью plotly, тогда как NA s будут удаленыи вы снова получите более широкие столбцы.

...