Matplotlib에서 PyPlot에 가장 간단한 방법으로 범례 추가


263

TL; DR은 -> 어떻게 하나의 선 그래프 범례 만들 수 MatplotlibPyPlot여분의 변수를 만들지 않고?

아래의 그래프 스크립트를 고려하십시오.

if __name__ == '__main__':
    PyPlot.plot(total_lengths, sort_times_bubble, 'b-',
                total_lengths, sort_times_ins, 'r-',
                total_lengths, sort_times_merge_r, 'g+',
                total_lengths, sort_times_merge_i, 'p-', )
    PyPlot.title("Combined Statistics")
    PyPlot.xlabel("Length of list (number)")
    PyPlot.ylabel("Time taken (seconds)")
    PyPlot.show()

당신이 볼 수 있듯이, 이것은 매우 기본적인 사용이다 matplotlib'들 PyPlot. 이것은 아래와 같은 그래프를 생성하는 것이 이상적입니다.

그래프

특별한 것은 없습니다. 그러나 어떤 데이터가 어디에 그려지고 있는지 확실하지 않습니다 (일부 정렬 알고리즘의 데이터, 소요 시간에 대한 길이를 나타내려고 노력 중이며 사람들이 어느 선인지 알 수 있도록하고 싶습니다). 그러나 아래 공식 예에서 다음 공식을 살펴보면 범례가 필요합니다 .

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. 이 추가 변수를 만들지 않고 현재 스크립트의 단순성을 유지 하지 않고 그래프에 범례를 추가하려면 어떻게 해야합니까?


추가 변수를 만드는 것에 대한 귀하의 우려로 혼란 스럽습니다. 어쨌든 장면 뒤에 그 물체를 만들어야합니다.
tacaswell

1
@tcaswell 글쎄, 내가 그들을 시도하려고합니다. 전체 스크립트에 복잡성을 추가하기 때문에 추가 변수를 만들고 싶지 않습니다. 나는 이것을 많은 학생들 에게 가르치 려고 노력하고 있으며 , matplotlib이전에 사용하지 않았기 때문에 가능한 한 간단하게 유지하고 싶었습니다. 또한 Rob의 답변을 살펴보면 웹 사이트에 표시된 예보다 훨씬 간단합니다. 도움이 되길 바랍니다.
Games Brainiac

1
상태 머신 인터페이스를 사용 하면 장기적으로 이해 하기더 어렵 습니다. 왜냐하면 많은 부분이 '마법에 의해'수행되고 있기 때문입니다. 또한 컨벤션은 다음 import matplotlib.pyplot as plt대신에 사용 됩니다PyPlot
tacaswell

답변:


441

label=plot()통화에 를 추가 한 다음에 전화하십시오 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="sine")
plt.plot(x, y2, "-r", label="cosine")
plt.legend(loc="upper left")
plt.ylim(-1.5, 2.0)
plt.show()

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


2
시리즈를 그릴 당시의 레이블을 모르는 경우이를 수행 할 수있는 방법이 있습니까? 즉, 이미 플롯 된 시리즈에 레이블을 추가하는 방법은 무엇입니까? 아니면 범례를 표시하기 전에 자리 표시 자 레이블을 수정하는 방법이 있습니까?
davidA

13
plt.legend(loc='upper left')또한 어디 plt에서 작동합니다 import matplotlib.pyplot as plt.
Matt Kleinsmith

이 점에 주목 해 주셔서 감사합니다. 코드를 업데이트했습니다.
Robᵩ

스택 오버플로가 대단하고 좋은 답변이 바뀔 수 있기 때문에 찬성
eric

1
@davidA 네, 간단히 문자열리스트를 전달할 수 있습니다 plt.legend:plt.legend(['First Label', 'Second Label'])
Apollys는 Monica를 지원합니다.

36

을 사용하여 Axes 인스턴스 ( ax)에 액세스 할 수 있습니다 plt.gca(). 이 경우에는

plt.gca().legend()

이 작업 예제와 같이 label=plt.plot()호출 에서 키워드를 사용 하거나 레이블을 튜플 또는 목록으로 지정 legend하여이 작업을 수행 할 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-0.75,1,100)
y0 = np.exp(2 + 3*x - 7*x**3)
y1 = 7-4*np.sin(4*x)
plt.plot(x,y0,x,y1)
plt.gca().legend(('y0','y1'))
plt.show()

pltGcaLegend

당신이 한 번 더 축 인스턴스에 액세스해야하는 경우에는, 나는 변수에 저장하는 것이 좋습니다 않습니다 ax

ax = plt.gca()

그리고 ax대신에 호출 합니다 plt.gca().


읽을 필요없이 사진과 함께 복사하여 붙여 넣기 답변! 이 답변은 더 많은 가치가 있습니다
Gulzar

14

다음은 도움이되는 예입니다.

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(111)
ax.set_title('ADR vs Rating (CS:GO)')
ax.scatter(x=data[:,0],y=data[:,1],label='Data')
plt.plot(data[:,0], m*data[:,0] + b,color='red',label='Our Fitting 
Line')
ax.set_xlabel('ADR')
ax.set_ylabel('Rating')
ax.legend(loc='best')
plt.show()

여기에 이미지 설명을 입력하십시오


2
궁금합니다. 왜 피팅 라인이 데이터에서 멀리 떨어져 있습니까?
Apollys는 Monica

13

범례가있는 사인 및 코사인 곡선에 대한 간단한 플롯입니다.

익숙한 matplotlib.pyplot

import math
import matplotlib.pyplot as plt
x=[]
for i in range(-314,314):
    x.append(i/100)
ysin=[math.sin(i) for i in x]
ycos=[math.cos(i) for i in x]
plt.plot(x,ysin,label='sin(x)')  #specify label for the corresponding curve
plt.plot(x,ycos,label='cos(x)')
plt.xticks([-3.14,-1.57,0,1.57,3.14],['-$\pi$','-$\pi$/2',0,'$\pi$/2','$\pi$'])
plt.legend()
plt.show()

사인 및 코사인 플롯 (이미지를 보려면 클릭)


6

그래프를 그리는 시리즈에 해당하는 플롯 호출의 각 인수에 레이블을 추가하십시오. label = "series 1"

그런 다음 간단히 Pyplot.legend()스크립트 하단에 추가 하면 범례에 이러한 레이블이 표시됩니다.


이것은 올바른 생각이지만 레이블을 추가하지 않아도 범례가 비어있게됩니다.
tacaswell

4

사용자 정의 범례 문서를 추가 할 수 있습니다

first = [1, 2, 4, 5, 4]
second = [3, 4, 2, 2, 3]
plt.plot(first,'g--', second, 'r--')
plt.legend(['First List','Second List'], loc='upper left')
plt.show()

여기에 이미지 설명을 입력하십시오


0
    # Dependencies
    import numpy as np
    import matplotlib.pyplot as plt

    #Set Axes
    # Set x axis to numerical value for month
    x_axis_data = np.arange(1,13,1)
    x_axis_data

    # Average weather temp
    points = [39, 42, 51, 62, 72, 82, 86, 84, 77, 65, 55, 44]

    # Plot the line
    plt.plot(x_axis_data, points)
    plt.show()

    # Convert to Celsius C = (F-32) * 0.56
    points_C = [round((x-32) * 0.56,2) for x in points]
    points_C

    # Plot using Celsius
    plt.plot(x_axis_data, points_C)
    plt.show()

    # Plot both on the same chart
    plt.plot(x_axis_data, points)
    plt.plot(x_axis_data, points_C)

    #Line colors
    plt.plot(x_axis_data, points, "-b", label="F")
    plt.plot(x_axis_data, points_C, "-r", label="C")

    #locate legend
    plt.legend(loc="upper left")
    plt.show()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.