1
resposta

Desafio: criando uma animação para comparar diferentes dados

filtrando Argentina

argentina = df.loc[['Argentina']]

dados_argentina = (
    argentina
    .drop(columns=['Continente', 'Região'])
    .T
    .reset_index()
)

dados_argentina.columns = ['ano', 'imigrantes']

dados_argentina = dados_argentina[dados_argentina['ano'] != 'Total']

dados_argentina['ano'] = dados_argentina['ano'].astype(int)

Garantindo tipos corretos

dados_brasil["ano"] = dados_brasil["ano"].astype(int)
dados_argentina["ano"] = dados_argentina["ano"].astype(int)

dados_brasil["imigrantes"] = pd.to_numeric(dados_brasil["imigrantes"], errors="coerce")
dados_argentina["imigrantes"] = pd.to_numeric(dados_argentina["imigrantes"], errors="coerce")

#ordenar por ano 
dados_brasil = dados_brasil.sort_values("ano").reset_index(drop=True)
dados_argentina = dados_argentina.sort_values("ano").reset_index(drop=True)

Plotando gráfico:

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=dados_brasil["ano"].iloc[:1],
    y=dados_brasil["imigrantes"].iloc[:1],
    mode="lines+markers",
    name="Brasil",
    line=dict(width=4)
))

fig.add_trace(go.Scatter(
    x=dados_argentina["ano"].iloc[:1],
    y=dados_argentina["imigrantes"].iloc[:1],
    mode="lines+markers",
    name="Argentina",
    line=dict(width=4)
))

# 5) Frames: 2 scatters (Brasil e Argentina) em cada frame
frames = []
for i in range(len(anos)):
    frames.append(go.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]),
        ],
        name=str(anos[i])
    ))

fig.frames = frames

# 6) Layout + botões
ymax = max(dados_brasil["imigrantes"].max(), dados_argentina["imigrantes"].max())

fig.update_layout(
    title="Imigração para o Canadá: Brasil x Argentina (1980–2013)",
    xaxis=dict(title="Ano", range=[min(anos), max(anos)]),
    yaxis=dict(title="Número de imigrantes", range=[0, ymax + 200]),
    updatemenus=[dict(
        type="buttons",
        showactive=False,
        buttons=[
            dict(
                label="Play",
                method="animate",
                args=[None, {"frame": {"duration": 120, "redraw": True},
                             "transition": {"duration": 0},
                             "fromcurrent": True}]
            ),
            dict(
                label="Pause",
                method="animate",
                args=[[None], {"frame": {"duration": 0, "redraw": False},
                               "mode": "immediate",
                               "transition": {"duration": 0}}]
            ),
        ]
    )],
    width=1000,
    height=500
)

fig.show()

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oi, Adriely! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Muito bom ver o seu cuidado ao garantir os tipos corretos com astype e to_numeric, além da ordenação por ano. Continue assim!

Uma dica interessante para o futuro é usar o método groupby quando quiser comparar mais países ou categorias de forma escalável. Veja este exemplo:


dados = df.groupby("Pais")[["Ano", "Imigrantes"]].sum().reset_index()

Esse código agrupa os dados por pais e soma os valores, facilitando comparações em gráficos dinâmicos.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!