我在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()
返回时。
答案 0 :(得分:2)
隐藏的主循环只会在不同时间之间运行以更新绘图,您需要以允许GUI继续工作的方式启动长计算,这可以是:
然后当它通知它已完成显示结果。好消息是你可以对结果请求进行排队,这样你的用户就可以点击几个点(每个点都立即突出显示),去吃午餐或者可能去周末。
请注意python中的sleep块。