Erstellen eines horizontalen Balkendiagramms für Percentile

Beginner

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

Einführung

In diesem Lab werden wir lernen, wie man mit Python's Matplotlib-Bibliothek ein horizontales Balkendiagramm erstellt. Wir verwenden das Beispiel von Gymnastiklehrern, die Eltern zeigen möchten, wie ihr Kind in einer Reihe von Fitness-Tests im Vergleich zu anderen Kindern abgeschnitten hat. Wir erfinden einige Daten für kleinen Johnny Doe, um den Plotting-Code zu extrahieren und zu demonstrieren.

Tipps für die virtuelle Maschine (VM)

Nachdem die VM gestartet wurde, klicken Sie in der oberen linken Ecke auf die Registerkarte Notebook, um auf Jupyter Notebook für die Übung zuzugreifen.

Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Operationen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem umgehend für Sie lösen.

Importieren von Bibliotheken

Wir beginnen mit dem Importieren der erforderlichen Bibliotheken. Wir verwenden numpy, um unsere Daten zu erstellen, und matplotlib.pyplot, um unser Diagramm zu zeichnen.

import matplotlib.pyplot as plt
import numpy as np

Definieren der Daten

Wir definieren unsere Daten mithilfe von benannten Tupeln (named tuples). Wir definieren ein Student-Tupel mit dem Namen, der Klasse und dem Geschlecht des Schülers. Wir definieren auch ein Score-Tupel mit dem Punktwert, der Einheit und dem Percentil.

from collections import namedtuple

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

Definition von Hilfsfunktionen

Wir definieren zwei Hilfsfunktionen. Die erste Funktion, to_ordinal, wandelt eine Ganzzahl in einen ordinalen String um (z.B. 2 -> '2nd'). Die zweite Funktion, format_score, erstellt Score-Labels für die rechte y-Achse, indem der Testname gefolgt von der Maßeinheit (falls vorhanden) über zwei Zeilen aufgeteilt wird.

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)

Definition der Plotting-Funktion

Wir definieren eine Funktion namens plot_student_results, die ein Student-Tupel, ein Wörterbuch mit Punkten pro Test und die Größe der Kohorte entgegennimmt. Diese Funktion erstellt ein horizontales Balkendiagramm der Percentil-Ranglisten für jeden Test im Vergleich zur Kohorte der gleichen Klasse und des gleichen Geschlechts des Schülers.

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')

Definieren der Daten für das Diagramm

Wir definieren die Daten für das Diagramm mithilfe der zuvor definierten benannten Tupel (named tuples). Wir erstellen ein Student-Tupel für Johnny Doe und ein Wörterbuch mit Score-Tupeln für jeden Test.

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

Plotten der Daten

Wir rufen die Funktion plot_student_results mit den Schülerdaten, den Punkten pro Test und der Größe der Kohorte als Argumente auf und dann rufen wir plt.show() auf, um das Diagramm anzuzeigen.

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

Zusammenfassung

In diesem Lab (Praktikum) haben wir gelernt, wie man mit Python's Matplotlib-Bibliothek ein horizontales Balkendiagramm erstellt. Wir haben ein Beispiel verwendet, bei dem Gymnastiklehrer Eltern zeigen möchten, wie ihr Kind in einer Reihe von Fitness-Tests im Vergleich zu anderen Kindern abgeschnitten hat. Wir haben unsere Daten mithilfe von benannten Tupeln (named tuples) definiert und Hilfsfunktionen erstellt, um Ganzzahlen in ordinale Strings umzuwandeln und Score-Labels für die rechte y-Achse zu erstellen. Wir haben eine Plotting-Funktion definiert, die ein horizontales Balkendiagramm der Percentil-Ranglisten für jeden Test im Vergleich zur Kohorte der gleichen Klasse und des gleichen Geschlechts des Schülers erstellt. Anschließend haben wir die Plotting-Funktion mit unseren Daten aufgerufen und das Diagramm angezeigt.