Полосные столбики со смещением по оси X для отметок времени - PullRequest
4 голосов
/ 26 марта 2019

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

Моя проблема в том, что отметки центрированы по центру, и я хотел бы сместить их влевый конец столбцов .

Когда график не увеличен, это не такая проблема, но при увеличении появляется больше меток, и они будут неправильными.

РЕДАКТИРОВАТЬ: Мне нужна опция barmode = 'overlay', так как у меня также есть другие трассировки для построения, которые не включены в этот пример.

На рисунке ниже показан мой текущий и скрытый макет, и вот некоторые данные, которые нужно сделатьэтот сюжет.(Некоторые опции, которые я пробовал безуспешно, также включены в конфигурацию xaxis, но без комментариев).

library(plotly)
library(lubridate)


df <- data.frame(
  ts = seq(as.POSIXct("2019-03-20 00:00:00"), by = "hour", length.out = 24),
  val = sample(1:100, 24)
)

plot_ly() %>% 
  add_bars(data = df, x = ~ts, y = ~val) %>% 
  layout(dragmode = "select", autosize = TRUE, selectdirection = "h",
                 barmode = 'overlay',
                 bargap = 0.05,
                 xaxis = list(ticks = "outside",
                              type = "date",
                              # tickson="boundaries",
                              # offset=1800,
                              tickmode = "auto",
                              title = ""
                              )) %>% 
  config(scrollZoom = TRUE)

enter image description here

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Будет ли следующее соответствовать вашим потребностям?

Одна из вещей, которыми я иногда пользуюсь с plotly, заключается в том, что вы можете отображать различные значения в text, которые не зависят от значений x и y, используемых для построения данных.

В этом случае мы можем создать столбец со значением времени смещения ts_x и построить значения x через полчаса после времени для каждой строки. Если у вас есть столбец для каждого часа, это фактически оставит выравнивает полосы.

library(plotly)

df <- data.frame(
  ts = seq(as.POSIXct("2019-03-20 00:00:00"), by = "hour", length.out = 24),
  val = sample(1:100, 24)
)

## Create a dummy column with x offset values
df$ts_x <- df$ts + 1800

plot_ly() %>% 
  ## Plot based on the dummy column
  add_bars(data = df, x = ~ts_x, y = ~val,
           ## Cover up our tracks by not showing true x value on hoverinfo
           hoverinfo = "text",
           ## Give text that includes the un-altered time values
           text = ~paste0("Time: ",format(ts, format = "%B %d, %Y %H:%M"),
                               "<br>Value: ",val)) %>% 
  layout(dragmode = "select", autosize = TRUE, selectdirection = "h",
         barmode = 'overlay',
         bargap = 0.05,
         xaxis = list(ticks = "outside",
                      type = "date",
                      tickmode = "auto",
                      title = ""
         )) %>% 
  config(scrollZoom = TRUE)

Plot output

1 голос
/ 26 марта 2019

По умолчанию бары центрированы, я не нашел, как это изменить. Один из вариантов - добавить второй столбец, потому что, когда для каждого единицы по оси х есть 2 столбца, один столбец находится слева от отметки оси, а второй справа (что вы пытаетесь получить с помощью одного столбца) .

Почему бы не создать второй невидимый бар? :)

df <- data.frame(
  ts    = seq(as.POSIXct("2019-03-20 00:00:00"), by = "hour", length.out = 24),
  val   = sample(1:100, 24),
  val0  = 0 
)

plot_ly(df, type = 'bar') %>%
  add_trace(x = ~ts, y = ~val0) %>% 
  add_trace(x = ~ts, y = ~val) %>%
  layout(
    showlegend = FALSE
  ) %>% 
  config(scrollZoom = TRUE)

Это создаст легенду (так как есть 2 вида баров, один для val и один для val0), поэтому я удалил его.

enter image description here

0 голосов
/ 03 апреля 2019

Вы уверены, что вы не переусердствовали?Вычитание 30 минут дает мне хороший график при увеличении.

Я не советую вам на самом деле редактировать данные, даже если это то, что я делаю в коде.Небольшая функция в вызове для добавления баров может решить эту проблему?Если вы наложите другие данные, это может привести к путанице, но я просто хотел это предложить.

library(plotly)
library(lubridate)

df2 <- data.frame(
  ts = seq(as.POSIXct("2019-03-20 00:00:00"), by = "hour", length.out = 24) - minutes(30),
  val = sample(1:100, 24)
)


plot_ly() %>% 
  add_bars(data = df2, x = ~ts, y = ~val) %>% 
  layout(dragmode = "select", autosize = TRUE, selectdirection = "h",
         barmode = 'overlay',
         bargap = 0.05,
         xaxis = list(ticks = "outside",
                      type = "date",
                      # tickson="boundaries",
                      # offset=1800,
                      tickmode = "auto",
                      title = ""
         )) %>% 
  config(scrollZoom = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...