1
resposta

[Dúvida] Por que minha resulação do desafio 5 está dando errado?

import pandas as pd
import plotly.graph_objs as go

df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/bibliotecas_visualizacao/refs/heads/main/Dados/imigrantes_canada.csv')
df

df.set_index('País', inplace=True)

america_sul = df.query('Região == "América do Sul"')

df_america_sul_clean = america_sul.drop(['Continente','Região','Total'], axis=1) # 1 = colunas 0 = linhas
america_sul_final = df_america_sul_clean.T


# Criando uma figura
fig = go.Figure()

# Adicionando a linha do gráfico e definindo a espessura da linha
fig.add_trace(
    go.Scatter(
        x=[america_sul_final.index[0]],
        y=[america_sul_final['Brasil'].iloc[0]],
        mode='lines',
        name='Brasil',
        line=dict(width=4)
        )
    )

# Definir as configurações de animação
frames = [
    go.Frame(
        data=[
            go.Scatter(
                x=america_sul_final.index[:i+1],
                y=america_sul_final['Brasil'].iloc[:i+1],
                mode='lines',
                name='Brasil',
                line=dict(width=4)
                )
            ],
        name=str(america_sul_final.index[i])
        )
    for i in range(len(america_sul_final))]

fig.frames = frames

# Definindo as configurações de layout
fig.update_layout(
    title=dict(
        text='<b>Imigração do Brasil para o Canadá no período de 1980 a 2013</b>',
        x=0.12,
        xanchor='left',
        font=dict(size=20)
    ),
    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': 12, 'redraw': True}, 'fromcurrent': True}]
        )]
    )],
    width=1000, 
    height=500 
)

# Mostrando a figura
fig.show()
1 resposta

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!