Matplotlib에서 동일한 레이블을 가진 여러 곡선의 마커를 범례(legend)에서 하나로 묶어 표시하고 싶다면, HandlerTuple 핸들러를 활용하면 됩니다. 아래 단계를 차례대로 따라 해 보세요.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변과 사이의 여백(padding)을 조정합니다.
- Numpy를 사용하여 x 데이터 포인트를 생성합니다.
plot()메서드로 네 개의 곡선(c1, c2, c3, c4)을 그립니다.legend()호출 시 곡선들을 튜플로 묶어 전달하고,handler_map에HandlerTuple을 지정하여 같은 레이블의 마커가 범례 안에서 함께 표시되도록 합니다.show()메서드로 그림을 화면에 출력합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt, legend_handler
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
x = np.linspace(-10, 10, 100)
c1, = plt.plot(x, np.sin(x), ls='dashed', label='y=sin(x)')
c2, = plt.plot(x, np.sin(x+0.25), ls='dashdot', label='y=sin(x)')
c3, = plt.plot(x, np.cos(x), ls='solid', label='y=cos(x)')
c4, = plt.plot(x, np.cos(x+0.25), ls=':', label='y=cos(x)')
plt.legend([(c1, c2), (c3, c4)], ['y=sin(x)', 'y=cos(x)'], loc='upper right', handler_map={tuple: legend_handler.HandlerTuple(ndivide=None)})
plt.show()
핵심 포인트
legend_handler.HandlerTuple(ndivide=None)에서 ndivide=None으로 설정하면 튜플에 담긴 모든 핸들이 범례의 한 자리에 겹쳐서 그려집니다. 반대로 ndivide에 숫자를 지정하면 해당 개수만큼 나누어 표시됩니다.
또한 각 곡선의 선 스타일(ls)을 dashed, dashdot, solid, dotted 등으로 서로 다르게 지정하면, 레이블이 같더라도 실제 그래프 위에서는 선 모양으로 구분할 수 있습니다. 이처럼 범례는 레이블별로 깔끔하게 정리되고, 그래프는 스타일로 구분되므로 가독성이 크게 향상됩니다.
실행 결과
