一次绘制一个图形而不关闭旧图形(matplotlib)

Posted

技术标签:

【中文标题】一次绘制一个图形而不关闭旧图形(matplotlib)【英文标题】:Plot one figure at a time without closing old figure (matplotlib) 【发布时间】:2017-04-14 22:36:53 【问题描述】:

有没有办法一次绘制一组图形而不关闭前一个图形,保持对 UI 的控制,并在最后保持图形打开?也许使用更合适的后端,或者使用 OO 样式而不是下面使用的 pyplot/pylab 样式编写它?

例如我知道我能做到

plt.ioff()
for i in range(10)
    plt.figure()
    arr = thisFunctionTakesTenSecondsToGenerateMyArray()
    plt.plot(arr)
    plt.show()

这将等待我在每次迭代时关闭图形

我也可以

plt.ion()
for i in range(10)
    plt.figure()
    arr = thisFunctionTakesTenSecondsToGenerateMyArray()
    plt.plot(arr)

它将尽可能快地绘制它们(例如 10 秒),但会阻塞我的整个 UI(例如,我什至无法移动窗口),不会显示轴(我只看到图窗口),并且在循环结束时也会自动关闭所有图形。

我不想要的第三个选项是这个

plt.ioff()
for i in range(10)
    plt.figure()
    arr = thisFunctionTakesTenSecondsToGenerateMyArray()
    plt.plot(arr)
plt.show()

这需要等待 100 秒才能在我的屏幕上看到任何内容。

我正在寻找类似于 Matlab 的行为,我可以做到

for i = 1:10
    figure()
    arr = thisFunctionTakesTenSecondsToGenerateMyArray()
    plot(arr)
    drawnow

它将每 10 秒绘制一个图形,并且还允许我移动窗口,例如如果图 3 在顶部,我想在生成图 4 时返回图 1。

编辑: 使用 Python 2.7.13、Matplotlib 2.0.0。在 Windows 7 SP1 上使用 Spyder 3.1.3 运行它——我尝试在内置的 IPython 控制台、香草 Python 控制台和脚本中运行它,结果都相同。

理想情况下,我希望能够通过脚本和交互方式运行它,即通过执行脚本或复制粘贴到控制台。

【问题讨论】:

你用的是什么版本的python? 你想从交互式python会话还是从命令行运行代码? @Astrom Python 2.7.13,Matplotlib 2.0.0(更新了原问题) @ab-user216125 理想情况下,两者都有,但我会为其中任何一个提供解决方案。 【参考方案1】:

只需在plt.show(block=False) 之后的循环内添加plt.pause(0.0001),并在最后添加plt.show(),以防您从操作系统命令行执行脚本。

【讨论】:

这几乎就是我要找的东西,但它仍然会阻塞(或者可能只是冻结)UI,因此我在 arr = thisFunctionTakesTenSecondsToGenerateMyArray() 执行的 10 秒内无法做任何事情。例如如果我在这 10 秒内移动第一个窗口,它实际上会将第二个窗口放置在新位置,并将第一个窗口保持在原来的位置。此外,它仅在我运行整个脚本(即从命令行)而不是从 Python 控制台运行时才有效。 好的,现在我有点困惑。您是想做动画,还是需要在脚本运行时进行绘图以交互修改它们?如果没有,那么只需让脚本完成,您将分别拥有所有绘图以进行调整。如果您只需要所有图,则可以在生成时保存每个图plt.savefig(),然后您可以在图像查看器中查看。程序运行时,您实际上无法修改它。如果您出于某种原因需要在同一个交互式会话中进行操作,请查看 subprocess 模块 docs.python.org/2/library/subprocess.html 我只希望这些数字在生成后立即弹出,这样我就不必等到所有这些都完成绘图后才能执行任何操作。例如,我可能会在第二个数字出现时意识到出现问题并且可以终止循环,因此我不必浪费时间等待其他 8 个数字完成。你的建议让我有一些方法,但我也希望能够在脚本运行时移动图形窗口。这就是 Matlab 开箱即用的行为方式,他们可能正在按照您的建议执行一些多进程魔法 在这种情况下,检查绘图的最快方法是保存它而不是让它在屏幕上绘图。我现在还没有检查,但你可以计时。如果您对单个图没问题,您甚至可以编写一个条件来停止并继续计算。如果您需要在代码运行时使用 python 会话,只需打开另一个终端和 python 会话。或者将您的代码放在脚本中并从命令行运行,最后使用&,这使得linux终端免费

以上是关于一次绘制一个图形而不关闭旧图形(matplotlib)的主要内容,如果未能解决你的问题,请参考以下文章

保存 Matlab 图形而不绘制它,然后以可见状态打开它

数据分析之matplotlib篇

数据分析之matplotlib篇

matplot绘图

显示图形而不使用 pydot 保存

带有图形绘制的股票市场(PHP Jquery 或任何)[关闭]