2014-09-03 7 views
0

각 그림에 대해 사용자 정의 축 (위치 및 크기)을 사용하여 하나의 복잡한 그림으로 뭉치고 싶은 독립 스크립트에 의해 생성 된 여러 개의 그림이 있습니다. 나는이 접근법이 지금까지 matplotlib에 의해 잘 지원되지 않는 것 같다는 것을 알고 있지만, 나는 그것을 시도하기로 결정했다.축이 새 그림에 추가 될 때 그림 모양이 유지되지 않습니다.

지금 당장은 각 패널을 원하는 패널에 복사 할 수 있지만 "복사 된"그림은 어떻게 든 잘리고 축이 엉망입니다. 그리고 솔직히 말해서 matplotlib에 비교적 익숙하지 않기 때문에 (Matlab copyobj()에서) 빠져있는 것이 무엇인지 모릅니다. 예를 들어 트릭을했을 것입니다.

def customfigure(flist,axlist): 
    # Margins 
    lm = 0.05 
    rm = 0.05 
    bm = 0.05 
    tm = 0.05 

    # basic grid 
    nrow = 2 
    ncol = 2 

    # rulers 
    hr = 0.02 
    vr = 0.02 

    # axis width 
    aw = (1-lm-rm-(ncol-1)*hr)/ncol 
    # axis height 
    ah = (1-tm-bm-(nrow-1)*vr)/nrow 

    # Make axis box 
    ax = [None]*(ncol*nrow) 
    ax[0] = [lm,bm,aw,ah] 
    ax[1] = [lm,bm+ah+vr,aw,ah] 
    ax[2] = [lm+aw+hr,bm,aw,ah] 
    ax[3] = [lm+aw+hr,bm+ah+vr,aw,ah] 

    fig = plt.figure(figsize=(10,6),dpi=80) 
    # Solution 1 
    for i in xrange(len(axlist)): 
     axlist[i].set_position(ax[i]) 
     axlist[i].set_figure(fig) 
     flist[i].delaxes(axlist[i])   
     fig.add_axes(axlist[i]) 

close('all') 
fig = [None]*4 
ax = [None]*4 
x = array([range(10)]) 

close('all') 
fig = [None]*4 
ax = [None]*4 

t = arange(0.0, 2.0, 0.01) 
color = ['k','r','g','b'] 
for i in xrange(4): 
    fig[i],ax[i] = plt.subplots() 
    s = sin(2*(i+1)*pi*t) 
    plt.plot(t, s,'-',color=color[i]) 
    show() 

customfigure(fig,ax) 

(나는 초보자 여기에 붙여 넣을 수 없습니다 유감스럽게도) customfigure에 의해 만들어 마지막 그림()이 적어도 두 가지 문제가 있습니다를 : 다음

내가 테스트를 위해 사용하고, 샘플 코드입니다 그림 : (1) - 복사 한 그림의 크기가 set_position() 인스턴스 (2)에 의해 예상되는 크기가 아닙니다. - 주 그림에서 덩어리 진 원래 그림은 데이터 범위가 1.0 인 경우 잘린 것처럼 보입니다. x 축은 2.0까지 올라갑니다.) (3) - 그러면 축의 위치가 완전히 나사로 고정됩니다.

내가 뭘 잘못 했니?

미리 도움을 주셔서 감사합니다.

답변

1

M 나는이 일의 가장 자연스러운 방법은 먼저 사용자 정의 축 만든 다음 직접에 음모라고 생각합니다. 그것의 소리에 의해, 여러분은 독립 스크립트를 변경하여 축 인스턴스를 인수로 취해서 상태 플롯 인터페이스를 사용하지 않고 플롯 팅을 수행해야합니다.

customfigure에서 축 인스턴스의 목록을 반환하는 것이 일을하는 한 가지 방법 :

color = ['k', 'r','g', 'b'] 
alist = customfigure() # (customfigure doesn't need to take any 
         # arguments now) 
for i in xrange(4): 
    s = np.sin(2*(i+1) * np.pi * t) 
    alist[i].plot(t, s, '-', color = color[i]) 
: 당신이 다음 스크립트의 메인 섹션에서의 플롯이 사용할 수

for i in xrange(len(axlist)): 
    axlist[i] = fig.add_axes(ax[i]) 
return axlist 

그게 당신이 원하는대로해야합니다. 이런 일은 커스텀 플롯을 할 때 내가하는 경향이 있습니다.

독립적 인 스크립트를 변경하고 싶지 않다면 plt.sca을 사용하여 state-ful 인터페이스에서 현재 상태 축을 생성 한 축으로 설정하면 훨씬 똑같은 것을 얻을 수 있습니다 음모를 꾸미고 싶습니다. 여기에는 다음과 같은 작업이 포함됩니다.

color = ['k', 'r','g', 'b'] 
alist = customfigure() # (customfigure doesn't need to take any 
         # arguments now) 
for i in xrange(4): 
    s = np.sin(2*(i+1) * np.pi * t) 
    plt.sca(alist[i]) 
    plt.plot(t, s, '-', color = color[i]) 

희망이 있으면 도움이되고 이해할 수 있습니다.

+0

안녕하세요 John, 멋진 아이디어를 주셔서 감사합니다. 먼저 수치를 생성하고 복잡한 수치로 전체를 뭉 갠다는 주된 이유는 긴 인 쇄 시간을 필요로하는 긴 스크립트로 독립 수치가 생성되기 때문입니다. 그래서 아이디어는 먼저 수치를 저장 한 다음 파일에서 열어 단일 숫자로 덩어리를 작성하는 것이 었습니다. 왜 이것이 불가능할 지 이해할 수 없다. 나는 [이] (https://www.mail-archive.com/[email protected]/msg06032.html)을 발견했다. 그러나 나는 나의 형상을 올바르게 바꿀 방법을 모른다. – maurizio