Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como inserir os rótulos em um gráfico de barra no Matplotlib (pandas)?

Olá pessoal!

Gostaria de saber como posso colocar os rótulos dos dados em um gráfico de barras com o matplotlib.

Alguém pode me auxiliar? Agradeço!!! :D

3 respostas

Olá, Francisco, tudo bem?

Muito boa a sua pergunta!

Então, existem algumas formas de se fazer esse processo. Vamos colocar aqui duas formas, sendo a primeira usando a versão 3.4.2 ou superior do Matplotlib e a segunda levando em consideração que o aluno tenha uma versão anterior.

Para realizarmos esse teste, vamos utilizar um exemplo de notas de alguns alunos em uma dada matéria, como podemos ver abaixo:

import pandas as pd

dados = pd.DataFrame({'Alunos': ['João','Maria','José'],
                   '1ª Unidade': [8.0 , 10.0, 5.0 ],
                   '2ª Unidade': [7.0, 9.0 ,8.0],
                   '3ª Unidade': [7.0, 7.0, 7.5],
                   '4ª Unidade': [5.0, 9.0, 6.5]})
dados

Nesse exemplo, o nosso DataFrame teria a seguinte saída:

Alunos1ª Unidade2ª Unidade3ª Unidade4ª Unidade
0João8.07.07.05.0
1Maria10.09.07.09.0
2José5.08.07.56.5

Pronto! Agora vamos a parte que interessa que é plotar o nosso gráfico e rotular os seus respectivos valores.

 

1ª forma - Usando o Matplotilib (versão 3.4.2 ou superior)


 

Para facilitar a compreensão e visualização da criação de rótulos, vamos desenhar um gráfico com apenas as notas da 1ª Unidade.

Inicialmente, vamos importar as bibliotecas necessárias para plotar nosso gráfico:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

Para verificarmos se no nosso ambiente de desenvolvimento (Jupyter Notebook, Google Colab ou Pycharm, por exemplo) temos a versão 3.4.2 ou acima do Matplotlib, executaremos a seguinte linha de código:

matplotlib.__version__

Caso seja uma versão anterior, podemos instalá-la em nosso ambiente através de !pip install matplotlib==3.4.2 ou usaremos a 2ª forma neste post.

Continuando, na versão em questão, é bem simples fazer inserção dos rótulos de um gráfico de barras. Basta apenas utilizarmos o método bar_label() da biblioteca matplotlib, passando como parâmetro o gráfico que produzimos, nesse exemplo seria o grafico_1_unidade.

O parâmetro fmt é responsável por escolher a formatação do nosso rótulo (aqui colocamos o nosso valor como um float com 1 casa decimal), size o tamanho do texto e label_type a posição ('edge' vai para o topo da barra e 'center' para o centro).

fig, ax = plt.subplots(figsize=(10, 8))

x = np.arange(len(dados["Alunos"]))

# Plotando o gráfico da 1ª Unidade
grafico_1_unidade = ax.bar(x = x, height="1ª Unidade",  data=dados) 
ax.set_title('Nota dos Alunos da Turma', fontsize=16, pad=20)
ax.set_xlabel('Aluno', fontsize=14, labelpad=10)
ax.set_ylabel('Nota', fontsize=14, labelpad=10)
ax.set_xticks(x)
ax.set_xticklabels(dados["Alunos"])

# colocando o rótulo nas barras
ax.bar_label(grafico_1_unidade, fmt="%.01f", size=10, label_type="edge")

O nosso gráfico com bar_label() teria a seguinte saída:

Gráfico de barras com as notas da 1ª Unidade dos alunos do DataFrame exemplo. No eixo x temos 3 alunos (João, Maria e José) e no eixo y temos os valores das notas de 0 a 10. No gráfico, temos 3 barras na cor azul com os rótulos dos dados acima de cada barra (8.0, 10.0 e 5.0) representando as notas dos alunos nesta unidade.

 

Para aprender um pouco mais sobre o método bar_label() aqui estão alguns links indicados:

Para Saber Mais
Documentação do bar_label
Exemplos na documentação do bar_label
How To Annotate Barplot with bar_label() in Matplotlib

 

Continua no próximo post

solução!

2ª forma - Usando o Matplotilib (versões inferiores a 3.4.2)


 

Caso não tenha ou não queira instalar a versão 3.4.2 do matplotlib, vamos descrever como também seria possível inserir os rótulos nos gráficos de barra.

Para facilitar a compreensão dessa funcionalidade, vamos criar uma função chamada rotulo que recebe como argumento um gráfico (grafico).

O laço for nessa função é responsável por adicionar um rótulo em cada barra do nosso gráfico. Para tal, pegaremos as alturas e as larguras de cada barra para manipular a posição da escrita dos rótulos.

Nos comentários do código abaixo, explicamos algumas possibilidades de posicionamento do rótulo:

  • xpos pega a posição x de cada barra e soma a sua largura dividida por 2, ou seja, posiciona o rótulo bem no meio da barra no sentido horizontal.
  • ypos, no nosso exemplo, será reponsável pelo posicionamento no sentido vertical. Aqui deixamos 3 formas diferentes de posicionar o nosso rótulo e, no código abaixo, testamos para o nosso rótulo em cima de cada barra.

 

Por fim, o método text() é reponsável por pegar esses posicionamentos(x e y), o texto(s) que quer escrever e alguns parâmetros visuais.

O código descrito teria esse formato:

fig, ax = plt.subplots(figsize=(10, 8))

x = np.arange(len(dados["Alunos"]))

# Plotando o gráfico da 1ª Unidade
grafico_1_unidade = ax.bar(x = x, height="1ª Unidade",  data=dados) 
ax.set_title('Nota dos Alunos da Turma', fontsize=16, pad=20)
ax.set_xlabel('Aluno', fontsize=14, labelpad=10)
ax.set_ylabel('Nota', fontsize=14, labelpad=10)
ax.set_xticks(x)
ax.set_xticklabels(dados["Alunos"])

# Criando uma função para adicionar rótulos sobre as barras do gráfico
def rotulo(grafico):
    # Laço for para adicionar um texto em cima de cada barra com os valores das notas
    for barra in grafico:
      # Pegando a altura(valor) e largura de cada barra
        altura = barra.get_height()
        largura = barra.get_width()

        '''
          Posição x(xpos) e y(ypos) de cada barra. Aqui temos três casos de y pos:
          1º - colocando o rótulo acima da barra
          2º - colocando o rótulo no meio da barra
          3º - colocando o rótulo na base da barra
          Para selecionar o desejado, é só descomentar o ypos que quer fazer uso.
        '''
        xpos = barra.get_x() + largura/2
        ypos = 1.01 * altura
        # ypos = barra.get_y() + altura/2
        # ypos = barra.get_y()

        # Adicionando o rótulo nas barras (x= coordenada x, y = coordenada y, s = texto desejado)
        ax.text(x = xpos, y = ypos, s = altura, ha='center', va='bottom', fontsize=14)

# chamando a função de rotular os dados
rotulo(grafico_1_unidade)

O nosso gráfico com a função criada teria a seguinte saída:

Gráfico de barras com as notas da 1ª Unidade dos alunos do DataFrame exemplo. No eixo x temos 3 alunos (João, Maria e José) e no eixo y temos os valores das notas de 0 a 10. No gráfico, temos 3 barras na cor azul com os rótulos dos dados acima de cada barra (8.0, 10.0 e 5.0) representando as notas dos alunos nesta unidade.

 

Para aprender um pouco mais sobre como usar o método text() aqui estão alguns links indicados:

Para Saber Mais
Documentação do text()
Exemplos na documentação do text()
Como exibir o valor da barra em cada barra com pyplot.barh ()?

Quaisquer dúvidas em relação a utilização dos dois métodos ou das aulas é só chamar!

Abraços e bons estudos!

Incrível Afonso!

Sua resposta foi perfeita.

Obrigadão!!!