我有问题,试图使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()
PS.我忘了说,我想更新现有的窗口,每次我绘制一些东西,而不是创建一个新的。
我花了很长时间寻找解决方案,找到了这个答案。
看起来,为了得到你(和我)想要的东西,你需要plt.ion(), plt.show()(不带block=False)和最重要的plt.pause(.001)(或任何你想要的时间)的组合。之所以需要暂停,是因为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()
很多答案都被夸大了,据我所知,答案并不难理解。
如果您愿意,可以使用plt.ion(),但我发现使用plt.draw()同样有效
对于我的特定项目,我正在绘制图像,但你可以使用plot()或scatter()或其他东西来代替figimage(),这没有关系。
plt.figimage(image_to_show)
plt.draw()
plt.pause(0.001)
Or
fig = plt.figure()
...
fig.figimage(image_to_show)
fig.canvas.draw()
plt.pause(0.001)
如果你用的是实际数字。
我使用@krs013和@默认图片的答案来计算这个
希望这能让人们不必在单独的线程上发布每个人物,或者不必为了弄清楚这个问题而阅读这些小说
我花了很长时间寻找解决方案,找到了这个答案。
看起来,为了得到你(和我)想要的东西,你需要plt.ion(), plt.show()(不带block=False)和最重要的plt.pause(.001)(或任何你想要的时间)的组合。之所以需要暂停,是因为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()
Iggy的答案对我来说是最容易理解的,但当我做一个后续的subplot命令时,我得到了以下错误,当时我只是在做show:
MatplotlibDeprecationWarning:使用相同的参数添加轴
作为前一个轴当前重用较早的实例。在未来
版本时,总会创建并返回一个新实例。
同时,此警告可以被抑制,并对未来的行为进行抑制
通过向每个axis实例传递唯一的标签来确保。
为了避免这种错误,它有助于关闭(或清除)绘图后,用户按下回车键。
下面是对我有用的代码:
def plt_show():
'''Text-blocking version of plt.show()
Use this instead of plt.show()'''
plt.draw()
plt.pause(0.001)
input("Press enter to continue...")
plt.close()