簡體   English   中英

R:plotly時間序列圖

[英]R: plotly time series graphs

我正在使用 R 編程語言。 I found some examples on the plotly r website that I am trying to replicate: https://plotly.com/r/cumulative-animations/ and https://plotly.com/r/custom-buttons/

我創建了一些人工時間序列數據:

library(xts)
library(ggplot2)
library(dplyr)
library(plotly)

#create data

#time series 1
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")

date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")

property_damages_in_dollars <- rnorm(731,100,10)

final_data <- data.frame(date_decision_made, property_damages_in_dollars)

final_data %>%
  mutate(date_decision_made = as.Date(date_decision_made)) %>%
  add_count(week = format(date_decision_made, "%W-%y"))

final_data$class = "time_series_1"


#time series 2
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")

date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")

property_damages_in_dollars <- rnorm(731,10,10)

final_data_2 <- data.frame(date_decision_made, property_damages_in_dollars)

final_data_2 %>%
  mutate(date_decision_made = as.Date(date_decision_made)) %>%
  add_count(week = format(date_decision_made, "%W-%y"))

final_data_2$class = "time_series_2"

#combine
data = rbind(final_data, final_data_2)

我試圖用我的數據盡可能地遵循這些示例,但我得到了以下錯誤:

#example 1


#animation

fig <- data %>%
    plot_ly(
        x = ~date_decision_made, 
        y = ~property_damages_in_dollars,
        split = ~class,
        frame = ~frame, 
        type = 'scatter',
        mode = 'lines', 
        line = list(simplyfy = F)
    )
fig <- fig %>% layout(
    xaxis = list(
        title = "Date",
        zeroline = F
    ),
    yaxis = list(
        title = "Median",
        zeroline = F
    )
) 
fig <- fig %>% animation_opts(
    frame = 100, 
    transition = 0, 
    redraw = FALSE
)
fig <- fig %>% animation_slider(
    hide = T
)
fig <- fig %>% animation_button(
    x = 1, xanchor = "right", y = 0, yanchor = "bottom"
)


   #Error in tr[["frame"]][[1]] : object of type 'closure' is not subsettable

第二個例子:

#example 2:

# updatemenus component
updatemenus <- list(
    list(
        active = -1,
        type= 'buttons',
        buttons = list(
            list(
                label = "time_series_1",
                method = "update",
                args = list(list(visible = c(FALSE, TRUE)),
                            list(title = "series 1",
                                 annotations = list(c(), high_annotations)))),
            list(
                label = "time_series_2",
                method = "update",
                args = list(list(visible = c(TRUE, FALSE)),
                            list(title = "series 2",
                                 annotations = list(low_annotations, c() )))),
            
        )
    )
    
    fig <- data %>% plot_ly(type = 'scatter', mode = 'lines') 
    fig <- fig %>% add_lines(x=~date_decision_made, y=~property_damages_in_dollars, name="High",
                             line=list(color="#33CFA5")) 
    fig <- fig %>% add_lines(x=~date_decision_made, y=~property_damage_in_dollars, name="Low",
                             line=list(color="#F06A6A")) 
    fig <- fig %>% layout(title = "Apple", showlegend=FALSE,
                          xaxis=list(title="Date"),
                          yaxis=list(title="Price ($)"),
                          updatemenus=updatemenus)
    
    
 

       fig
    
    # Error: unexpected symbol in:
    "    
        fig"

有人可以告訴我我做錯了什么嗎?

謝謝

對於第一個示例,作為您在數據集中共享的第一個鏈接,它們具有frame列,該列由plotly function 中的frame參數使用,以創建 animation。

您創建的數據集沒有frame變量,但您仍在plotly調用中使用frame ,這導致了您遇到的錯誤。

並且使用示例鏈接中定義的accumulate_by function 生成frame變量。 對於每個日期框架記錄,該日期之前的所有日期都有重復記錄。 因此,如果您的數據有1,462條記錄,則為 plotly 上的 animation 構建的數據是由accumulate_by function 創建的,有535,092條記錄

這是第一個示例的工作代碼:

[更新] - 將 x 軸更改為十進制數,其中日期為小數點。

data <- data %>%
  mutate(date_decision_made = as.Date(date_decision_made, format = "%Y/%m/%d"),
         tmp_date = lubridate::year(date_decision_made) + 
                    as.numeric(strftime(date_decision_made, format = "%j"))/365)

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)
}



#animation
data <- data %>% accumulate_by(~tmp_date)
fig <- data %>%
  plot_ly(
    x = ~tmp_date, 
    y = ~property_damages_in_dollars,
    split = ~class,
    frame = ~frame, 
    type = 'scatter',
    mode = 'lines', 
    line = list(simplyfy = F)
  )

fig

請注意示例 2 中的代碼,您錯過了一次) 在更新菜單的分配被包含在list updatemenus中后,這個錯誤造成了一切,最終導致了你得到的錯誤。

updatemenus <- list(
  list(
    active = -1,
    type= 'buttons',
    buttons = list(
      list(
        label = "time_series_1",
        method = "update",
        args = list(list(visible = c(FALSE, TRUE)),
                    list(title = "series 1",
                         annotations = list(c(), high_annotations)))),
      list(
        label = "time_series_2",
        method = "update",
        args = list(list(visible = c(TRUE, FALSE)),
                    list(title = "series 2",
                         annotations = list(low_annotations, c() )))),
      
    )
  )
# you missed this one
)

fig <- data %>% plot_ly(type = 'scatter', mode = 'lines') 
fig <- fig %>% add_lines(x=~date_decision_made,
  y=~property_damages_in_dollars, name="High",
  line=list(color="#33CFA5")) 
fig <- fig %>% add_lines(x=~date_decision_made, 
  y=~property_damage_in_dollars, name="Low",
  line=list(color="#F06A6A")) 
fig <- fig %>% layout(title = "Apple", showlegend=FALSE,
                      xaxis=list(title="Date"),
                      yaxis=list(title="Price ($)"),
                      updatemenus=updatemenus)




fig

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM