1
resposta

[Dúvida] Como 'desempilhar' gráficos de barras horizontais.

Estou trabalhando em um desafio e preciso plotar um gráfico de barras horizontais para comparar 'safras', mas não que quero que elas fiquem empilhadas, alguma ideia de como posso fazer isso, aproveitando o que já fiz até agora?

fig, ax = plt.subplots(figsize=(15,8), sharey = False)
# GRÁFICO 1 - Barras empilhadas
ax.barh(df_por_safra_oeste.index, df_por_safra_oeste["21-22"], color = AZUL2)
ax.barh(df_por_safra_oeste.index, df_por_safra_oeste["22-23"], color = AZUL3)
ax.barh(df_por_safra_oeste.index, df_por_safra_oeste["23-24"], color = AZUL4)
ax.set_title('Em valores absolutos\n', color = CINZA2)
ax.set_xlabel('')
ax.set_ylabel('')
ax.set_xticklabels([])
ax.yaxis.set_tick_params(labelsize=14, color = CINZA2)
ax.set_frame_on(False)
1 resposta

Olá Murilo, tudo bem com você?

Por padrão da biblioteca Matplotlib teremos um gráfico com colunas empilhadas, porém para comparar "safras" sem empilhá-las, temos que ajustar as posições das barras para que não se sobreponham. Isso pode ser feito alterando as posições das barras no eixo y, nesse caso, utilizaremos uma posição para cada uma das barras no parâmetro y e também usaremos o parâmetro width, para mostrar as barras próximas uma das outras.

Exemplo de código:

import matplotlib.pyplot as plt
import pandas as pd

COR_1 = '#845EC2'
COR_2 = '#4B4453'
COR_3 = '#B0A8B9'
COR_4 = 'gray'


data = {
    'Safra': ['Safra X', 'Safra Y', 'Safra Z'],
    '21-22': [10, 15, 20],
    '22-23': [12, 18, 22],
    '23-24': [14, 20, 24]
}

df_por_safra_oeste = pd.DataFrame(data)
df_por_safra_oeste.set_index('Safra', inplace=True)


fig, ax = plt.subplots(figsize=(15, 8), sharey=False)

# Defina a largura das barras
bar_width = 0.2

# Defina as posições das barras para cada safra
pos_21_22 = range(len(df_por_safra_oeste))
pos_22_23 = [pos + bar_width for pos in pos_21_22]
pos_23_24 = [pos + bar_width for pos in pos_22_23]


bar1 = ax.barh(pos_21_22, df_por_safra_oeste["21-22"], height=bar_width, color=COR_1, label='21-22')
bar2 = ax.barh(pos_22_23, df_por_safra_oeste["22-23"], height=bar_width, color=COR_2, label='22-23')
bar3 = ax.barh(pos_23_24, df_por_safra_oeste["23-24"], height=bar_width, color=COR_3, label='23-24')

ax.set_yticks(pos_22_23)
ax.set_yticklabels(df_por_safra_oeste.index)
ax.set_xlabel('Valores')
ax.set_title('Comparação entre Safras\n', color=COR_4)
ax.legend()

ax.set_frame_on(False)

plt.show()

Resultado:

Imagem que mostra os gráficos agrupados por safra, sem empilhar as colunas

Caso queira se aprofundar neste assunto, recomendo a leitura deste artigo. Reforço também que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!