Matplotlib pyplot show()一旦关闭就不起作用

时间:2011-03-01 18:02:33

标签: python matplotlib

我有这样的循环

#!/usr/bin/env python
import matplotlib.pyplot as p

for i in xrange(N):
    # Create my_image here

    # Display this image
    p.figure()
    p.imshow(my_image)
    p.show()
    p.close()

当i = 0时,此工作正常。为了让程序继续,我需要关闭pyplot创建的新数字。对于所有其他循环迭代(i> 0),不创建另一个新图,不呈现图并且程序仅继续。为什么关闭一个让pyplot无法打开新数据的数字(如MATLAB)?

我期望的行为是:

  1. 执行在p.show()
  2. 处停止
  3. 当我关闭图时,继续执行
  4. 再次遇到p.show()时,将显示新图像。
  5. 重复步骤2,直到没有更多的情节显示

5 个答案:

答案 0 :(得分:5)

可能有一种更好的方式来动画imshow's,但这应该在一个紧要关头。它是animation example from the docs的轻微修改版本。

# For detailed comments on animation and the techniqes used here, see
# the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations

import matplotlib
matplotlib.use('TkAgg')

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.cm as cm

import sys
import numpy as np
import time

ax = plt.subplot(111)
canvas = ax.figure.canvas

delta=0.025
x=y= np.arange(-3.0, 3.0, delta)
x,y=np.meshgrid(x, y)
z1=mlab.bivariate_normal(x, y, 1.0, 1.0, 0.0, 0.0)
z2=mlab.bivariate_normal(x, y, 1.5, 0.5, 1, 1)
z=z2-z1  # difference of Gaussians

def run(z):
    fig=plt.gcf()
    for i in range(10):
        plt.imshow(z, interpolation='bilinear', cmap=cm.gray,
                  origin='lower', extent=[-3,3,-3,3])
        canvas.draw()
        plt.clf()
        z**=2

manager = plt.get_current_fig_manager()
manager.window.after(100, run, z)
plt.show()

答案 1 :(得分:3)

它可能来自先前版本的matplotlib中的错误。当我发出顺序show()命令时,我遇到了类似的问题 - 只有第一个显示(并保持);但是,当我将matplotlib更新为1.0.1时,问题就消失了。

答案 2 :(得分:0)

在修补了unutbu的例子之后,我发现了一种我可以正常使用PyDev调试的行为,我可以逐步查看这些图。

import time, threading
import numpy
from matplotlib.pyplot import *

x = numpy.linspace(0, 10)
y = x**2

def main():
    plot(x, x)
    draw()
    time.sleep(2)
    plot(x, y)
    draw()

thread = threading.Thread()
thread.run = main

manager = get_current_fig_manager()
manager.window.after(100, thread.start)
figure(1)
show()

答案 3 :(得分:0)

我一直在研究这个问题,虽然我还没有彻底测试过,但我可能有一个解决方案。

关键在于编写更像MatLab的代码,为你的数字命名,然后将它们称为show()。

例如

 from matplotlib import pyplot as plt

 fig1 = plt.figure()
 fig2 = plt.figure()

 fig1.show()
 fig2.show()

这可能适用于动画和不同阶段的绘图

答案 4 :(得分:0)

仅设置

import matplotlib.pyplot as plt

如果你也设置了:

import matplotlib
matplotlib.use('Agg')

这是在整个应用程序上进行交互。 并在我的情况下导致这个 Issue