Introdução
Neste laboratório, aprenderemos como criar um gráfico de barras horizontais usando a biblioteca Matplotlib do Python. Usaremos o exemplo de professores de educação física que desejam mostrar aos pais o desempenho de seus filhos em alguns testes de aptidão física, em relação a outras crianças. Inventaremos alguns dados para o pequeno João da Silva para extrair o código de plotagem para fins de demonstração.
Dicas da VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Importar Bibliotecas
Começamos importando as bibliotecas necessárias. Usaremos numpy para criar nossos dados e matplotlib.pyplot para plotar nosso gráfico.
import matplotlib.pyplot as plt
import numpy as np
Definir os Dados
Definimos nossos dados usando tuplas nomeadas. Definimos uma tupla Student com o nome, a série e o gênero do aluno. Também definimos uma tupla Score com o valor da pontuação, a unidade e o percentil.
from collections import namedtuple
Student = namedtuple('Student', ['name', 'grade', 'gender'])
Score = namedtuple('Score', ['value', 'unit', 'percentile'])
Definir Funções Auxiliares
Definimos duas funções auxiliares. A primeira função, to_ordinal, converte um inteiro em uma string ordinal (por exemplo, 2 -> '2nd'). A segunda função, format_score, cria rótulos de pontuação para o eixo y direito como o nome do teste seguido pela unidade de medida (se houver), divididos em duas linhas.
def to_ordinal(num):
suffixes = {str(i): v
for i, v in enumerate(['th', 'st', 'nd', 'rd', 'th',
'th', 'th', 'th', 'th', 'th'])}
v = str(num)
if v in {'11', '12', '13'}:
return v + 'th'
return v + suffixes[v[-1]]
def format_score(score):
return f'{score.value}\n{score.unit}' if score.unit else str(score.value)
Definir a Função de Plotagem
Definimos uma função chamada plot_student_results que recebe uma tupla Student, um dicionário de pontuações por teste e o tamanho da coorte. Esta função cria um gráfico de barras horizontal dos rankings de percentil para cada teste, em relação à série e ao gênero do aluno.
def plot_student_results(student, scores_by_test, cohort_size):
fig, ax1 = plt.subplots(figsize=(9, 7), layout='constrained')
fig.canvas.manager.set_window_title('Fitness Chart')
ax1.set_title(student.name)
ax1.set_xlabel(
'Percentile Ranking Across {grade} Grade {gender}s\n'
'Cohort Size: {cohort_size}'.format(
grade=to_ordinal(student.grade),
gender=student.gender.title(),
cohort_size=cohort_size))
test_names = list(scores_by_test.keys())
percentiles = [score.percentile for score in scores_by_test.values()]
rects = ax1.barh(test_names, percentiles, align='center', height=0.5)
large_percentiles = [to_ordinal(p) if p > 40 else '' for p in percentiles]
small_percentiles = [to_ordinal(p) if p <= 40 else '' for p in percentiles]
ax1.bar_label(rects, small_percentiles,
padding=5, color='black', fontweight='bold')
ax1.bar_label(rects, large_percentiles,
padding=-32, color='white', fontweight='bold')
ax1.set_xlim([0, 100])
ax1.set_xticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
ax1.xaxis.grid(True, linestyle='--', which='major',
color='grey', alpha=.25)
ax1.axvline(50, color='grey', alpha=0.25)
ax2 = ax1.twinx()
ax2.set_ylim(ax1.get_ylim())
ax2.set_yticks(
np.arange(len(scores_by_test)),
labels=[format_score(score) for score in scores_by_test.values()])
ax2.set_ylabel('Test Scores')
Definir os Dados para o Gráfico
Definimos os dados para o gráfico usando as tuplas nomeadas que definimos anteriormente. Criamos uma tupla Student para Johnny Doe e um dicionário de tuplas Score para cada teste.
student = Student(name='Johnny Doe', grade=2, gender='Boy')
scores_by_test = {
'Pacer Test': Score(7, 'laps', percentile=37),
'Flexed Arm\n Hang': Score(48, 'sec', percentile=95),
'Mile Run': Score('12:52', 'min:sec', percentile=73),
'Agility': Score(17, 'sec', percentile=60),
'Push Ups': Score(14, '', percentile=16),
}
Plotar os Dados
Chamamos a função plot_student_results com os dados do aluno, as pontuações por teste e o tamanho da coorte como argumentos e, em seguida, chamamos plt.show() para exibir o gráfico.
plot_student_results(student, scores_by_test, cohort_size=62)
plt.show()
Resumo
Neste laboratório, aprendemos como criar um gráfico de barras horizontal usando a biblioteca Matplotlib do Python. Usamos um exemplo de professores de educação física que desejam mostrar aos pais como seus filhos se saíram em alguns testes de aptidão física, em relação a outras crianças. Definimos nossos dados usando tuplas nomeadas e definimos funções auxiliares para converter inteiros em strings ordinais e para criar rótulos de pontuação para o eixo y direito. Definimos uma função de plotagem que cria um gráfico de barras horizontal das classificações percentuais para cada teste, em relação à série e ao grupo de gênero do aluno. Em seguida, chamamos a função de plotagem com nossos dados e exibimos o gráfico.