Matplotlib에서 범례(legend)의 각 행이나 열 앞에 그룹 제목처럼 보이는 텍스트를 추가하고 싶은 경우가 있습니다. 이때 빈 핸들(dummy handle)과 제목 레이블을 함께 전달하면 손쉽게 구현할 수 있습니다.
구현 절차
- 그림 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
- NumPy를 사용하여 y 데이터 포인트를 생성합니다.
- 마커(markers)와 레이블(labels) 리스트를 준비합니다.
- figure와 subplot을 생성합니다.
- plot() 메서드를 사용하여 서로 다른 마커와 레이블로 선을 그립니다.
- get_legend_handles_labels()로 플롯의 핸들(handles)과 레이블을 가져옵니다.
- 마커와 선 스타일이 없는 빈 핸들을 생성하여 제목으로 사용할 항목을 만듭니다.
- legend() 메서드에 핸들과 레이블을 전달해 범례를 배치합니다.
- show() 메서드로 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
y = np.exp(-np.arange(5))
markers = ["s", "o", "*"]
labels = ["one", "two"]
fig, ax = plt.subplots()
for i in range(6):
ax.plot(y * i + i / 2., marker=markers[i // 2], label=labels[i % 2])
h, l = ax.get_legend_handles_labels()
ph = [plt.plot([], marker="", ls="")[0]] * 2
handles = ph + h
labels = ["Title 1:", "Title 2:"] + l
plt.legend(handles, labels, ncol=4)
plt.show()핵심 포인트 설명
이 기법의 핵심은 ph = [plt.plot([], marker="", ls="")[0]] * 2 부분입니다. 빈 리스트를 plot에 전달하면 아무것도 그려지지 않는 '가짜 핸들'이 생성되며, 이를 범례의 첫 번째와 두 번째 위치에 배치하고 해당 자리의 레이블을 "Title 1:", "Title 2:"로 지정하면 범례 안에 제목처럼 보이는 텍스트가 삽입됩니다.
또한 ncol=4 옵션은 범례를 4개의 열로 나누어 배치하므로, 제목과 실제 항목들이 한 행에 나란히 정렬되어 깔끔한 그룹 형태의 범례를 만들 수 있습니다.
출력 결과
