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.