#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:
- концепция
- используйте plotly express для создания рисунка для каждого кадра анимации
- создайте все кадры с шага 1
- создайте макет, в основном ползунки, из рисунков на шаге 1
- наконец, постройте новую фигуру из шагов 2 и 3
- ограничения
- Космос… ползунки, которые занимают много места
- каждый ползунок независим, отображается последний выбранный ползунок. Нет визуального сигнала
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
)