我在尝试使 matplotlib 绘制函数而不阻止执行时遇到问题。
我尝试过使用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()
附言。我忘了说,我想在每次绘制某些内容时更新现有窗口,而不是创建一个新窗口。
我花了很长时间寻找解决方案,发现这个答案 https://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib.
看起来,为了得到你(和我)想要的东西,你需要结合plt.ion()
, plt.show()
(不与block=False
),最重要的是,plt.pause(.001)
(或者任何你想要的时间)。这pause http://nullege.com/codes/search/matplotlib.pyplot.pause之所以需要,是因为 GUI 事件在主代码休眠时发生,包括绘图。这有可能是通过从睡眠线程中获取时间来实现的,所以也许 IDE 会搞乱这一点——我不知道。
这是一个在 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)