2017-04-06 9 views
0

저는 matplotlib 범례를 새 것으로 바꾸고 싶지만 바꾸려는 범례의 동일한 (가능하면 임의의) 위치를 유지하고 싶습니다.matplotlib 범례를 바꾸고 동일한 위치를 유지하는 방법?

다음 코드가 작동하지 않는 이유는 무엇입니까? 내가 오해를 해요 않는

 
import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 

plt.legend(['b'], bbox_to_anchor=bb) 

답변

0

이 질문에 대답하기 :
전설의 위치가 경우에만 런타임에 결정된다 그림이 그려진다. 또한 bbox_to_anchor가 설정되지 않았으므로 전체 축 ((0,0,1,1))이됩니다.

당신이 (그것에 만 닫기) 먼저 윈도우 정도

ax.figure.canvas.draw() 
bb = leg.get_window_extent().inverse_transformed(ax.transAxes) 

이 그러나 당신에게 정확한 위치를 제공하지 않습니다에게 캔버스를 그릴 다음의 취득 할 수 있습니다. 이제

가능한 솔루션이 전설을 대체, 대신 만 콘텐츠의 업데이트하지 않을 수 있습니다 : 당신은 bbox_to_anchor과의 LOC 매개 변수를 필요, 업데이트가 옵션이 아닌 경우,

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 

leg.texts[0].set_text("b") 

plt.show() 

그렇지 않으면 이전 범례 :

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left', bbox_to_anchor=(0.5,0.5)) 

bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 
plt.legend(['b'], bbox_to_anchor=bb, loc=leg._loc_real) 

plt.show() 

모드가 "확장"으로 설정된 경우에도 여전히 실패 할 수 있습니다. 또한 동일한 팬시 상자 매개 변수를 사용하여 새 범례를 만드는 경우에만 정확합니다.

+0

내용을 업데이트하는 것이 좋을 것입니다. 그러나 글꼴, numpoints, scatterpoints, labelspacing, handletextpad, borderaxespad, borderpad, handlelength 및 fancybox 필요한 모든 속성을 업데이트 할 수 있다고 생각하지 않습니다. 나는 이들 중 몇 가지는 창조 할 때 범례 명령을 통해서만 접근 할 수 있다고 생각한다. – mrclary

+0

범례가 고정 된 방법/위치를 결정하는 방법이 있습니까? 예를 들어, 범례의 왼쪽 아래 모서리는 축의 왼쪽 아래 모서리에 고정됩니다. 그렇다면'loc = 'lower left ''를 설정할 수 있습니다 ... – mrclary

+0

답변을 업데이트했습니다. 어쩌면 이것은 당신이 필요로하는 것에 더 가깝습니다. – ImportanceOfBeingErnest

0

바로 수행 문제의 코드가 작동하지 않을 이유

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

location = 'lower left' 

while 1: 

    plt.legend(['a'], loc=location) 
    plt.pause(1) 
    plt.legend(['b'], loc=location) 
    plt.pause(1) 
+0

원래 범례 위치를 알 수 없으며 임의적 일 수 있음을 분명히해야합니다. 예를 들어 그림이 피클 파일에서로드 된 경우 이런 일이 발생할 수 있습니다. – mrclary