Ei, Ranny! Tudo bem?
Você está se saindo muito bem! Podemos ajustar alguns pontos que vão melhorar o seu código e trazer o resultado esperado. Por exemplo:
- Na preparação dos dados, criar
dados_brasil
e dados_argentina
como dataframes com 'ano'
como tipo int
(inteiro). - Seus frames incluem apenas uma linha (Brasil) e não estão estruturados para animar duas linhas juntas. O instrutor usa uma lista com dois objetos go.Scatter por frame.
- A duração da animação no seu código (12ms) é muito curta, o que pode tornar a animação difícil de observar. O instrutor usa 100ms, mais adequado.
Deixo aqui o seu código ajustado:
import pandas as pd
import plotly.graph_objs as go
# Carregar os dados
df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/bibliotecas_visualizacao/refs/heads/main/Dados/imigrantes_canada.csv')
df.set_index('País', inplace=True)
# Filtrar para América do Sul
america_sul = df.query('Região == "América do Sul"')
# Limpar e transpor os dados
df_america_sul_clean = america_sul.drop(['Continente', 'Região', 'Total'], axis=1)
america_sul_final = df_america_sul_clean.T
# Criar DataFrames separados para Brasil e Argentina
dados_brasil = pd.DataFrame({'ano': america_sul_final.index.astype(int), 'imigrantes': america_sul_final['Brasil']})
dados_argentina = pd.DataFrame({'ano': america_sul_final.index.astype(int), 'imigrantes': america_sul_final['Argentina']})
# Criando uma figura
fig = go.Figure()
# Adicionando a linha com os dados do Brasil
fig.add_trace(
go.Scatter(x=[dados_brasil['ano'].iloc[0]], y=[dados_brasil['imigrantes'].iloc[0]], mode='lines', name='Imigrantes do Brasil', line=dict(width=4))
)
# Adicionando a linha com os dados da Argentina
fig.add_trace(
go.Scatter(x=[dados_argentina['ano'].iloc[0]], y=[dados_argentina['imigrantes'].iloc[0]], mode='lines', name='Imigrantes da Argentina', line=dict(width=4))
)
# Definindo as configurações de layout
fig.update_layout(
title=dict(
text='<b>Imigração do Brasil e da Argentina para o Canadá no período de 1980 a 2013',
x=0.1,
font=dict(size=18)
),
xaxis=dict(range=[1980, 2013], autorange=False, title='<b>Ano</b>'),
yaxis=dict(range=[0, 3000], autorange=False, title='<b>Número de imigrantes</b>'),
updatemenus=[dict(
type='buttons',
showactive=False,
buttons=[dict(
label='Play',
method='animate',
args=[None, {'frame': {'duration': 100, 'redraw': True}, 'fromcurrent': True}]
)]
)],
width=1200,
height=600
)
# Definindo as configurações de animação
frames = []
for i in range(len(dados_brasil)):
frame_data = [
go.Scatter(x=dados_brasil['ano'].iloc[:i+1], y=dados_brasil['imigrantes'].iloc[:i+1]),
go.Scatter(x=dados_argentina['ano'].iloc[:i+1], y=dados_argentina['imigrantes'].iloc[:i+1])
]
frame = go.Frame(data=frame_data)
frames.append(frame)
fig.frames = frames
# Mostrando a figura
fig.show()
No notebook de teste você pode ver o gráfico funcionando após o play.
Espero ter ajudado e qualquer dúvida, compartilhe no fórum.
Bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado!