3
respostas

[Dúvida] Desafio 2

E se eu quiser fazer dois gráficos como na aula, um absoluto e um de porcentagem?

3 respostas

Ei! Tudo bem, William?

Para criar dois gráficos, um mostrando valores absolutos e outro com porcentagens, você pode fazer isso com a biblioteca Matplotlib.

Um exemplo para o gráfico absoluto:

  • Importe as bibliotecas
import pandas as pd
import matplotlib.pyplot as plt
  • Gráfico 1: Valores absolutos
fig, ax = plt.subplots(figsize=(8, 8))
vendas_co_ano.plot(kind="bar", stacked=True, color=cores, ax=ax)
ax.set_title('Vendas das lojas de departamentos na Região Centro-Oeste\nentre os anos de 2017 a 2018', 
             loc='left', fontsize=16, color=CINZA1)
ax.set_xlabel('')
ax.set_ylabel('')
ax.set_yticklabels([])
ax.xaxis.set_tick_params(labelsize=14, labelcolor=CINZA2, rotation=0)
ax.set_frame_on(False)
ax.tick_params(axis="both", which="both", length=0)
ax.text(-0.8, 1e5, 'O estado de Goiás\nrealizou mais vendas\nnas unidades do\nCentro-Oeste em 2017.', 
        fontsize=10, linespacing=1.2, color=AZUL1)
ax.text(1.3, 8e4, 'O Distrito Federal passou\no estado de Goiás em vendas\nno ano de 2018.', 
        fontsize=10, linespacing=1.2, color=AZUL1)
ax.legend(bbox_to_anchor=(1, 1), reverse=True, title="Estado", title_fontsize=10, fontsize=10)
for container in ax.containers:
    labels = [f'R$ {valor.get_height()/1000:,.2f} mil'.replace(",", ".") for valor in container]
    ax.bar_label(container, label_type="center", labels=labels, size=10, color=CINZA5, fontweight="bold")
plt.show()

Saída do gráfico.

  • Gráfico 2: valores percentuais:
fig, ax = plt.subplots(figsize=(8, 8))
vendas_co_ano_perc.plot(kind="bar", stacked=True, color=cores, ax=ax)
ax.set_title('Distribuição percentual das vendas na Região Centro-Oeste\nentre os anos de 2017 a 2018',
             loc='left', fontsize=16, color=CINZA1)
ax.set_xlabel('')
ax.set_ylabel('')
ax.set_yticklabels([f'{int(x)}%' for x in ax.get_yticks()])  # Mostrar porcentagens no eixo y
ax.xaxis.set_tick_params(labelsize=14, labelcolor=CINZA2, rotation=0)
ax.set_frame_on(False)
ax.tick_params(axis="both", which="both", length=0)
ax.text(-0.8, 60, 'Goiás liderou a proporção\nde vendas em 2017.',
        fontsize=10, linespacing=1.2, color=AZUL1)
ax.text(1.3, 50, 'Distrito Federal assumiu\na maior proporção em 2018.',
        fontsize=10, linespacing=1.2, color=AZUL1)
ax.legend(bbox_to_anchor=(1, 1), reverse=True, title="Estado", title_fontsize=10, fontsize=10)
for container in ax.containers:
    labels = [f'{valor.get_height():.1f}%' for valor in container]
    ax.bar_label(container, label_type="center", labels=labels, size=10, color=CINZA5, fontweight="bold")
plt.show()

Saída do gráfico.

Espero ter ajudado e qualquer dúvida, compartilhe no fórum.

Até mais, William!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!

Tudo bem, me desculpe não fui claro a respeito do gráfico que na verdade era esse: Distribuição percentual dos modos de envio por cada departamento\n(2016-2019), posso usar como base esses códigos acima para faze-los?

Ei! Tudo bem, William?
Sem problemas, é normal precisar esclarecer detalhes, fico feliz que você perguntou!

Sim, você pode usar os códigos como base. Para adaptar, garanta que os dados estejam organizados com os modos de envio por departamento e calcular as porcentagens para o período de 2016 a 2019.

import pandas as pd
import matplotlib.pyplot as plt

# Criando um Dataframe com distribuição de envio por departamento
df_distribution = vendas.groupby('departamento')['modo_envio'].value_counts().unstack(fill_value=0)

# Calculando a distribuição percentual
df_percent = df_distribution.apply(lambda x: x / x.sum() * 100, axis=1)

fig, ax = plt.subplots(figsize=(8, 8))
df_percent.plot(kind="bar", stacked=True, color=['#1f77b4', '#ff7f0e', '#2ca02c'], ax=ax) 
ax.set_title('Distribuição percentual dos modos de envio por departamento\n(2016-2019)',
             loc='left', fontsize=16, color='grey')
ax.set_xlabel('Departamentos', fontsize=12)
ax.set_ylabel('Porcentagem', fontsize=12)
ax.set_yticks(ax.get_yticks()) # Set fixed ticks
ax.set_yticklabels([f'{int(x)}%' for x in ax.get_yticks()])
ax.xaxis.set_tick_params(labelsize=12, rotation=45) 
ax.set_frame_on(False)
ax.tick_params(axis="both", which="both", length=0)
ax.legend(title="Modo de Envio", title_fontsize=10, fontsize=10, bbox_to_anchor=(1, 1))
for container in ax.containers:
    labels = [f'{valor.get_height():.1f}%' for valor in container]
    ax.bar_label(container, label_type="center", labels=labels, size=10, color='black', fontweight="bold")
plt.show()

Espero que esse exemplo te ajude, abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!