1

matplotlib を使用して線をプロットしていますが、新しい値が生成されたらすぐに線データを更新したいと考えています。ただし、ループに入ると、ウィンドウは表示されません。印刷された行はループが実行されていることを示していますが。

これが私のコードです:

def inteprolate(u,X):
    ...
    return XX

# generate initial data
XX = inteprolate(u,X)

#initial plot
xdata = XX[:,0]
ydata = XX[:,1]
ax=plt.axes()  
line, = plt.plot(xdata,ydata)

# If this is in, The plot works the first time, and then pauses 
# until the window is closed.
# plt.show()

# get new values and re-plot
while True:  
    print "!"
    XX = inteprolate(u,XX)
    line.set_xdata(XX[:,0])
    line.set_ydata(XX[:,1])
    plt.draw() # no window

plt.show()がブロックされplt.drawていてウィンドウが更新/表示されない場合、プロットをリアルタイムで更新するにはどうすればよいですか?

4

4 に答える 4

1

plt.pause処理するように指定したすべてのイベントを処理する機会を GUI に与えるには、ループ内で呼び出す必要があります。そうしないと、バックアップされてグラフが表示されない可能性があります。

# get new values and re-plot
plt.ion()  # make show non-blocking
plt.show() # show the figure
while True:  
    print "!"
    XX = inteprolate(u,XX)
    line.set_xdata(XX[:,0])
    line.set_ydata(XX[:,1])
    plt.draw() # re-draw the figure
    plt.pause(.1)  # give the gui time to process the draw events

アニメーションを作成したい場合は、animationモジュールの使用方法を学ぶ必要があります。開始するには、このすばらしいチュートリアルを参照してください。

于 2013-07-10T04:09:36.947 に答える
0

@Alejandro と同じことを行う効率的な方法は次のとおりです。

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
x = np.linspace(0,2*np.pi,num=100)
y = np.sin(x)

plt.xlim(0,2*np.pi)
plt.ylim(-1,1)
plot = plt.plot(x[0], y[0])[0]
for i in xrange(x.size):
    plot.set_data(x[0:i],y[0:i])
    plt.draw()
于 2013-07-05T02:48:50.080 に答える