Как я могу заставить сюжетную анимацию начинаться с последнего кадра?

#python #plotly #data-visualization

#python #plotly #визуализация данных

Вопрос:

Я хотел бы изменить «стандартный» кадр моей анимированной диаграммы и заставить его использовать последнюю дату по умолчанию при визуализации приложения Dash. Как я могу это сделать?

 import plotly.express as px

df = px.data.gapminder()

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])

  

Я пробую несколько разных подходов, например, что-то вроде этого:

 fig.layout['sliders'][0]['active'] = 11

and

frame = -1
fig = go.Figure(fig.frames[frame].data, fig.frames[frame].layout)
fig

  

но это неправильно отражается на графике.

Может ли кто-нибудь дать мне указания о том, как я могу найти ссылки на это?

Я хочу заставить график начинаться с прошлого года.

Комментарии:

1. Если предоставленное предложение решило вашу проблему, пожалуйста, проголосуйте и отметьте его как принятый ответ.

2. Привет, Вестланд, спасибо за совет, я еще не слишком разбираюсь в динамике StackOverflow. Что мне делать, если мой собственный ответ является правильным ответом?

3. Я бы сделал то же, что и вы; отдайте должное тем, кто вам помог. Особенно, если их предложение каким-либо образом помогло вам создать идеальное решение. Я не уверен, так ли это здесь, но я бы сделал это так в любом случае.

Ответ №1:

Большое вам спасибо за ваш ответ, брат; Это работает.

Я создал решение, похожее на ваше, но с некоторыми отличиями:

 import plotly.express as px
import plotly.graph_objects as go

df = px.data.gapminder()

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])

last_frame_num = len(fig.frames) -1

fig.layout['sliders'][0]['active'] = last_frame_num

fig = go.Figure(data=fig['frames'][-1]['data'], frames=fig['frames'], layout=fig.layout)

fig
  

В любом случае, я очень ценю ваше внимание / поддержку, всегда здорово иметь больше возможностей при реализации чего-либо!

Большое вам спасибо; С наилучшими пожеланиями, Леонардо

Комментарии:

1. Вы можете пропустить last_frame_num и установить data=fig.frames[-1].data и считать, что len(fig.frames) - 1 это уже int .

2. Да, хорошо, что я отредактирую код; Я установил этот способ, потому что, когда я пытался реализовать с помощью -1, он не работал с активным параметром slider, поэтому я решил установить переменную с этим значением, чтобы быть уверенным, что оно всегда будет таким же.

3. Для меня это не работает для установки произвольного номера кадра (например, 5 вместо «last_frame_num»). Он отображает правильный кадр, после чего анимация начинается с нуля.

Ответ №2:

Проблема в том, что у fig.data вас есть первый кадр. Я нашел обходной путь, создающий новую фигуру.

 import plotly.express as px
import plotly.graph_objects as go

df = px.data.gapminder()

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])

# New figure
fig2 = go.Figure()

# add last frame traces to fig2
for tr in fig.frames[-1].data:
    fig2.add_trace(tr)

# copy the layout
fig2.layout = fig.layout

#  copy the frames
fig2.frames = fig.frames

# set last frame as the active one
fig2.layout['sliders'][0]['active'] = len(fig.frames) - 1

fig2