2017-11-30 9 views
0

Matplotlibを使用して3Dボリュームを描き、スライスごとにスライスしたいと思います。 マウススクロールでインデックスを変更します。私のプログラムは以下の通りです:Matplotlibの軸の画像を更新するには

図は主機能で初期化されています。 like:

fig, ax = plt.subplots() 
ax.volume = volume # volume is a 3D data, a 3d np array. 
ax.index = 1 
ax.imshow(volume[ax.index]) 
fig.canvas.mpl_connect('scroll_event', mouse_scroll) 

私はax.imagesとは分かりませんが、すべてうまく機能しました。しかし、ax.volumeを新しいボリュームデータに置き換えると問題が発生しました。それは突然レンダリングを停止します!コードにデバッグすると、各イベントコールバックでax.image[0]が正しく設定されます。

ただし、イメージのset_arrayメソッドをax.show()に変更した場合。 Figureが再びレンダリングされ始めます。しかし、軸は関数ax.images[0].set_array()と比較して実際に遅いです。

この問題を解決するにはどうすればよいですか?本当にset_array()メソッドを使用したい。どうもありがとうございました。

単純な実行可能スクリプトが添付されています。 [email protected]

+1

解決策を見つけるのに役立つように、人々が望ましくない行動を再現できるように[mcve]を提供することは常に理にかなっています。既存のオブジェクトのカスタム属性を作成することは一般的には良い考えではありませんが、この場合に問題が発生するかどうかはわかりません。 Appart、コードは正常に見えます。しかし、[mcve]がなければ、テストすることはできません。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest大変ありがとうございます。私は簡単な実行可能コードを添付しました。 –

答えて

0

いつも同じイメージで作業する必要があります。ベストあなたはそれがset_dataを使用するためのデータを設定することができます

img = ax.imshow(volume[ax.index]) 

この名前を与えます。

import numpy as np 
import matplotlib.pyplot as plt 

#Mouse scroll event. 
def mouse_scroll(event): 
    fig = event.canvas.figure 
    ax = fig.axes[0] 
    if event.button == 'down': 
     next_slice(ax) 
    fig.canvas.draw() 

#Next slice func. 
def next_slice(ax): 
    volume = ax.volume 
    ax.index = (ax.index - 1) % volume.shape[0] 
    img.set_array(volume[ax.index]) 

def mouse_click(event): 
    fig = event.canvas.figure 
    ax = fig.axes[0] 
    volume = np.random.rand(10, 10, 10) 
    ax.volume = volume 
    ax.index = (ax.index - 1) % volume.shape[0]    
    img.set_array(volume[ax.index]) 
    fig.canvas.draw_idle() 

if __name__ == '__main__': 
    fig, ax = plt.subplots() 
    volume = np.random.rand(40, 40, 40) 
    ax.volume = volume # volume is a 3D data, a 3d np array. 
    ax.index = 1 
    img = ax.imshow(volume[ax.index]) 
    fig.canvas.mpl_connect('scroll_event', mouse_scroll) 
    fig.canvas.mpl_connect('button_press_event', mouse_click) 
    plt.show() 
+0

ありがとうございます。できます。 –