强制瞬时matplotlib图更新

时间:2013-10-15 14:37:49

标签: python animation matplotlib action draw

我在matplotlib中有一个散点图,对它们有onpick()个动作,如下面的MWE所示。

每当选择一个点时,我会对该点进行计算,大约需要30秒。我想在用户点击它的同时通过在同一点上绘制图中的红色圆圈来通知用户。

以下MWE有效,但只在30秒之后绘制红色圆圈:

from numpy import take
from numpy.random import randn
from time import sleep
import matplotlib.pylab as plt

fig, ax = plt.subplots()
X, Y = randn(2, 10)
ax.scatter(X, Y, picker=True)
def onpick(event):
    ax.scatter(take(X, event.ind), take(Y, event.ind), s=40, facecolors='none', edgecolors='red')
    fig.canvas.draw()
    sleep(30)#here I have MyLongComputation() in my code

fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

有没有办法立即请求数字绘图操作?如果它很重要,我将以交互模式从Ipython调用该文件。

请注意,matplotlib不会忽略我对fig.canvas.draw()的调用,只会推迟到onpick()返回时。

1 个答案:

答案 0 :(得分:2)

隐藏的主循环只会在不同时间之间运行以更新绘图,您需要以允许GUI继续工作的方式启动长计算,这可以是:

  • 在一个单独的线程中,(参见python thread module),
  • 作为外部进程,(参见子进程模块),
  • 使用multiprocessing
  • 在其他核心上
  • 作为外部对象,可能在远程服务器上,在非阻塞模式下使用pyrompi4pycelery,请注意服务器可以位于同一台计算机上。 / LI>

然后当它通知它已完成显示结果。好消息是你可以对结果请求进行排队,这样你的用户就可以点击几个点(每个点都立即突出显示),去吃午餐或者可能去周末。

请注意python中的sleep块。