Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib에서 여러 레이블이 있는 막대 차트 그리는 방법

Matplotlib에서 여러 레이블을 표시하는 막대 차트를 그리려면 다음 단계를 따르면 됩니다.

구현 단계

  • 남성 평균(men_means), 남성 표준편차(men_std), 여성 평균(women_means), 여성 표준편차(women_std)에 사용할 데이터셋을 준비합니다.

  • NumPy를 이용해 인덱스(x축 위치) 데이터 포인트를 생성합니다.

  • 막대의 너비(width)를 초기화합니다.

  • subplots() 메서드를 사용해 figure와 서브플롯(axes)을 생성합니다.

  • bar() 메서드로 두 개의 막대 사각형 rects1rects2를 만듭니다.

  • set_ylabel(), set_title(), set_xticks(), set_xticklabels() 메서드를 사용해 축 레이블, 제목, x축 눈금을 설정합니다.

  • legend() 메서드로 차트에 범례를 추가합니다.

  • autolabel() 함수를 정의해 각 막대 위에 값 레이블을 자동으로 표시합니다.

  • show() 메서드를 호출해 최종 그래프를 화면에 출력합니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 남성/여성 평균 점수와 표준편차 데이터
men_means, men_std = (20, 35, 30, 35, 27), (2, 3, 4, 1, 2)
women_means, women_std = (25, 32, 34, 20, 25), (3, 5, 2, 3, 3)

ind = np.arange(len(men_means))  # 그룹별 x축 위치
width = 0.35  # 막대의 너비

fig, ax = plt.subplots()
rects1 = ax.bar(ind - width/2, men_means, width, yerr=men_std, label='Men')
rects2 = ax.bar(ind + width/2, women_means, width, yerr=women_std, label='Women')

ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind)
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
ax.legend()

def autolabel(rects, xpos='center'):
    """각 막대 위에 높이(값)를 레이블로 표시하는 함수"""
    ha = {'center': 'center', 'right': 'left', 'left': 'right'}
    offset = {'center': 0, 'right': 1, 'left': -1}
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
            xy=(rect.get_x() + rect.get_width() / 2, height),
            xytext=(offset[xpos]*3, 3),  # 3포인트 오프셋 적용
            textcoords="offset points",  # 양방향 모두 적용
            ha=ha[xpos], va='bottom')

autolabel(rects1, "left")
autolabel(rects2, "right")
plt.show()

코드 설명

위 코드의 핵심 포인트는 다음과 같습니다.

  • 그룹화된 막대 배치: ind - width/2ind + width/2를 사용해 남성 막대와 여성 막대를 나란히 배치하여 비교하기 쉽게 만듭니다.

  • 오차 막대(yerr): yerr 파라미터에 표준편차 값을 전달하면 각 막대 위에 오차 범위가 함께 표시됩니다.

  • autolabel() 함수: ax.annotate()를 활용해 각 막대의 높이 값을 막대 상단에 표시합니다. xpos 인자로 'left', 'center', 'right' 위치를 지정할 수 있어, 인접한 두 막대의 레이블이 겹치지 않도록 조정할 수 있습니다.

실행 결과

코드를 실행하면 G1부터 G5까지 다섯 개 그룹별로 남성(Men)과 여성(Women)의 점수가 나란히 표시된 막대 차트가 출력되며, 각 막대 위에는 해당 값이 레이블로 표시되고 오차 범위도 함께 나타납니다.