백분위 수 수평 막대 차트 생성

Beginner

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

소개

이 랩에서는 Python 의 Matplotlib 라이브러리를 사용하여 수평 막대 차트를 만드는 방법을 배웁니다. 우리는 체육 선생님들이 자녀가 다른 아이들에 비해 몇 가지 체력 테스트에서 얼마나 잘했는지 학부모에게 보여주고 싶어하는 예시를 사용할 것입니다. 데모 목적으로 플로팅 코드를 추출하기 위해 어린 Johnny Doe 에 대한 데이터를 임의로 만들 것입니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접근하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 임포트

필요한 라이브러리를 임포트하는 것으로 시작합니다. 데이터를 생성하기 위해 numpy를 사용하고, 그래프를 플로팅하기 위해 matplotlib.pyplot을 사용할 것입니다.

import matplotlib.pyplot as plt
import numpy as np

데이터 정의

이름이 지정된 튜플을 사용하여 데이터를 정의합니다. 학생의 이름, 학년 및 성별을 포함하는 Student 튜플을 정의합니다. 또한 점수 값, 단위 및 백분위수를 포함하는 Score 튜플을 정의합니다.

from collections import namedtuple

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

헬퍼 함수 정의

두 개의 헬퍼 함수를 정의합니다. 첫 번째 함수인 to_ordinal은 정수를 서수 문자열로 변환합니다 (예: 2 -> '2nd'). 두 번째 함수인 format_score는 테스트 이름과 측정 단위 (있는 경우) 를 두 줄로 나누어 오른쪽 y 축에 대한 점수 레이블을 생성합니다.

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)

플로팅 함수 정의

plot_student_results라는 함수를 정의합니다. 이 함수는 Student 튜플, 테스트별 점수 딕셔너리, 그리고 코호트 크기를 입력으로 받습니다. 이 함수는 학생의 학년 및 성별 코호트를 기준으로 각 테스트의 백분위 순위를 나타내는 수평 막대 차트를 생성합니다.

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

플롯을 위한 데이터 정의

앞서 정의한 명명된 튜플을 사용하여 플롯에 대한 데이터를 정의합니다. Johnny Doe 에 대한 Student 튜플과 각 테스트에 대한 Score 튜플의 딕셔너리를 생성합니다.

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

데이터 플롯

plot_student_results 함수를 학생 데이터, 테스트별 점수, 그리고 코호트 크기를 인수로 호출한 다음, plt.show()를 호출하여 플롯을 표시합니다.

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

요약

이 랩에서는 Python 의 Matplotlib 라이브러리를 사용하여 수평 막대 차트를 만드는 방법을 배웠습니다. 우리는 체육 교사가 다른 아이들과 비교하여 자녀가 몇 가지 피트니스 테스트에서 어떻게 수행했는지 부모에게 보여주고 싶어하는 예시를 사용했습니다. 명명된 튜플을 사용하여 데이터를 정의하고, 정수를 서수 문자열로 변환하고 오른쪽 y 축에 대한 점수 레이블을 생성하는 도우미 함수를 정의했습니다. 학생의 학년 및 성별 코호트에 상대적인 각 테스트의 백분위 순위를 수평 막대 차트로 생성하는 플로팅 함수를 정의했습니다. 그런 다음 데이터를 사용하여 플로팅 함수를 호출하고 플롯을 표시했습니다.