我正在编写一个带有散布的绘图和计算的 python 脚本。我对 matplotlib 的行为,特别是plt.pause. 考虑以下片段:
import matplotlib.pyplot as plt
import time
fig,ax=plt.subplots()
ax.plot([1,2])
fig.show()
time.sleep(5) #This is a substitute for real computations
Run Code Online (Sandbox Code Playgroud)
-> 五秒钟内没有任何反应
import matplotlib.pyplot as plt
import time
fig,ax=plt.subplots()
ax.plot([1,2])
plt.pause(0.1)
fig.show()
time.sleep(5) #This is a substitute for real computations
Run Code Online (Sandbox Code Playgroud)
-> 窗口显示所需的绘图五秒钟
看来看什么都需要plt.pause。那么为什么文档会说“此功能是实验性的;其行为可能会在未来版本中更改或扩展。” 为什么我plt.pause在任何教程中都没有看到?
另外,为什么这么重要的功能会设计得如此奇怪,以至于用户必须输入足够小的时间,但又不能为零?我知道有些人实际上想暂停执行,但我不想,我只是想看看情节。这有那么不寻常吗?
顺便说一句,我注意到我也可以这样做plt.show(),由于我不知道的原因,它的行为与plt.gcf().show()[= fig.show] 不同,并且会阻止执行,直到用户关闭窗口。虽然这确实在我想要的时候显示了绘图,但我不希望执行停止,并且我希望用户在后续计算期间继续看到绘图。使用plt.show(block=False)DOES 似乎表现得像plt.gcf().show()[= fig.show()],所以它也是无用的。
此外,我读过一些plt.ion应该有帮助的地方,但没有帮助。在上面的代码片段中添加plt.ion()beforefig,ax=plt.subplots()不会改变任何内容。
最后,我听说不同的后端可能有不同的行为。我在 Ubuntu 18 上使用 python 3.6 (anaconda) 和 matplotlib 2.2.2。如果我import matplotlib; matplotlib.use('Qt5Agg')在片段的开头添加,则不会有太大变化,但第一个片段不会在五秒钟内显示任何内容,而是会显示一个垃圾窗口五秒钟(该窗口显示屏幕上弹出位置处显示的所有内容) 。
暂停间隔秒。
如果有活动图形,它将在暂停之前更新并显示,并且 GUI 事件循环(如果有)将在暂停期间运行。
这可用于原始动画。对于更复杂的动画,请参阅 matplotlib.animation。
因此,pause意志实际上是draw数字。
“必需”的关键plt.pause在于它启动模型事件循环,以便它有时间至少运行一次并完整地生成图形。之后您的代码可以继续。当代码运行时,不会处理进一步的事件。因此,该人物可能会显得没有反应。这意味着您应该pause在之后重复调用,以免窗口冻结。通过这种方式,您可以模拟事件循环,同时仍然能够在其间运行其他代码。
plt.pause()本示例中提到了,它执行上述操作。
fig.show()不运行事件循环。因此,如果没有正在运行的事件循环,并且没有pause它,则只会显示图形窗口;但如果您不给任何时间来处理任何事件,它将立即冻结。在这里您可能会遇到操作系统和后端之间的差异。也许您只看到窗口边框,中间没有绘制任何内容,或者您可能会看到工具栏和白色表面。
一般来说,所有这一切的关键是理解 python(像其他编程语言一样)线性处理代码。运行一个事件循环(意味着一个响应式 GUI 窗口)和并行执行一些其他代码的愿望与这一原则相矛盾。避免这种情况的通常方法是在不同的线程中运行任何其他代码。但是,matplotlib 无法知道那是什么代码以及如何将其同步到主线程。因此,这样的解决方案需要用户来实现。
| 归档时间: |
|
| 查看次数: |
4916 次 |
| 最近记录: |