R: plotly time series graphs

穿精又带淫゛_ 提交于 2021-01-07 02:37:31

问题


I am using the R programming language. 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/

I created some artificial time series data:

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)

I tried to follow the examples as close as I could with my data but I got the following errors:

#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

And the second example:

#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"

Can someone please show me what I am doing wrong?

Thanks


回答1:


For the first example, as the first link you share in the dataset they have frame column which used by frame param in plotly function to create the animation.

The dataset you created didn't have frame variable but you still using frame in plotly call which caused the error you got.

And frame variable is generated using the accumulate_by function defined in the example link. For every date frame record, there are duplicate records of all the date before that date. So if your data has 1,462 records then the data that built for animation on plotly that created by accumulate_by function has 535,092 records

Here is the working code for the first example:

[Updated] - Change x Axis to decimal number where date is decimal point.

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

Regard the code in example 2 you missed one close ). This mistake made everything after the assignment of updatemenus was included in the list function and end up result the error you got.

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


来源:https://stackoverflow.com/questions/65527613/r-plotly-time-series-graphs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!