2014-12-14 2 views
4

Matplotlib에는 그림 창에 여러 축 세트를 배치하는 방법에 대한 문서화 된 방법이 있지만 한 축 세트의 위치를 ​​정의하는 방법을 알 수는 없습니다 다른 축 세트의 위치matplotlib : 자동 업데이트로 다른 축에 대한 축 배치

nice_stacked_plots

이 잘 좋은 모든,하지만 난이 변경 될 때 하단의 크기가

#Change the size of the bottom plot 
bbox2 = ax2.get_position() 
ax2.set_position([bbox2.x0, bbox2.y0, bbox2.width, bbox2.height * 1.25]) 
ax2.set_ylim(0,60) 
fig.savefig('overlapping_stacked_plots.png') 

바닥을 축 : 예를 들어,

import matplotlib.pyplot as plt 
import numpy as np  

#Define data 
x1 = np.arange(0,10,0.01) 
y1 = np.sqrt(x1) 
x2 = x1 
y2 = 1.0/2.0 * x2**2.0 

#Generate vertically stacked plots 
fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax1.plot(x1,y1) 
ax2 = fig.add_subplot(212) 
ax2.plot(x2,y2) 
fig.savefig('nice_stacked_plots.png') 

는 다음 플롯을 제공합니다 축이 상단 축과 중첩 됨

overlapping_stacked_plots

오버랩을 제거하기 위해 상단 축의 위치를 ​​나중에 업데이트 할 수 있다는 것을 알았지 만 처음부터 하단 축을 기준으로 상단 축의 위치를 ​​지정하고 자동으로 업데이트해야합니다.

예를 들어, annotate tutorial에서 OffsetFrom 클래스를 사용하여 주석을 배치 한 다음 첫 번째 주석의 지정된 오프셋에 두 번째 주석을 배치 할 수 있습니다. 첫 번째 주석이 이동하면 두 번째 주석도 함께 이동합니다. 축과 비슷한 것을하고 싶습니다.

+0

. 난 당신이 다른 모든 subplots의 위치를 ​​수정할 것이라고 무언가에 좌표 resize 이벤트를 연결할 필요가있을 것 같아요 ...하지만 난 (그냥 캔버스 크기를 조정) 축 resize 이벤트를 찾을 수 없었 워드 프로세서를 읽고. 그래서 당신은 축의 하위 클래스를 만들고 이벤트를 추가 할 수 있다고 생각합니다. 그러나 저는 파이썬을 아직 잘 이해하지 못했고 정확히 어떻게 할 지 모릅니다. –

+0

예, 그런 내용이 필요하다는 데 동의합니다. 여기에서 응답이 없으므로 matplotlib github 페이지에서 기능 요청 (Issue [# 3926] (https://github.com/matplotlib/matplotlib/issues/3926))을 제출했습니다. – Stretch

답변

0

나는 일반적인 대답은 없지만, add_axes에 대해 알고 계십니까?

하위 플롯의 위치를 ​​정확하게 정의 할 수 있으므로 다른 서브 플로트를 종속적으로 만드는 것이 쉽습니다. 여기 예가 있습니다 - 내가 말했듯이, 당신의 임무에 대해 구체적이지만, 아마도 당신에게 영감을 줄 수 있습니까?

# General aspect of the Fig (margins) 
left = 0.1 
right = 0.05 
width= 1.-left-right 
bottom = 0.1 
top = 0.05 
hspace = 0.10 #space between the subplots 

def placeSubplots(fig, ax2height = (1.-top-bottom-hspace)/2.): 
    ax1height = 1-top-bottom-hspace-ax2height 
    ax1 = fig.add_axes([left, bottom+ax2height+hspace, width, ax1height]) 
    ax1.plot(x1, y1) 
    ax2 = fig.add_axes([left, bottom, width, ax2height]) 
    ax2.plot(x2, y2) 
    return fig 

fig1 = placeSubplots(plt.figure()) 
fig2 = placeSubplots(plt.figure(), ax2height=0.6) 

fig1.savefig('fig1_equal_heigth.png') 
fig2.savefig('fig2_ax2_taller.png') 

, 필립스 : fig1

그림 2 : fig2

위가, 두 번째 축 높이가 절대적인 방법으로 지정되어 있지만, 그들 사이의 비율로 줄거리의 높이를 정의 할 수 있습니다 too

def placeSubplotsRatio(fig, ax1ax2ratio = 1.): 
    subplotSpace = 1.-top-bottom-hspace 
    ax1height = subplotSpace/(1.+1./ax1ax2ratio) 
    ax2height = subplotSpace/(1.+ax1ax2ratio) 
    ax1 = fig.add_axes([left, bottom+ax2height+hspace, width, ax1height]) 
    ax1.plot(x1, y1) 
    ax2 = fig.add_axes([left, bottom, width, ax2height]) 
    ax2.plot(x2, y2) 
    return fig 

fig3 = placeSubplotsRatio(plt.figure()) # idem as fig1 
fig4 = placeSubplotsRatio(plt.figure(), ax1ax2ratio=3.) #ax1 is 3 times taller 
fig5 = placeSubplotsRatio(plt.figure(), ax1ax2ratio=0.25) #ax2 is 4 times taller 

fig4.savefig('fig4_ax1ax2ratio3.png') 
fig5.savefig('fig5_ax1ax2ratio025.png') 

fig4 : fig4

fig5 : 나는 또한이 작업을 수행하는 방법을 알고 싶습니다 fig5

+0

나는 제안을 감사하지만'add_axes'에 대해 알고 있습니다. 당신이 암시했듯이, 처음부터 축 위치와 크기를 지정하는 것보다 강력한 솔루션을 찾고 있습니다.나는'ax1'의 위치와 크기를 바꾸고'ax2'를 자동으로 갱신하고 싶습니다. – Stretch

+0

OK 죄송합니다 - 지금 당장 볼 수있는 유일한 방법은 새로운 원하는 축 정보를 인수로 전달하는 작은 함수를 작성하는 것입니다 (예 : get_position()에서 + 수정 예제) 다른 축을 업데이트합니다. 그리고'add_axes'를 통해 가능한 한 서브 플로트 상대 위치의 정확한 제어를 넘어 내장 기능이 어떻게 수행되는지 실제로 볼 수 없습니다. 답변이 표시되는지 확인하려면이 질문을 따르십시오. – ztl

+0

내 원래 게시물에서 언급했듯이 [주석 튜토리얼] (http://matplotlib.org/users/annotations_guide.html)을 살펴보십시오. 'OffsetFrom' 클래스를 사용하면 주석 위치는 렌더링시 자동으로 업데이트되므로 축과 함께 동일한 작업을 수행 할 수 있습니다. – Stretch

관련 문제