Creación de un gráfico de barras horizontales de percentiles

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos cómo crear un gráfico de barras horizontales utilizando la biblioteca Matplotlib de Python. Utilizaremos el ejemplo de profesores de gimnasia que desean mostrar a los padres cómo les fue a sus hijos en una serie de pruebas de aptitud física, en comparación con otros niños. Inventaremos algunos datos para el pequeño Johnny Doe para extraer el código de trazado con fines demostrativos.

Consejos para la MV

Después de que la máquina virtual (VM) haya terminado de iniciarse, haz clic en la esquina superior izquierda para cambiar a la pestaña Notebook y acceder a Jupyter Notebook para practicar.

A veces, es posible que debas esperar unos segundos para que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si encuentras problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona comentarios después de la sesión y resolveremos rápidamente el problema para ti.

Importar bibliotecas

Comenzamos importando las bibliotecas necesarias. Utilizaremos numpy para crear nuestros datos y matplotlib.pyplot para trazar nuestro gráfico.

import matplotlib.pyplot as plt
import numpy as np

Definir los datos

Definimos nuestros datos utilizando tuplas nombradas. Definimos una tupla Student con el nombre, la calificación y el género del estudiante. También definimos una tupla Score con el valor de la puntuación, la unidad y el percentil.

from collections import namedtuple

Student = namedtuple('Student', ['name', 'grade', 'gender'])
Score = namedtuple('Score', ['value', 'unit', 'percentile'])

Definir funciones auxiliares

Definimos dos funciones auxiliares. La primera función, to_ordinal, convierte un número entero en una cadena ordinal (por ejemplo, 2 -> '2nd'). La segunda función, format_score, crea etiquetas de puntuación para el eje y derecho como el nombre de la prueba seguido de la unidad de medida (si la hay), dividido en dos líneas.

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 la función de trazado

Definimos una función llamada plot_student_results que recibe una tupla Student, un diccionario de puntuaciones por prueba y el tamaño de la cohorte. Esta función crea un gráfico de barras horizontales de los rankings percentiles para cada prueba, en relación con la cohorte de estudiantes del mismo grado y género.

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 los datos para el gráfico

Definimos los datos para el gráfico utilizando las tuplas nombradas que definimos anteriormente. Creamos una tupla Student para Johnny Doe y un diccionario de tuplas Score para cada prueba.

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),
}

Trazar los datos

Llamamos a la función plot_student_results con los datos del estudiante, las puntuaciones por prueba y el tamaño de la cohorte como argumentos, y luego llamamos a plt.show() para mostrar el gráfico.

plot_student_results(student, scores_by_test, cohort_size=62)
plt.show()

Resumen

En este laboratorio, aprendimos cómo crear un gráfico de barras horizontales utilizando la biblioteca Matplotlib de Python. Utilizamos un ejemplo de profesores de educación física que desean mostrar a los padres cómo les fue a sus hijos en una serie de pruebas de aptitud física en comparación con otros niños. Definimos nuestros datos utilizando tuplas nombradas y definimos funciones auxiliares para convertir números enteros en cadenas ordinales y para crear etiquetas de puntuación para el eje y derecho. Definimos una función de trazado que crea un gráfico de barras horizontales de los rankings percentiles para cada prueba, en relación con la cohorte de estudiantes del mismo grado y género. Luego llamamos a la función de trazado con nuestros datos y mostramos el gráfico.