最近几天我一直在玩 Numpy 和 matplotlib。我在尝试使 matplotlib 绘制一个函数而不阻塞执行时遇到问题。我知道这里已经有很多关于 SO 提出类似问题的线程,而且我已经用谷歌搜索了很多,但还没有设法完成这项工作。
我曾尝试按照某些人的建议使用 show(block=False) ,但我得到的只是一个冻结的窗口。如果我只是调用 show(),结果会被正确绘制,但执行会被阻止,直到窗口关闭。从我读过的其他线程中,我怀疑 show(block=False) 是否有效取决于后端。这个对吗?我的后端是 Qt4Agg。你能看看我的代码,如果你发现有问题告诉我吗?这是我的代码。谢谢你的帮助。
from math import * from matplotlib import pyplot as plt print(plt.get_backend()) def main(): x = range(-50, 51, 1) for pow in range(1,5): # plot x^1, x^2, ..., x^4 y = [Xi**pow for Xi in x] print(y) plt.plot(x, y) plt.draw() #plt.show() #this plots correctly, but blocks execution. plt.show(block=False) #this creates an empty frozen window. _ = raw_input("Press [enter] to continue.") if __name__ == '__main__': main()
PS。我忘了说我想在每次绘制某些东西时更新现有窗口,而不是创建一个新窗口。
看起来,为了得到你(和我)想要的东西,你需要结合plt.ion(), plt.show()(而不是block=False),最重要的是,plt.pause(.001)(或者你想要的任何时间)。之所以需要暂停,是因为 GUI 事件发生在主代码休眠时,包括绘图。这可能是通过从睡眠线程中获取时间来实现的,所以也许 IDE 会弄乱那个——不知道。
plt.ion()
plt.show()
block=False
plt.pause(.001)
这是一个适用于我在 python 3.5 上的实现:
import numpy as np from matplotlib import pyplot as plt def main(): plt.axis([-50,50,0,10000]) plt.ion() plt.show() x = np.arange(-50, 51) for pow in range(1,5): # plot x^1, x^2, ..., x^4 y = [Xi**pow for Xi in x] plt.plot(x, y) plt.draw() plt.pause(0.001) input("Press [enter] to continue.") if __name__ == '__main__': main()