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
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
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:
Alunos | 1ª Unidade | 2ª Unidade | 3ª Unidade | 4ª Unidade | |
---|---|---|---|---|---|
0 | João | 8.0 | 7.0 | 7.0 | 5.0 |
1 | Maria | 10.0 | 9.0 | 7.0 | 9.0 |
2 | José | 5.0 | 8.0 | 7.5 | 6.5 |
Pronto! Agora vamos a parte que interessa que é plotar o nosso gráfico e rotular os seus respectivos valores.
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:
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
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:
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!!!