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

你需要 plt.ion()。看看这个:pylab.ion() in python 2, matplotlib 1.1.1 and updates of the plot while the program runs。您还可以探索 Matplotlib 动画类:http: //jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/

于 2013-07-03T10:08:19.710 回答
0

我认为这个玩具代码澄清了@ardoi 的答案:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,2*np.pi,num=100)
plt.ion()
for i in xrange(x.size):
    plt.plot(x[:i], np.sin(x[:i]))
    plt.xlim(0,2*np.pi)
    plt.ylim(-1,1)
    plt.draw()
    plt.clf()

编辑:前面的代码通过在屏幕上设置动画来显示正弦函数。

于 2013-07-04T23:24:24.693 回答
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 回答