Анимация с сюжетом с двумя параметрами

#python #animation #plotly

Вопрос:

С помощью Plotly можно легко создавать анимации, используя параметр animation_frame в Plotly Express, описанный здесь. Я хотел бы сделать то же самое, но с двумя параметрами (или более в конечном итоге). Добавив псевдокод к примеру, который они приводят в ссылке, которую я опубликовал, я хотел бы сделать что-то вроде:

 import plotly.express as px
df = px.data.gapminder()
px.scatter(df, 
    x = "gdpPercap", 
    y = "lifeExp", 
    animation_frame_1 = "year", 
    animation_frame_2 = "another parameter"
)
 

и получить в результате этот участок:

введите описание изображения здесь

Возможно ли это? Как? Меня не интересует функция анимации (т. Е. Автоматическое изменение параметров со временем), только наличие ползунков для изучения данных.

Ответ №1:

  • концепция
    1. используйте plotly express для создания рисунка для каждого кадра анимации
    2. создайте все кадры с шага 1
    3. создайте макет, в основном ползунки, из рисунков на шаге 1
    4. наконец, постройте новую фигуру из шагов 2 и 3
  • ограничения
    1. Космос… ползунки, которые занимают много места
    2. каждый ползунок независим, отображается последний выбранный ползунок. Нет визуального сигнала
 import plotly.express as px
import plotly.graph_objects as go

df = px.data.gapminder()
# add another column to "animate" on...
df["decade-continent"] = df.apply(
    lambda x: f'{round(x["year"], -1)}-{x["continent"]}', axis=1
)

# use px to do heavy lifting construction
figs = [
    px.scatter(
        df,
        x="gdpPercap",
        y="lifeExp",
        animation_frame=ac,
    )
    # columns that become sliders
    for ac in ["continent", "year", "decade-continent"]
]

# extract frames and sliders from each of the animated figures
layout = figs[0].to_dict()["layout"]
layout.pop("updatemenus") # don't want play and pause buttons
layout["sliders"] = []
frames = []
for i, f in enumerate(figs):
    slider = f.to_dict()["layout"]["sliders"]
    slider[0]["y"] = -0.6 * i
    slider[0]["x"] = 0
    slider[0]["len"] = 1

    layout["sliders"]  = slider
    frames  = f.frames

# finally build the figure with multiple sliders
go.Figure(data=figs[0].data, frames=frames, layout=layout).update_layout(
    margin={"l": 0, "r": 0, "t": 0, "b": 0}, height=400
)
 

введите описание изображения здесь