In an animated plotly scatter plot, how to change the axis scale per frame... but in R? (adapt a python solution?)

Viewed 440

I'm trying to make an animated plotly graph within R where both axes' min and max change during the animation. Someone recently asked this exact question for python, and it was solved by using layout update and looping through the "frames."

Python solution here: Is there a way to dynamically change a plotly animation axis scale per frame?

Here is the python code.

import plotly.express as px
df = px.data.gapminder()
df = df[(df['continent'] == 'Asia') & (df['year'].isin([1997, 2002, 2007]))]

scales = [2002]

fig = px.scatter(df, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
           size="pop", color="continent", hover_name="country",
           log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])

yranges = {2002:[0, 200]}

for f in fig.frames:
    if int(f.name) in yranges.keys():
        f.layout.update(yaxis_range = yranges[int(f.name)])

fig.show()

I've been looking through the R examples and the R plotly object, and I can't figure out... how would I apply this solution to R?

There's a solution using Shiny here, but the animation is much less smooth, it doesn't have the slider, and I don't know anything about shiny, so I'd rather avoid it if I could: https://community.plotly.com/t/what-is-the-most-performant-way-to-update-a-graph-with-new-data/639/6?u=fabern

In case it's useful, I wrote up my code to start recreating the example in R... as far as I could get.Maybe I need to be using plotly express or dash or some such?

library("gapminder")
library('data.table')
  data(package = "gapminder")
  df <- as.data.table(as.data.frame(gapminder))
  df <- df[continent=='Asia' & year %in% c(1997, 2002, 2007)]
  
  graph_animated <- plot_ly(df, x = ~gdpPercap, y = ~lifeExp, frame = ~year, size = ~pop,
                            type = 'scatter', color = ~continent)
1 Answers

The easiest way to do this is to build the plot and then add the change. You have to build first, in order to see the frames you want to modify.

# build
plt <- plotly_build(graph_animated)

# modify the layout for the second frame
plt$x$frames[[2]]$layout = list(yaxis = list(range = c(0, 200)))

After that, you can visualize it as you would any other plot.

enter image description here

Related