I really like the recent version of Plotly in R with the animation options.
However, I would like to recreate this Python animation of a time series in R. Does anyone know if it is possible?
I really like the recent version of Plotly in R with the animation options.
However, I would like to recreate this Python animation of a time series in R. Does anyone know if it is possible?
Hey @filipwastberg,
thereโll be some R animation docs online in the near future. For now, an example of filled-area animation:
library(plotly)
library(quantmod)
getSymbols("AAPL",src='yahoo')
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)
p <- 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'
) %>%
layout(
title = "AAPL: Last 30 days",
yaxis = list(
title = "Close",
range = c(0,200),
zeroline = F,
tickprefix = "$"
),
xaxis = list(
title = "Day",
range = c(0,30),
zeroline = F,
showgrid = F
)
) %>%
animation_opts(
frame = 100,
transition = 0,
redraw = FALSE
) %>%
animation_slider(
currentvalue = list(
prefix = "Day "
)
)
Nice @bcd ! Guess I should have looked a little bit closer in the animation_ops() documentation.
This was really helpful, however, is there a way to work with dates and key frame animations?
If I use x = ~Date
the plot does not work.
library(plotly)
library(quantmod)
getSymbols("AAPL",src='yahoo')
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)
p <- df %>%
plot_ly(
x = ~Date,
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'
) %>%
layout(
title = "AAPL: Last 30 days",
yaxis = list(
title = "Close",
range = c(0,200),
zeroline = F,
tickprefix = "$"
),
xaxis = list(
title = "Day",
range = c(0,30),
zeroline = F,
showgrid = F
)
) %>%
animation_opts(
frame = 100,
transition = 0,
redraw = FALSE
) %>%
animation_slider(
currentvalue = list(
prefix = "Day "
)
)
@bcd is there any way to use frame on Date-variables?
If I use x = ~Date the plot does not work.