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

Matplotlib 막대 차트 위에 백분율 표시하는 방법 완벽 가이드

Matplotlib에서 막대 차트(bar chart)를 그릴 때 각 막대 위에 해당 값의 백분율을 함께 표시하면 데이터를 한눈에 파악하기 훨씬 쉬워집니다. 이 글에서는 text() 메서드를 활용해 막대 위에 백분율 레이블을 추가하는 방법을 단계별로 알아보겠습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯(subplots) 주변과 사이의 여백(padding)을 조정합니다.
  • x축과 y축에 사용할 데이터 포인트를 생성하고, 막대 너비를 지정할 변수 width를 초기화합니다.
  • subplots() 메서드를 사용하여 figure와 subplot 집합을 생성합니다.
  • x, y 데이터 포인트로 막대를 추가합니다.
  • 막대 패치(bar patches)를 순회하면서 text() 메서드로 각 막대 위에 텍스트(백분율)를 배치합니다.
  • show() 메서드를 호출하여 그래프를 화면에 출력합니다.

예제 코드

from matplotlib import pyplot as plt
import numpy as np

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

x = [1, 2, 3, 4, 5]
y = [3, 4, 2, 1, 3]

width = 0.35
fig, ax = plt.subplots()

pps = ax.bar(x, y, width, align='center')

for p in pps:
    height = p.get_height()
    ax.text(x=p.get_x() + p.get_width() / 2, y=height+.10,
        s="{}%".format(height),
        ha='center')

plt.show()

코드 설명

핵심 로직은 for p in pps: 반복문에 있습니다. ax.bar()가 반환하는 BarContainer에는 각 막대에 대한 Rectangle 패치 객체가 담겨 있습니다. 각 패치에서 get_height()로 막대의 높이(값)를 얻고, get_x()get_width()를 이용해 막대의 중앙 x좌표를 계산합니다. 그런 다음 y 좌표를 살짝 올려(height + .10) 막대 바로 위에 텍스트가 겹치지 않도록 배치하고, ha='center'(수평 정렬: 가운데) 옵션으로 텍스트가 막대 중심에 오도록 합니다.

실행 결과

위 코드를 실행하면 각 막대의 꼭대기 위에 "3%", "4%", "2%", "1%", "3%"와 같이 해당 값이 백분율 형태로 표시된 막대 차트가 나타납니다.

참고 팁

실수(float) 값의 소수점 자릿수가 많다면 s="{:.1f}%".format(height)처럼 포맷을 지정하면 더 깔끔하게 표시할 수 있습니다. 또한 막대 개수가 많거나 값이 작은 경우 y축 상단 여유 공간을 늘리기 위해 ax.set_ylim(0, max(y)*1.15)를 추가하는 것도 좋은 방법입니다.