2010-05-07 5 views
11

등고선 플롯에서 matplotlib clabels의 위치를 ​​제어하고 싶지만 clabel에서 manual = True 플래그를 사용하지 않아야합니다. 예를 들어, x 좌표를 지정하고이 선을 통과하는 지점에 레이블을 만들려합니다. 나는 당신이 get_position()을 사용하여 개별 레이블의 위치를 ​​얻을 수 있다는 것을 알지만, 나는 그것에 매달려있다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!Matplotlib Contour Clabel 위치

답변

5

아니요, 그렇게하기 위해 matplotlib에 내장 된 방법이 없습니다. 기본 위치로 살거 나 수동으로 완전히 상호 작용하고 마우스를 사용해야합니다.

버그 신고를 업스트림으로보고 알고리즘을 개선 할 수 있습니다.

이 문제를 해결하는 데는 여러 가지 옵션이 있습니다. 첫 번째는 프로그래밍 방식으로 윤곽 그림에 텍스트를 배치하는 것입니다. 이런 식으로 텍스트 아래의 줄을 확실하게 제거 할 수 없습니다. 윤곽선이 c이라고 가정하면 등고선은 c.collections에 있습니다. 모든 등고선에 대해 get_paths을 호출하고 해당 경로에 텍스트를 배치하십시오.

다른 옵션은 수동 배치 코드 (matplotlib.contour.BlockingContourLabeler)를 대체하거나 레이블 위치 (matplotlib.contour.locate_label)를 찾는 코드를 미세 조정하는 것입니다.하지만 두 기능 모두 매우 밀집합니다. 당신이 locate_label에 대한 교체 작업과 함께 올 수 있다면 당신은

%psource c.clabel 
와 대화 형 세션에서 함수 소스를 쉽게 볼 수 있습니다 ipython 사용하는 경우 그냥 당신이 Btw는 매크로

def your_locate_label(self, linecontour, labelwidth): 
    # some magic 
    pass 

ar = np.array([[1,0], [0,1]] 
c = matplotlib.contour(ar) 
c.locate_label = your_locate_label 

c.clabel() 

음모를 꾸미고에 기존의 방법을 덮어

직접 호출은 사용자의 파일에 $EDITOR은 예, 지금 거기

%edit c.clabel 
+0

나는이 문제를 게시 찾지 못했습니다, 그래서 만든 새로운 : https://github.com/matplotlib/matplotlib/issues/613 – keflavich

9

로 정의했다 레이블 위치를 제어하는 ​​방법입니다! https://github.com/matplotlib/matplotlib/pull/642

plt.figure() 
CS = plt.contour(X, Y, Z) 
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)] 
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations) 
+0

매뉴얼은 X, Y의 반복 가능한 객체가 될 수 있습니다 튜플. 등고선 레이블은 각 x, y 위치에서 마우스를 클릭하는 것처럼 만들어집니다. – Faber

+2

자동화 된 라벨링을 허용하는 방법이 있습니까? 그런 다음 라벨을 반복하여 축과 교차하는 라벨을 제거하고 향상시킬 수 있습니까? –