줄거리에서 범례를 지우는 방법


987

단일 그림으로 만들 일련의 20 개의 플롯 (하위 그림이 아님)이 있습니다. 전설이 상자 바깥에 있기를 원합니다. 동시에 그림의 크기가 줄어들어 축을 변경하고 싶지 않습니다. 다음 쿼리에 대해 친절하게 도와주세요.

  1. 범례 상자를 플롯 영역 외부에 유지하고 싶습니다. (범례가 플롯 영역의 오른쪽에 외부에 있기를 원합니다).
  2. 어쨌든 범례 상자 안의 텍스트의 글꼴 크기를 줄여서 범례 상자의 크기가 작습니까?

14
최신 matplotlib 버전의 경우이 답변 은 matplotlib를 설정 하여 플롯을 방해하지 않고 범례를 배치 할 위치를 자동으로 결정 하는 방법을 보여줍니다 .
dotancohen

2
같은 질문이
있었으며

1
이 답변은 더 깊이가 https://stackoverflow.com/a/43439132/52074있습니다. 그리고 두 줄의 코드로 그렇게합니다! +1200 upvoted 답변도 좋지만 덜 일반적인 것으로 나타났습니다.
Trevor Boyd Smith

2
@dotancohen "도표를 방해하지 않고 범례를 배치 할 위치를 자동으로 결정" 특정 도표에 곡선이 많을 경우 불행히도 불가능합니다. 이 경우 사용자는 수동으로 범례를 배치하고 실제로 플롯 영역 외부에 배치하려고 할 수 있습니다. 나는 지금 그러한 음모에 어려움을 겪고 있습니다.
Ali

btw, loc 선택 목록 : best; 오른쪽 상단; 왼쪽 위; 왼쪽 아래; 오른쪽 아래; 권리; 중앙 왼쪽; 중앙 오른쪽; 하부 중심; 상단 중앙; 센터;
Z-Y00

답변:


57

글꼴 속성을 만들어 범례 텍스트를 더 작게 만들 수 있습니다.

from matplotlib.font_manager import FontProperties

fontP = FontProperties()
fontP.set_size('small')
legend([plot1], "title", prop=fontP) 
# or add prop=fontP to whatever legend() call you already have

50
무엇 plot1이 답변에?
Paul H

41
무엇 legend이 답변에?
Richard

28
이것은 질문의 2 차 부분에 답하지만 1 차 (제목)는 답하지 않습니다.
Mateen Ulhaq

8
또한,이 작업을 수행 할 수있는 적절한 방법입니다plt.legend(fontsize='small')
Mateen Ulhaq

41
이 답변은 끔찍하며 컨텍스트가 거의 없습니다!
Tekill

1794

원하는 것을하는 방법에는 여러 가지가 있습니다. @inalis와 @Navi가 이미 말한 것을 더하기 위해 bbox_to_anchor키워드 인수를 사용 하여 범례를 축 외부에 부분적으로 배치하거나 글꼴 크기를 줄일 수 있습니다.

서체 크기를 줄이는 것을 고려하기 전에 (물건을 읽기가 어려워 질 수 있음) 범례를 다른 곳에 배치 해보십시오.

일반적인 예부터 시작하겠습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()

plt.show()

대체 텍스트

동일한 작업을 수행하지만 bbox_to_anchor키워드 인수를 사용 하면 범례를 축 경계 밖으로 약간 이동할 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend(bbox_to_anchor=(1.1, 1.05))

plt.show()

대체 텍스트

마찬가지로 범례를 더 수평으로 만들거나 그림의 맨 위에 놓을 수도 있습니다 (둥근 모서리와 간단한 그림자를 켜고 있습니다).

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)

ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),
          ncol=3, fancybox=True, shadow=True)
plt.show()

대체 텍스트

또는 현재 플롯의 너비를 축소하고 범례를 그림의 축 바깥쪽에 둘 수 있습니다 (참고 : tight_layout () 을 사용하는 경우 ax.set_position () 제외).

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)

# Shrink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])

# Put a legend to the right of the current axis
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.show()

대체 텍스트

비슷한 방식으로 줄거리를 세로로 축소하고 아래쪽에 가로 범례를 넣을 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)

# Shrink current axis's height by 10% on the bottom
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
                 box.width, box.height * 0.9])

# Put a legend below current axis
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
          fancybox=True, shadow=True, ncol=5)

plt.show()

대체 텍스트

matplotlib 범례 안내서를 살펴보십시오 . 또한 살펴볼 수도 있습니다 plt.figlegend().


10
누구 든지이 문제가 발생하면 tight_layout ()이 문제를 일으킨다는 점에 유의하십시오!
Matthew G.

4
좋은 답변입니다! 문서에 대한 올바른 링크는 matplotlib.org/users/legend_guide.html#legend-location
meduz

4
완전성으로, 일반적으로 (문서에서 요약 한) " bbox_to_anchor는 4 개의 실수 (x, y, 너비, bbox의 높이)의 튜플 또는 정규화 된 축의 2 개의 실수 (x, y)의 튜플 이라고 말할 수 있습니다 "
meduz

5
나는 이것이 내가 가장 많이 방문한 SO 답변이라는 것을 인정해야한다. 합리적인 사람이이 논리를 여기에서 보지 않고이 논리를 기억할 수있는 방법이 없기 때문에 반복해서 다시 올 수 없습니다.
KT.

9
당신이 파일에 그림을 저장하려는 경우 참고, 당신은 아마 객체 즉, 반환 저장할 것을 legend = ax.legend()나중에fig.savefig(bbox_extra_artists=(legend,))
coldfix에게

789

범례 배치 ( bbox_to_anchor)

범례는에 loc인수를 사용하여 축의 경계 상자 안에 배치 됩니다 plt.legend.
예는 loc="upper right"경계 상자의 오른쪽 상단 모서리에 범례를 배치하는 기본 범위에 의해에서 (0,0)(1,1)축 좌표 (또는 상자 표기 경계에서 (x0,y0, width, height)=(0,0,1,1)).

좌표축 경계 상자 외부에 범례를 배치하려면 범례 (x0,y0)왼쪽 아래 모서리의 좌표축 튜플 을 지정할 수 있습니다 .

plt.legend(loc=(1.04,0))

그러나보다 다양한 접근 방식은 bbox_to_anchor인수를 사용하여 범례를 배치 할 경계 상자를 수동으로 지정하는 것 입니다. (x0,y0)bbox 의 일부만 공급하도록 스스로를 제한 할 수 있습니다 . 이렇게하면 범례 상자가 만들어지고 범례가 loc인수에 지정된 방향으로 확장됩니다 . 예 :

plt.legend (bbox_to_anchor = (1.04,1), loc = "왼쪽 상단")

범례의 왼쪽 위 모서리가 (1.04,1)축 좌표의 위치 에 있도록 범례를 축 외부에 배치 합니다.

추가적으로 다른 인자 사이의 상호 작용이 같은 곳에 추가의 예는 이하와 같다 modencols같다.

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

l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
                mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right", 
                bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")

에서 bbox_to_anchor와 같이 4- 튜플 인수를 해석하는 방법에 대한 자세한 내용 l4이 질문 에서 찾을 수 있습니다 . 는 mode="expand"4 튜플 주어진 바운딩 박스 내에 수평으로 범례를 확장한다. 수직 확장 범례에 대해서는 이 질문을 참조하십시오 .

축 좌표 대신 그림 좌표에서 경계 상자를 지정하는 것이 유용한 경우도 있습니다. 이것은 l5위 의 예 에서 볼 수 있는데, bbox_transform인수는 그림의 왼쪽 아래 구석에 범례를 넣는 데 사용됩니다.

후 처리

범례를 축 외부에 배치하면 원치 않는 부분이 그림 캔버스 외부에있는 경우가 종종 있습니다.

이 문제에 대한 해결책은 다음과 같습니다.

  • 서브 플롯 매개 변수 조정 서브 플롯 매개 변수
    를 조정하여을 사용하여 축이 그림 내부의 공간을 덜 차지하므로 범례에 더 많은 공간을 남겨 둘 수 plt.subplots_adjust있습니다. 예 :

    plt.subplots_adjust(right=0.7)

    그림의 오른쪽에 30 %의 공간을 남겨두고 전설을 배치 할 수 있습니다.

  • 꽉 레이아웃
    사용 plt.tight_layout그림의 요소가 그림 가장자리에 꽉 맞도록 서브 플롯 매개 변수를 자동으로 조정할 수 있습니다. 불행히도 범례는이 자동화에서 고려되지 않지만 레이블을 포함하여 전체 하위 플롯 영역에 맞는 사각형 상자를 제공 할 수 있습니다.

    plt.tight_layout(rect=[0,0,0.75,1])
  • 그림을bbox_inches = "tight"
    인수 bbox_inches = "tight"plt.savefig저장 캔버스에있는 모든 아티스트 (범례 포함)가 저장된 영역에 맞도록 그림을 저장하는 데 사용할 수 있습니다. 필요한 경우 도형 크기가 자동으로 조정됩니다.

    plt.savefig("output.png", bbox_inches="tight")
  • 자동으로 부가 적 줄거리를 PARAMS 조정
    캔버스 내부의 전설 적합하도록 자동으로 부가 적 줄거리의 위치를 조정하는 방법 그림 크기를 변경하지 않고는 이 대답에서 찾을 수 있습니다 (축 외부 전설) 정확한 크기와 패딩 그림 만들기

위에서 논의 된 사례들 간의 비교 :

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

대안

그림 범례
축 대신 그림에 범례를 사용할 수 있습니다 matplotlib.figure.Figure.legend. 이것은 특별한 인수가 필요하지 않은 matplotlib 버전> = 2.1에 특히 유용합니다.

fig.legend(loc=7) 

그림의 다른 축에있는 모든 아티스트의 범례를 만들 수 있습니다. 범례는 loc축 내부에 배치되는 방식과 유사하지만 인수 전체를 참조 하여 인수를 사용하여 배치되므로 축 외부에 다소 자동으로 배치됩니다. 남아있는 것은 범례와 축이 겹치지 않도록 서브 플롯을 조정하는 것입니다. 여기에서 "서브 플롯 매개 변수 조정" 이 도움이 될 것입니다. 예를 들면 :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
    axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))

fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)   
plt.show()

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

전용 서브 플롯 축 내부의 범례
사용하는 대안 bbox_to_anchor은 전용 서브 플롯 축 ( lax)에 범례를 배치하는 것 입니다. 범례 서브 플롯은 플롯보다 작아야하므로 gridspec_kw={"width_ratios":[4,1]}축을 만들 때 사용할 수 있습니다 . 우리는 축을 숨길 수는 lax.axis("off")있지만 여전히 범례를 넣을 수 있습니다 . 범례 핸들과 레이블은을 통해 실제 플롯에서 얻어야 h,l = ax.get_legend_handles_labels()하고 lax서브 플롯 의 범례에 제공 될 수 있습니다 lax.legend(h,l). 완전한 예는 다음과 같습니다.

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2

fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....

h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")

plt.tight_layout()
plt.show()

이것은 위의 플롯과 시각적으로 매우 유사한 플롯을 생성합니다.

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

첫 번째 축을 사용하여 범례를 배치 할 수도 있지만 bbox_transform범례 축을 사용하여

ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")

이 방법에서는 범례 핸들을 외부에서 얻을 필요는 없지만 bbox_to_anchor인수 를 지정해야합니다 .

추가 자료 및 참고 사항 :

  • 범례 와 함께하고 싶은 다른 것들의 일부 예제와 함께 matplotlib 범례 가이드 를 고려하십시오 .
  • 파이 차트에 범례를 배치하는 예제 코드는이 질문에 대한 답변에서 직접 찾을 수 있습니다. Python-범례가 파이 차트와 겹칩니다
  • loc인수는하지만, 그들은 매우 직관적으로 서로 매핑되지 않는 통화는 짧게 숫자 대신 문자열을 취할 수 있습니다. 다음은 참조 용 매핑입니다.

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


범례를 전용 서브 플롯 축 시너지 효과와 함께 시너지 효과를 발휘 fig.tight_layout합니다. plt.subplots축을 만드는 데 사용 하는 경우 gridspec_kw={'height_ratios': [100, 1]}범례의 축이 작도록 (또는 width_ratios) 같은 것을 지정하십시오. 그런 다음 fig.tight_layout()확장하여 맞 춥니 다. 적어도 matplotlib의 경우 3.0.3.
travc 2016 년

161

그냥 전화 legend()애프터 호출 plot()이 같은 전화 :

# matplotlib
plt.plot(...)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))

# Pandas
df.myCol.plot().legend(loc='center left', bbox_to_anchor=(1, 0.5))

결과는 다음과 같습니다.

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


4
같은 매개 변수를 전달하는 작품을 할 때하는 것은 물론 matplotlib.pyplot.legend합니다
kidmose

8
이것은 다른 사람을 위해 전설의 단어를 잘랐습니까?
user1717828

85

플롯 영역 외부에 범례를 배치하려면 locbbox_to_anchor키워드를 사용하십시오 legend(). 예를 들어 다음 코드는 범례를 플롯 영역의 오른쪽에 배치합니다.

legend(loc="upper left", bbox_to_anchor=(1,1))

자세한 내용은 범례 안내서를 참조하십시오


10
좋아-구현을 좋아하지만 그림을 저장하려고 할 때 (매번 수행하고 싶지 않은 창에서 수동으로 크기를 조정하지 않고) 범례가 잘립니다. 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?
astromax

@astromax 확실하지 않지만 전화를 시도해보십시오 plt.tight_layout().
Christian Alis

81

짧은 대답 : bbox_to_anchor+ bbox_extra_artists+를 사용할 수 있습니다 bbox_inches='tight'.


더 긴 답변 : bbox_to_anchor다른 사람들이 답변에서 지적했듯이 범례 상자의 위치를 ​​수동으로 지정하는 데 사용할 수 있습니다 .

그러나 일반적인 문제는 범례 상자가 잘리는 것입니다. 예를 들면 다음과 같습니다.

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')

fig.savefig('image_output.png', dpi=300, format='png')

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

당신이 매개 변수를 사용할 수 있습니다 그림 저장할 때의 범례 상자를 방지하기 위해, 잘려지고 bbox_extra_artists하고 bbox_inches물어 savefig저장된 이미지에서 자른 요소를 포함하기를 :

fig.savefig('image_output.png', bbox_extra_artists=(lgd,), bbox_inches='tight')

예 (마지막 줄만 변경하여 2 개의 매개 변수를 추가했습니다 fig.savefig()) :

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# Plot
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(all_x, all_y)

# Add legend, title and axis labels
lgd = ax.legend( [ 'Lag ' + str(lag) for lag in all_x], loc='center right', bbox_to_anchor=(1.3, 0.5))
ax.set_title('Title')
ax.set_xlabel('x label')
ax.set_ylabel('y label')    

fig.savefig('image_output.png', dpi=300, format='png', bbox_extra_artists=(lgd,), bbox_inches='tight')

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

matplotlib이 기본적으로 Matlab 처럼 범례 상자의 외부 위치를 허용하기를 바랍니다 .

figure
x = 0:.2:12;
plot(x,besselj(1,x),x,besselj(2,x),x,besselj(3,x));
hleg = legend('First','Second','Third',...
              'Location','NorthEastOutside')
% Make the text of the legend italic and color it brown
set(hleg,'FontAngle','italic','TextColor',[.3,.2,.1])

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


6
정말 고맙습니다! 은 "bbox_to_anchor", "bbox_extra_artist"와 ""bbox_inches은 = '꽉'매개 변수 나는 그것이 제대로 작동하기 위해 필요한 정확히 무엇을했다 신난다.!
Demitrian

6
감사합니다,하지만 실제로는 bbox_inches='tight'도 bbox_extra_artist없이 나를 위해 완벽하게 작동
avtomaton

1
@avtomaton 감사합니다. matplotlib의 어떤 버전을 사용하고 있습니까?
Franck Dernoncourt

1
@FranckDernoncourt python3, matplotlib 버전 1.5.3
avtomaton

68

여기에 모든 훌륭한 답변의 최신 버전에 추가 matplotlib하고 pylab있습니다 플롯을 방해하지 않고 범례를 넣을 위치를 자동으로 결정 가능하다면.

pylab.legend(loc='best')

가능한 경우 범례를 데이터에서 자동으로 멀리 배치합니다! loc = 'best'사용 비교

그러나 데이터를 겹치지 않고 범례를 넣을 장소가 없다면 다른 답변 중 하나를 시도해보십시오. 를 사용 loc="best"하면 범례를 플롯 외부 에 두지 않습니다 .


2
이것을 지적 해 주셔서 감사합니다! 나는 몇 년 전에 이것을 찾아 보지 못했고 그것을 실제로 내 삶을 더 편하게 만드는 것입니다.
Edgar H

4
이 옵션은 유용하지만 질문에 답하지 않으므로 다운 투표했습니다. 내가 알 수있는 한, 최고의 전설은 절대 음모 바깥에 두지 않습니다.
Tommy

3
@Tommy : OP의 의견 (지금은 사라진 것 같음)에서 OP는 범례가 그래프 데이터를 다루지 않기를 원한다는 것을 분명히 밝혔습니다. mefathy, Mateo Sanchez, Bastiaan 및 radtek의 답변에서 이것을 볼 수 있습니다. OP 는 X를 요구했지만 Y를 원했습니다 .
dotancohen

1
사실은 아닙니다. 그 / 그녀는 구체적으로 범례가 줄거리를 벗어나도록 요청했습니다. 그것은 질문의 이름에 있습니다.;) "전설을 음모로 만드는 법".
durbachit

4
이로 인해 범례가 데이터를 모호하게하지는 않습니다. 매우 조밀 한 음모를 꾸미십시오. 전설을 넣을 곳이 없습니다. 예를 들어, 이것을 시도하십시오 ... numpy import arange, sin, pi import matplotlib.pyplot as plt t = arange (0.0, 100.0, 0.01) fig = plt.figure (1) ax1 = fig.add_subplot (211) ax1. 산란 (t, sin (2 * pi * t), label = 'test') ax1.grid (True) # ax1.set_ylim ((-2, 2)) ax1.set_ylabel ( '1 Hz') ax1.set_title ( ax1.get_xticklabels ()의 레이블에 대한 '사인파 또는 2') : label.set_color ( 'r') plt.legend (loc = 'best') plt.show ()
adam.r

56

짧은 답변 : 범례에서 드래그 가능한 것을 호출하고 원하는 위치로 대화식으로 이동하십시오.

ax.legend().draggable()

긴 답변 : 프로그래밍 방식이 아닌 대화식 / 수동으로 범례를 배치하려는 경우 범례의 드래그 가능 모드를 전환하여 원하는 곳으로 드래그 할 수 있습니다. 아래 예를 확인하십시오.

import matplotlib.pylab as plt
import numpy as np
#define the figure and get an axes instance
fig = plt.figure()
ax = fig.add_subplot(111)
#plot the data
x = np.arange(-5, 6)
ax.plot(x, x*x, label='y = x^2')
ax.plot(x, x*x*x, label='y = x^3')
ax.legend().draggable()
plt.show()

잘 이해하고 있습니다. 레전드를 원하는 위치로 "끌어 가려면"어떻게해야합니까? 저는 Python 3.6과 Jupyter Notebook을 사용하고 있습니다
sb2020

14

정확히 당신이 요구 한 것은 아니지만 동일한 문제에 대한 대안이라는 것을 알았습니다. 다음과 같이 범례를 반투명하게 만듭니다. 반투명 범례 및 반투명 텍스트 상자가있는 matplotlib 플롯

이 작업을 수행하십시오.

fig = pylab.figure()
ax = fig.add_subplot(111)
ax.plot(x,y,label=label,color=color)
# Make the legend transparent:
ax.legend(loc=2,fontsize=10,fancybox=True).get_frame().set_alpha(0.5)
# Make a transparent text box
ax.text(0.02,0.02,yourstring, verticalalignment='bottom',
                     horizontalalignment='left',
                     fontsize=10,
                     bbox={'facecolor':'white', 'alpha':0.6, 'pad':10},
                     transform=self.ax.transAxes)

8

언급했듯이 범례를 줄거리에 놓거나 가장자리에서 약간 떨어 뜨릴 수도 있습니다. 다음은 IPython Notebook으로 만든 Plotly Python API 를 사용하는 예 입니다. 나는 팀에있다.

시작하려면 필요한 패키지를 설치해야합니다.

import plotly
import math
import random
import numpy as np

그런 다음 Plotly를 설치하십시오.

un='IPython.Demo'
k='1fw3zw2o13'
py = plotly.plotly(username=un, key=k)


def sin(x,n):
sine = 0
for i in range(n):
    sign = (-1)**i
    sine = sine + ((x**(2.0*i+1))/math.factorial(2*i+1))*sign
return sine

x = np.arange(-12,12,0.1)

anno = {
'text': '$\\sum_{k=0}^{\\infty} \\frac {(-1)^k x^{1+2k}}{(1 + 2k)!}$',
'x': 0.3, 'y': 0.6,'xref': "paper", 'yref': "paper",'showarrow': False,
'font':{'size':24}
}

l = {
'annotations': [anno], 
'title': 'Taylor series of sine',
'xaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'yaxis':{'ticks':'','linecolor':'white','showgrid':False,'zeroline':False},
'legend':{'font':{'size':16},'bordercolor':'white','bgcolor':'#fcfcfc'}
}

py.iplot([{'x':x, 'y':sin(x,1), 'line':{'color':'#e377c2'}, 'name':'$x\\\\$'},\
      {'x':x, 'y':sin(x,2), 'line':{'color':'#7f7f7f'},'name':'$ x-\\frac{x^3}{6}$'},\
      {'x':x, 'y':sin(x,3), 'line':{'color':'#bcbd22'},'name':'$ x-\\frac{x^3}{6}+\\frac{x^5}{120}$'},\
      {'x':x, 'y':sin(x,4), 'line':{'color':'#17becf'},'name':'$ x-\\frac{x^5}{120}$'}], layout=l)

이렇게하면 그래프가 만들어지고 범례를 플롯 자체 내에 유지할 수 있습니다. 범례가 설정되지 않은 경우 기본값은 여기에 표시된대로 플롯에 배치하는 것입니다.

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

대체 배치의 경우 그래프의 가장자리와 범례의 테두리를 가깝게 정렬하고 경계선을 제거하여 더 잘 맞을 수 있습니다.

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

코드 또는 GUI를 사용하여 범례 및 그래프를 이동하고 스타일을 변경할 수 있습니다. 범례를 이동하려면 다음 옵션을 사용하여 x와 y 값을 <= 1로 지정하여 범례를 그래프 안에 배치하십시오.

  • {"x" : 0,"y" : 0} -왼쪽 아래
  • {"x" : 1, "y" : 0} -오른쪽 아래
  • {"x" : 1, "y" : 1} -- 오른쪽 상단
  • {"x" : 0, "y" : 1} -왼쪽 상단
  • {"x" :.5, "y" : 0} -하단 중앙
  • {"x": .5, "y" : 1} -탑 센터

이 경우 설명서에legendstyle = {"x" : 1, "y" : 1} 설명 된 오른쪽 상단을 선택합니다 .

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


3

이 라인을 따라 뭔가가 나를 위해 일했습니다. Joe에서 가져온 약간의 코드로 시작하여이 방법은 창 너비를 수정하여 그림의 오른쪽에 범례를 자동으로 맞 춥니 다.

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)

# Put a legend to the right of the current axis
leg = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.draw()

# Get the ax dimensions.
box = ax.get_position()
xlocs = (box.x0,box.x1)
ylocs = (box.y0,box.y1)

# Get the figure size in inches and the dpi.
w, h = fig.get_size_inches()
dpi = fig.get_dpi()

# Get the legend size, calculate new window width and change the figure size.
legWidth = leg.get_window_extent().width
winWidthNew = w*dpi+legWidth
fig.set_size_inches(winWidthNew/dpi,h)

# Adjust the window size to fit the figure.
mgr = plt.get_current_fig_manager()
mgr.window.wm_geometry("%ix%i"%(winWidthNew,mgr.window.winfo_height()))

# Rescale the ax to keep its original size.
factor = w*dpi/winWidthNew
x0 = xlocs[0]*factor
x1 = xlocs[1]*factor
width = box.width*factor
ax.set_position([x0,ylocs[0],x1-x0,ylocs[1]-ylocs[0]])

plt.draw()

나는 이것이 매우 유용하다는 것을 알았고 그것은 나를 위해 일했다. wx 백엔드에있는 경우 (예 : Windows 사용) mgr.window.wm_geometry ( "% ix % i"% (winWidthNew, mgr.window.winfo_height ()))를 mgr.window.SetClientSizeWH (winWidthNew로 바꿉니다. , winHeightNew) 등
에스겔 Kruglick

Qt4Agg 백엔드 (Linux의 matplotlib 설치에서 기본값 임)를 사용하는 경우 행 mgr.window.wm_geometry(...)을 로 바꾸십시오 mgr.window.setFixedWidth(winWidthNew).
Filip S.

그리고 방금 발견 한 것처럼 창을 표시하지 않는 백엔드를 사용하는 경우 SVG 및 AGG 백엔드와 같이 파일에 바로 저장하기위한 것이므로 창 크기를 완전히 건너 뛰십시오. fig.set_size_inches(...)필요한 크기 조정을 처리합니다.
Filip S.

3

Matplotlib의 최신 버전으로 인해 범례를 플롯 외부에 배치하는 것이 훨씬 쉬워 졌으므로이 질문을 새로 고칠 가치가 있습니다. 이 예제는 Matplotlib version으로 제작했습니다 3.1.1.

사용자는 loc경계 상자의 어느 곳에 나 범례를 배치 하기 위해 2 개의 튜플 좌표를 매개 변수에 전달할 수 있습니다 . plt.tight_layout()범례를 볼 수 있도록 matplotlib가 플롯 치수를 다시 계산 하도록 실행해야합니다 .

import matplotlib.pyplot as plt

plt.plot([0, 1], [0, 1], label="Label 1")
plt.plot([0, 1], [0, 2], label='Label 2')

plt.legend(loc=(1.05, 0.5))
plt.tight_layout()

결과는 다음과 같습니다.

밖에 전설이있는 줄거리

참고 문헌 :


2

시도해 볼 수도 있습니다 figlegend. Axes 객체와 무관하게 범례를 생성 할 수 있습니다. 그러나 개체의 서식이 올바르게 전달되도록 "더미"경로를 만들어야 할 수도 있습니다.


1

여기에서 발견하기 matplotlib 튜토리얼에서 예입니다 여기가 . 이것은 더 간단한 예제 중 하나이지만 범례에 투명성을 추가하고 plt.show ()를 추가하여 대화 형 셸에 붙여 넣고 결과를 얻을 수 있습니다.

import matplotlib.pyplot as plt
p1, = plt.plot([1, 2, 3])
p2, = plt.plot([3, 2, 1])
p3, = plt.plot([2, 3, 1])
plt.legend([p2, p1, p3], ["line 1", "line 2", "line 3"]).get_frame().set_alpha(0.5)
plt.show()

1

큰 전설이 있었을 때 나를 위해 일한 해결책은 여분의 빈 이미지 레이아웃을 사용하는 것이 었습니다. 다음 예제에서 나는 4 개의 행을 만들었고 맨 아래에는 범례 (bbox_to_anchor)에 대한 오프셋이있는 이미지가 잘리지 않습니다.

f = plt.figure()
ax = f.add_subplot(414)
lgd = ax.legend(loc='upper left', bbox_to_anchor=(0, 4), mode="expand", borderaxespad=0.3)
ax.autoscale_view()
plt.savefig(fig_name, format='svg', dpi=1200, bbox_extra_artists=(lgd,), bbox_inches='tight')

1

추가 bbox_extra_artists및과 유사한 다른 솔루션은 다음과 같습니다. 여기서 전화 bbox_inches범위 내에 추가 아티스트가 필요하지 않습니다 savefig. 함수 내에서 대부분의 줄거리를 생성했기 때문에 이것을 생각해 냈습니다.

당신이 그것을 쓰고 싶을 때 모든 추가 사항을 경계 상자에 추가하는 대신 미리 Figure예술가 에게 추가 할 수 있습니다 . 의 Franck Dernoncourt의 답변 과 비슷한 것을 사용하십시오 .

import matplotlib.pyplot as plt

# data 
all_x = [10,20,30]
all_y = [[1,3], [1.5,2.9],[3,2]]

# plotting function
def gen_plot(x, y):
    fig = plt.figure(1)
    ax = fig.add_subplot(111)
    ax.plot(all_x, all_y)
    lgd = ax.legend( [ "Lag " + str(lag) for lag in all_x], loc="center right", bbox_to_anchor=(1.3, 0.5))
    fig.artists.append(lgd) # Here's the change
    ax.set_title("Title")
    ax.set_xlabel("x label")
    ax.set_ylabel("y label")
    return fig

# plotting
fig = gen_plot(all_x, all_y)

# No need for `bbox_extra_artists`
fig.savefig("image_output.png", dpi=300, format="png", bbox_inches="tight")

다음은 생성 된 플롯입니다.


-1

당신이 이미 문제를 정리했는지 알지 못합니다. 아마도 그렇습니다. matplotlib에서 pylab을 가져 왔습니다. 다음과 같이 코드를 참조하십시오.

from matplotlib as plt
from matplotlib.font_manager import FontProperties
...
...
t = A[:,0]
sensors = A[:,index_lst]

for i in range(sensors.shape[1]):
    plt.plot(t,sensors[:,i])

plt.xlabel('s')
plt.ylabel('°C')
lgd = plt.legend(b,loc='center left', bbox_to_anchor=(1, 0.5),fancybox = True, shadow = True)

줄거리를 보려면 클릭

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.