2011-09-15 3 views
3

3D 배열이 있는데 첫 번째 두 차원은 공간이므로 (x, y)라고 말합니다. 세 번째 차원에는 점 별 정보가 포함됩니다. 지금이미지 데이터 모양이 변경된 경우 imshow를 사용하여 올바른 한계 설정

print H.shape # --> (200, 480, 640) spatial extents (200,480) 

, 삼차원의 특정면을 선택함으로써, I는 I가 전환되도록 해주기 큐브 회전 I 원할

imdat = H[:,:,100] # shape (200, 480) 
img = ax.imshow(imdat, cmap='jet',vmin=imdat.min(),vmax=imdat.max(), animated=True, aspect='equal') 

갖는 화상을 표시 할 수있다 (X, Y) ~ (y, x).

imdat = H[:,:,100] # shape (480,200) 
img.set_data(imdat) 
ax.relim() 
ax.autoscale_view(tight=True) 

내가 이상한 행동을 얻을 : 내가 전화 이제

H = np.rot90(H)   # could also use H.swapaxes(0,1) or H.transpose((1,0,2)) 
    print H.shape # --> (480, 200, 640) 

. 행에 따른 이미지는 200 번째 행까지 데이터를 표시 한 다음 y 축 (480) 끝까지 검정색으로 표시됩니다. x 축은 0에서 200까지 확장되며 회전 된 데이터를 표시합니다. 자, 90도 다른 회전, 이미지가 올바르게 표시됩니다 (그냥 180도 물론 회전)

그것은 데이터 회전 후, 축 제한 (또는 이미지 범위?) 또는 뭔가가 아닌 것 같습니다 새로 고침. 누군가 도울 수 있습니까?

추신 : 나쁜 해킹에 빠지기 위해 각 회전 후에 새로운 이미지 (ax.imshow를 호출하여)를 다시 만들려고했으나 여전히 동일한 동작을합니다.

+0

문맥을 제공 할 수 있습니까? 왜냐하면 새로운 이미지를 별도의 그림으로 그릴 것을 권장하기 때문입니다. 이것이 바람직하지 않은 경우 이유를 지정하십시오. –

+0

나는 뒤죽박죽이다. 각 호출 후에'set_extent'를 명시 적으로 사용해야한다고 가정했는데'set_xlim','set_ylim'도 호출해야합니다.하지만 이렇게하면 원하는 동작을 얻지 못하는 것 같습니다. – Yann

답변

4

아래에는 문제 해결 방법이 나와 있습니다. 방법 resetExtent은 데이터와 이미지를 사용하여 익스텐트를 원하는 값으로 명시 적으로 설정합니다. 잘하면 나는 의도 한 결과를 정확하게 에뮬레이트했다. 먼저 유엔 - 회전 : enter image description here 그런 다음 회전 :

import matplotlib.pyplot as plt 
import numpy as np 

def resetExtent(data,im): 
    """ 
    Using the data and axes from an AxesImage, im, force the extent and 
    axis values to match shape of data. 
    """ 
    ax = im.get_axes() 
    dataShape = data.shape 

    if im.origin == 'upper': 
     im.set_extent((-0.5,dataShape[0]-.5,dataShape[1]-.5,-.5)) 
     ax.set_xlim((-0.5,dataShape[0]-.5)) 
     ax.set_ylim((dataShape[1]-.5,-.5)) 
    else: 
     im.set_extent((-0.5,dataShape[0]-.5,-.5,dataShape[1]-.5)) 
     ax.set_xlim((-0.5,dataShape[0]-.5)) 
     ax.set_ylim((-.5,dataShape[1]-.5)) 

def main(): 
    fig = plt.gcf() 
    ax = fig.gca() 

    H = np.zeros((200,480,10)) 
    # make distinguishing corner of data 
    H[100:,...] = 1 
    H[100:,240:,:] = 2 

    imdat = H[:,:,5] 
    datShape = imdat.shape 

    im = ax.imshow(imdat,cmap='jet',vmin=imdat.min(), 
        vmax=imdat.max(),animated=True, 
        aspect='equal', 
        #    origin='lower' 
        ) 

    resetExtent(imdat,im) 

    fig.savefig("img1.png") 

    H = np.rot90(H) 

    imdat = H[:,:,0] 
    im.set_data(imdat) 
    resetExtent(imdat,im) 

    fig.savefig("img2.png") 

if __name__ == '__main__': 
    main() 

이 스크립트는 두 개의 이미지를 만들어 나는 그것이 축 제한을 조정해야하기 때문에 단지 명시 적으로, 모든 resetExtent가 수행 할 것 set_extent를 호출 생각 enter image description here

'autoscle'이 True이면 그러나 알 수없는 이유로 인해 set_extent으로 전화하는 것은 그 일을하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 내가 직면했던 동일한 문제를 확인합니다. 나는 지우고 난 후에 축을 다시 띄워서 작업했지만, 이것은 덜 무게가있는 해결책으로 보입니다. – achennu

관련 문제