본문 바로가기
Python/Python FAQ

Python 맷플롯립 범례 추가, Adding a matplotlib legend

by 베타코드 2023. 10. 26.
반응형

질문


Matplotlib의 PyPlot에서 추가 변수를 생성하지 않고 선 그래프에 범례를 생성하는 방법은 무엇인가요?

아래의 그래프 스크립트를 고려해주세요:

if __name__ == '__main__':
    PyPlot.plot(length, bubble, 'b-',
                length, ins, 'r-',
                length, merge_r, 'g+',
                length, merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

보시다시피, 이는 Matplotlib의 PyPlot의 매우 기본적인 사용법입니다. 이렇게 하면 다음과 같은 그래프가 생성됩니다:

Graph

하지만, 어떤 선이 어떤 것인지 알 수 없습니다. 따라서 범례가 필요합니다. 그러나 다음의 예제를 살펴보면(공식 사이트에서 가져옴):

ax = subplot(1,1,1)
p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")

handles, labels = ax.get_legend_handles_labels()

# reverse the order
ax.legend(handles[::-1], labels[::-1])

# or sort them by labels
import operator
hl = sorted(zip(handles, labels), key=operator.itemgetter(1))
handles2, labels2 = zip(*hl)

ax.legend(handles2, labels2)

보시다시피, 추가 변수 ax를 생성해야 합니다. 현재 스크립트의 간단함을 유지하면서 그래프에 범례를 추가하는 방법은 무엇인가요?


답변


각각의 plot() 호출에 label=을 추가하고, 그런 다음 legend(loc='upper left')를 호출하세요.

이 샘플을 고려해보세요 (Python 3.8.0에서 테스트됨):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 1000)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, "-b", label="사인")
plt.plot(x, y2, "-r", label="코사인")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

이미지 설명을 입력하세요 이 튜토리얼에서 약간 수정되었습니다: http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html

반응형

댓글