Criando um Gráfico de Barras Horizontal de Percentis

Beginner

This tutorial is from open-source community. Access the source code

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.