2017-04-14 226 views
2

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

例如我知道我可以做

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秒),但会阻挡我的整个用户界面(例如,我甚至无法移动窗口),不会显示轴(我只能看到数字窗口),并且会自动关闭所有数字的循环。

,我不是在寻找第三个选项是该

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位于顶部,我想回到图1,同时生成图4。

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

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

+0

你使用的是什么版本的Python? – Astrom

+0

是否要从交互式Python会话或命令行运行代码? –

+0

@Astrom Python 2.7.13,Matplotlib 2.0.0(更新了原来的问题) – dkv

回答

1

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

+0

这几乎是我正在寻找的东西,但它仍然阻塞(或者可能只是冻结)UI,以便在执行'arr = thisFunctionTakesTenSecondsToGenerateMyArray()'的10秒内我无法做任何事情。例如如果我将第一个窗口移动10秒,它实际上会将第二个窗口放在新位置,并将第一个窗口保留在原来的位置。 此外,它只适用于运行整个脚本(即从命令行)而不是从Python控制台运行。 – dkv

+0

好吧,现在我有点困惑。你想做动画吗,还是你需要绘制脚本来在脚本运行时以交互方式修改它们?如果没有,那么就让脚本完成,你将分开所有的地块进行调整。如果你只需要所有的绘图,你可以保存每个图形,因为它们是生成的'plt.savefig()',然后你可以在图像查看器中查看。 当程序运行你不能真正对其进行修改。如果您需要出于某种原因在同一个交互式会话检查出来的'subprocess'模块https://docs.python.org/2/library/subprocess.html操作 –

+0

我只想数字,只要他们弹出这样我就不必等待所有人在我做任何事之前完成绘图。例如,我可能会意识到的东西是由二号人物出现的时间脚麻可以杀死循环,这样我就不必浪费时间等待其他8个数据来完成。你的建议让我有些那里的方式,但我也想四处移动图形窗口的能力,而脚本运行。这是Matlab的如何表现出的即装即用,以及他们可能做一些多进程魔法,你在这种情况下,建议 – dkv

相关问题