2011-09-15 6 views
3

私は3D配列を持ちます。最初の2つの次元は空間的なので、(x、y)と言います。 3次元には、ポイント固有の情報が含まれています。イメージデータの形状が変更された場合、imshowで正しい限界値を設定する

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

次に、第三の次元にある面を選択することにより、私は(x、y)を切り替えるように、私は、今キューブを回転する

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

で画像を表示することができます〜(y、x)となる。

今、私が呼ぶとき
H = np.rot90(H)   # could also use H.swapaxes(0,1) or H.transpose((1,0,2)) 
    print H.shape # --> (480, 200, 640) 

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

私は奇妙な動作を得ます。行に沿った画像は、200行目までのデータを表示し、y軸(480)の終わりまで黒色になります。 x軸は0から200まで伸び、回転したデータを示します。今度は、90度別の回転、画像が正しく表示されます(ちょうど180度回転しただけです)

データを回転した後、軸の限界(または画像のエクステント?正しくリフレッシュ。誰かが助けることができますか?

PS:悪いハッキングで嫌がらせをするために、各回転の後に新しい画像(ax.imshowを呼び出すことによって)を再生成しようとしましたが、私はまだ同じ動作をします。

+0

コンテキストを提供できますか?新しい画像を別の図にプロットすることをお勧めします。それが望ましくない場合は、その理由を明記してください。 –

+0

私は困惑しています。私は 'set_extlim'を各呼び出しの後に明示的に使用する必要があると仮定しました。これは' set_xlim'、 'set_ylim'を呼び出す必要がありますが、これを行うと希望の動作を得ることができません。 – Yann

答えて

4

以下に、問題の解決方法を示します。メソッドresetExtentは、データとイメージを使用してエクステントを明示的に希望の値に設定します。うまくいけば、私は意図した結果を正確にエミュレートしました。 まず非回転:

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() 

このスクリプトは、二つの画像生成 enter image description here を次に回転: enter image description here

を、私はそれが軸の範囲を調整する必要があるため、単に明示的set_extentを呼び出すと、ないresetExtent全力を尽くすだろうと思いました'autoscle'がTrueの場合しかし、何らかの未知の理由のために、set_extentだけを呼び出すことは仕事をしません。

+0

返事をありがとう。それは私が直面したのと同じ問題を特定します。私はクリア後に軸を再配置することでその周りに取り組みましたが、これはあまり重視されない解決策です。 – achennu