Desafio 1
AZUL1, AZUL2, AZUL3, AZUL4, AZUL5, AZUL6 = '#174A7E', '#4A81BF', "#6495ED", '#2596BE', '#94AFC5', '#CDDBF3'
CINZA1, CINZA2, CINZA3, CINZA4, CINZA5, BRANCO = '#231F20', '#414040', '#555655', '#A6A6A5', '#BFBEBE', '#FFFFFF'
VERMELHO1, VERMELHO2, LARANJA1 = '#C3514E', '#E6BAB7', '#F79747'
VERDE1, VERDE2, VERDE3 = '#0C8040', '#9ABB59', '#9ECCB3'
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/dataviz-graficos-composicao-relacionamento/refs/heads/main/dados/pib_br_2002_2020_estados.csv')
df.head()
pib_sp = df.copy()
pib_sp = pib_sp.query("ano == 2020 and sigla_uf == 'SP'")[['va', 'impostos_liquidos', 'pib']]
pib_sp.rename(columns = {"pib":"PIB", "impostos_liquidos": "Impostos Líquidos", "va":"Valor Adicionado Bruto"}, inplace=True)
pib_sp = pib_sp.melt( var_name = 'Indicadores', value_name = 'Valores')
pib_sp
pib_sp['Valores_(em texto)'] = (pib_sp['Valores']/1e9).map('R$ {:,.3f} Bi'.format)
pib_sp["Medidas"] = ["absolute", "relative", "total"]
pib_sp
import plotly.graph_objects as go
fig = go.Figure(go.Waterfall(name = '', measure = pib_sp['Medidas'], x = pib_sp['Indicadores'], y = pib_sp['Valores'], text = pib_sp['Valores_(em texto)'], textposition = 'outside', connector_line = dict(color = CINZA3), increasing_marker = dict(color = VERDE1)))
fig.update_layout(width=1000, height=500, font_family = 'DejaVu Sans', font_size=15,
font_color= CINZA2, title_font_color= CINZA1, title_font_size=24,
title_text='Distribuição do Produto Interno Bruto (PIB) de São Paulo em 2020' +
'<br><sup size=1 style="color:#555655">Impostos líquidos e Valores ' +
'Adicionados Brutos de bens e serviços (em bilhões de reais)</sup>',
title_pad_l = 50, plot_bgcolor= BRANCO, yaxis_range=[0,2900e9], hovermode="closest")
fig.update_yaxes(showticklabels=False)
fig.update_traces(hovertemplate = "<b>%{x}</b> = %{text}")
fig.add_annotation(text='Fonte dos dados: <a href="https://sidra.ibge.gov.br/pesquisa/pib-munic/tabelas">Produto Interno Bruto | IBGE</a>',
align="left", xref="paper", yref = "paper", x=1, y=-0.2, showarrow=False)
fig.show()
Desafio 2
nordeste = df.copy()
anos = [x for x in range(2016,2021)]
nordeste = nordeste.query("regiao == 'Nordeste' and ano == @anos")[["ano", "va_servicos"]]
nordeste = nordeste.groupby('ano').sum().reset_index()
nordeste
nordeste['variacao_servicos'] = nordeste['va_servicos'].diff().fillna(nordeste['va_servicos']).astype('int64')
nordeste['Medidas'] = ['absolute'] + ['relative'] * 4
atualizacao = pd.DataFrame({'ano': ['Total'],
'va_servicos': [nordeste["va_servicos"].values[-1]],
'variacao_servicos': [nordeste["va_servicos"].values[-1]],
'Medidas': ["total"]})
nordeste = pd.concat([nordeste, atualizacao], axis = 0, ignore_index = True)
nordeste = nordeste.drop(columns = ['va_servicos'])
nordeste['Variação servicos(em texto)'] = (nordeste['variacao_servicos']/1e9).map('R$ {:,.2f} Bi'.format)
nordeste
import plotly.graph_objects as go
import numpy as np
fig = go.Figure(go.Waterfall(name = '', measure = nordeste['Medidas'], y = nordeste['variacao_servicos'],
text = nordeste['Variação servicos(em texto)'], textposition = 'outside', connector_line = dict(color = CINZA1),
totals_marker = dict(color = AZUL3), increasing_marker = dict(color = VERDE1), decreasing_marker = dict(color = VERMELHO1) ))
fig.update_layout(width=1300, height=600, font_family = 'DejaVu Sans', font_size=14,
font_color= CINZA2, title_font_color= CINZA1, title_font_size=24, title_text='Variação do Valor Agregado dos Serviços da Região Nordeste' +
'<br><sup size=1 style="color:#555655">De 2016 a 2020 (em bilhões de reais)</sup>', plot_bgcolor= BRANCO, yaxis_range=[0,500e9])
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(tickmode='array', tickvals=np.arange(0,6), ticktext=nordeste["ano"])
fig.update_traces(hovertemplate = "<b>%{x}</b> = %{text}")
fig.add_annotation(text="O <b>Ano de 2020</b> apresentou recuo <br> no valor agregado dos serviços.",
align="left", axref = 'x', ayref='y', x=4, y= 410e9, ax=4, ay=300e9,
arrowhead=1, arrowside = "start", showarrow=True, arrowwidth=2, arrowcolor=CINZA3,
bordercolor= CINZA3, borderwidth=1, borderpad=4)
fig.show()