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

Matplotlib 하나의 축에 여러 범례(legend) 동시에 표시하기

Matplotlib는 기본적으로 하나의 축(axis)에 범례(legend)를 하나만 표시할 수 있습니다. 따라서 plt.legend()를 연속으로 호출하면 이전 범례가 덮어써져 사라지게 됩니다. 이 문제를 해결하려면 첫 번째 범례를 add_artist() 메서드로 현재 축에 직접 추가한 뒤, 두 번째 범례를 생성하는 방식을 사용해야 합니다.

구현 단계

  • 그림(figure) 크기를 설정하고, 서브플롯 주변 및 사이의 여백을 자동으로 조정합니다.
  • 두 개의 리스트 데이터를 사용해 서로 다른 레이블(label), 선 굵기(linewidth), 선 스타일(linestyle)을 가진 선 그래프를 그립니다.
  • 첫 번째 범례를 생성하여 오른쪽 상단(upper right)에 배치합니다.
  • add_artist() 메서드로 첫 번째 범례를 현재 축에 아티스트(artist)로 추가하여 유지합니다.
  • 두 번째 범례를 생성하여 오른쪽 하단(lower right)에 배치합니다.
  • show() 메서드를 호출해 최종 그래프를 화면에 표시합니다.

예제 코드

from matplotlib import pyplot as plt

# 그림 크기 및 자동 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 서로 다른 스타일의 두 개의 선 그리기
line1, = plt.plot([1, 2, 3], label="Line 1", linestyle='--')
line2, = plt.plot([3, 2, 1], label="Line 2", linewidth=4)

# 첫 번째 범례 생성 후 현재 축에 추가
first_legend = plt.legend(handles=[line1], loc='upper right')
plt.gca().add_artist(first_legend)

# 두 번째 범례 생성
plt.legend(handles=[line2], loc='lower right')

plt.show()

코드 설명

plt.plot()은 반환값으로 선 객체(line object)의 튜플을 돌려주므로, 쉼표(,)를 사용해 언패킹합니다. 첫 번째 plt.legend() 호출 시 handles 인자로 Line 1 객체만 전달하여 해당 선에 대한 범례만 만들고, 이를 plt.gca().add_artist()로 축에 고정합니다. 이후 다시 plt.legend()를 호출해 Line 2의 범례를 별도 위치에 추가하면, 두 개의 범례가 서로 겹치지 않고 동시에 표시됩니다.

실행 결과

위 코드를 실행하면 점선으로 그려진 Line 1의 범례는 오른쪽 상단에, 굵은 실선으로 그려진 Line 2의 범례는 오른쪽 하단에 각각 나타납니다.

Matplotlib 하나의 축에 여러 범례(legend) 동시에 표시하기