2011-03-01 133 views
6

我有这样Matplotlib pyplot秀()不工作,一旦关闭

#!/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. 当p.show()再次,遇到的显示新图像。
  4. 重复步骤2,直到没有更多的情节展现
+0

我能为N> = 2创建顺序图。你在用什么IDE(如果你使用的是)?在我得到下一个之前,我必须手动关闭这个图,所以在这个例子中'p.close()'是毫无意义的。 – Paul 2011-03-01 18:38:55

+0

我使用PyCharm编写脚本并运行它。我注意到,这个问题似乎只发生在运行脚本而不是ipython -pylab – 2011-03-01 19:29:16

回答

3

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

+0

我更新为Matplotlib SVN,问题消失。我想这是一个错误。 – 2011-03-01 23:18:05

+2

这是1.0版本的新特性。1: 长期以来的要求是支持多次调用show()。这很困难,因为跨操作系统,用户界面工具包和版本很难获得一致的行为。 Eric Firing在整理后端合理化表演方面做了大量工作,希望展示所有新创建的数据并阻止执行,直到他们关闭为止。重复呼叫显示应该提出自上次呼叫以来新创建的数字... – wim 2011-06-02 05:22:06

5

有可能是一个更好的办法来制作动画imshow的,但这应该在紧要关头。这是一个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

您的解决方案非常适合动画。但是我想要的不是动画,我只是想要一个类似MATLAB的简单行为,我可以在算法运行时查看某个图像/矩阵。 – 2011-03-01 19:34:47

+0

@Dat Chu:我不知道MATLAB的行为。 – unutbu 2011-03-01 19:38:37

+0

@Dat Chu:你需要在剧情显示时代码执行暂停吗? – Paul 2011-03-01 19:45:34

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() 
+0

请注意,如果您有多个数字,我建议您在显示()数字窗口之前“预先分配”它们。否则,任何新的数字窗口似乎都只限于调用线程。 – eacousineau 2011-07-28 19:43:05

+0

不要紧,这似乎是一个'不在主循环'错误... – eacousineau 2011-07-28 19:45:52

0

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

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

例如。

from matplotlib import pyplot as plt 

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

fig1.show() 
fig2.show() 

这可能适用于动画和绘制在不同阶段