Cumulative Animations in R
How to create cumulative animations in R with Plotly.
Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.
Frames
Now, along with data
and layout
, frames
is added to the keys that figure
allows. Your frames
key points to a list of figures, each of which will be cycled through upon instantiation of the plot.
Cumulative Lines Animation
library(plotly)
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)
}
df <- txhousing
fig <- df %>%
filter(year > 2005, city %in% c("Abilene", "Bay Area"))
fig <- fig %>% accumulate_by(~date)
fig <- fig %>%
plot_ly(
x = ~date,
y = ~median,
split = ~city,
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"
)
fig
Filled-Area Animation
library(plotly)
library(quantmod)
getSymbols("AAPL",src='yahoo')
## [1] "AAPL"
df <- data.frame(Date=index(AAPL),coredata(AAPL))
df <- tail(df, 30)
df$ID <- seq.int(nrow(df))
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)
}
df <- df %>% accumulate_by(~ID)
fig <- df %>% plot_ly(
x = ~ID,
y = ~AAPL.Close,
frame = ~frame,
type = 'scatter',
mode = 'lines',
fill = 'tozeroy',
fillcolor='rgba(114, 186, 59, 0.5)',
line = list(color = 'rgb(114, 186, 59)'),
text = ~paste("Day: ", ID, "<br>Close: $", AAPL.Close),
hoverinfo = 'text'
)
fig <- fig %>% layout(
title = "AAPL: Last 30 days",
yaxis = list(
title = "Close",
range = c(0,250),
zeroline = F,
tickprefix = "$"
),
xaxis = list(
title = "Day",
range = c(0,30),
zeroline = F,
showgrid = F
)
)
fig <- fig %>% animation_opts(
frame = 100,
transition = 0,
redraw = FALSE
)
fig <- fig %>% animation_slider(
currentvalue = list(
prefix = "Day "
)
)
fig
Reference
To read more on animations see The Plotly Book.
What About Dash?
Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.
Learn about how to install Dash for R at https://dashr.plot.ly/installation.
Everywhere in this page that you see fig
, you can display the same figure in a Dash for R application by passing it to the figure
argument of the Graph
component from the built-in dashCoreComponents
package like this:
library(plotly)
fig <- plot_ly()
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... )
library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)
app <- Dash$new()
app$layout(
htmlDiv(
list(
dccGraph(figure=fig)
)
)
)
app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)