我希望所有的pyplot窗口保持活动状态,直到代码本身终止,但没有阻塞。 现在,我要么必须使用
plt.show()
并等到我关闭它然后继续前进。
或使用
plt.draw()
plt.pause(0.05)
需要暂停,如果没有它,由于一些奇怪的原因,窗口永远不会被绘制。在这种情况下,窗口在暂停时间后冻结(通过将其设置为更长时间来检查)
我想要的是类似matlab的行为,其中代码将继续执行脚本直到脚本结束(它将等待用户按Enter键)。 点击进入后,一切都应该关闭,就像plt.close('所有'),但我希望窗口保持活动状态,即 - 调整大小,保存,如果请求并且有数据光标 - 就像matlab图一样,无需关闭所有窗口。
一个完整的例子来说明我的问题:
from matplotlib import pyplot as plt
from matplotlib import image as mpimg
img = mpimg.imread("/path/to/image.jpg")
plt.imshow(img)
plt.draw()
plt.pause(05.05) #window works like it should, but execution of rest of the code is frozen
input("hit enter") #the window is dead at this point
plt.close('all')
我已经看到了这样做的建议(source):
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os
def detach_display():
mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100)
plt.plot(x, mlab.normpdf(x, mu, sigma))
plt.show()
if os.fork():
# Parent
pass
else:
# Child
detach_display()
它被提到是特定于Linux的,但是因为我运行linux机器不是问题,但是我不明白这里到底发生了什么并且不知道当我发生什么时会发生什么在代码执行中多次使用它。
等待情节直到结束不是一个真正的选择,因为第一个和最后一个之间的时间可用时间相当长,我更愿意早期看到所选数据给出的结果不好,而不是运行所有处理到找到它。
答案 0 :(得分:1)
原则上,您可以在显示绘图后使用plt.show(block=False)
继续执行代码。您可能希望定期更新绘图,使其保持活动状态 - 这是通过plt.pause(t)
完成的,其中t
可能非常短(0.000001
)或相对较长({{1} })。
1
因为这个想法可能只是让一些模拟在后台运行,并且只在图中偶尔显示一些中间结果;并且由于您不希望让绘图干扰模拟,您可以使用import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,1000)
y = np.zeros_like(x)
fig, ax = plt.subplots()
line, = ax.plot(x,y)
plt.show(block=False)
for i in range(15):
y += np.random.randn(1000)
y -= y.min()
line.set_data(x,y)
ax.set_ylim(y.min(), y.max())
plt.pause(1)
line.set_data(x,y)
print("Simulation finished")
plt.show()
。在主线程中,你有一个带有事件循环的图和一个偶尔绘制结果的循环。在另一个线程中,您可以进行模拟。
threading