сюжетный график не отображается

#r #plotly

#r #график графика

Вопрос:

Я пытаюсь анимировать этот тест data.frame , но plotly сюжет даже не отображается! Тот же код работает и для исходных plotly данных. У меня есть двойная column's class проверка, и они такие же, как plotly в примере. Теперь я озадачен, почему это не удается.

Это также работает в marker режиме, но не в lines режиме, как вы видите.

 total <- data.frame(replicate(4,sample(0:1, 100, rep=TRUE)))
names(total) <- c("date", "frame", "P1.10", "year")
total$date <- as.numeric(as.character(t(rbind(runif(100, min=2000, max=2010)))))
f.rank <- order(total$date)
total$frame[f.rank] <- 1:nrow(total)
total$P1.10 <- as.numeric(as.character(t(rbind(runif(100, min=1, max=10)))))
total$year <- 2000



p <- total %>%
  plot_ly(
    x = ~date, 
    y = ~P1.10,
    frame = ~frame, 
    type = 'scatter',
    mode = 'lines', 
    line = list(simplyfy = F)
  ) %>% 
  layout(
    xaxis = list(
      title = "Date",
      zeroline = F
    ),
    yaxis = list(
      title = "P1.10",
      zeroline = F
    )
  ) %>% 
  animation_opts(
    frame = 100, 
    transition = 0, 
    redraw = FALSE
  ) %>%
  animation_slider(
    hide = T
  ) %>%
  animation_button(
    x = 1, xanchor = "right", y = 0, yanchor = "bottom"
  )
  

Ответ №1:

Вы проигнорировали accumulate_by в примере. Вам также нужно ID поле. Это то же самое, но используется ggplot в комбинации.

 set.seed(123)
library(plotly)

total <- data.frame(replicate(4,sample(0:1, 100, rep=TRUE)))
names(total) <- c("date", "frame", "P1.10", "year")
total$date <- as.numeric(as.character(t(rbind(runif(100, min=2000, max=2010)))))
f.rank <- order(total$date)
total$frame[f.rank] <- 1:nrow(total)
total$ID[f.rank] <- 1:nrow(total)
total$P1.10 <- as.numeric(as.character(t(rbind(runif(100, min=1, max=10)))))
total$year <- 2000

accumulate_by <- function(dat, var) {
  var <- lazyeval::f_eval(var, dat)
  lvls <- plotly:::getLevels(var)
  dats <- lapply(seq_along(lvls), function(x) {
    cbind(dat[var %in% lvls[seq(1, x)], ], frame = lvls[[x]])
  })
  dplyr::bind_rows(dats)
}

total <- total %>%
  accumulate_by(~ID)

p <- ggplot(total,aes(ID, P1.10, frame = frame))  
  geom_line()

p <- ggplotly(p) %>%
  layout(
    title = "",
    yaxis = list(
      title = "P1.10",
      zeroline = F,
      tickprefix = "$"
    ),
    xaxis = list(
      title = "Date",
      zeroline = F, 
      showgrid = F
    )
  ) %>% 
  animation_opts(
    frame = 100, 
    transition = 0, 
    redraw = FALSE
  ) %>%
  animation_slider(
    currentvalue = list(
      prefix = "Day "
    )
  )