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

Dat*_*Chu 6 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()
Run Code Online (Sandbox Code Playgroud)

当i = 0时,这很好用.为了让程序继续,我需要关闭pyplot创建的新数字.对于所有其他循环迭代(i> 0),不会创建另一个新图形,不会显示图形,程序只会继续运行.为什么关闭一个让pyplot无法打开新数据的数字(如MATLAB)?

我期望的行为是:

  1. 执行在p.show()处停止
  2. 当我关闭图时,继续执行
  3. 再次遇到p.show()时,将显示新图像.
  4. 重复步骤2,直到不再显示绘图

unu*_*tbu 5

可能有更好的方法来动画imshow's,但这应该在一个紧要关头.它是文档中动画示例的轻微修改版本.

# 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()
Run Code Online (Sandbox Code Playgroud)


And*_*our 3

这可能是由于以前版本的 matplotlib 中的错误造成的。当我发出顺序show()命令时,我遇到了类似的问题——只有第一个命令会显示(并保留);但是,当我将 matplotlib 更新到 1.0.1 时,问题就消失了。

  • 这是 1.0.1 版本的“新增内容”: 一个长期存在的请求是支持对 show() 的多次调用。这很困难,因为很难在操作系统、用户界面工具包和版本之间获得一致的行为。Eric Firing 在跨后端合理化显示方面做了很多工作,其期望的行为是使显示提升所有新创建的数字并阻止执行直到它们关闭。重复调用 show 应该会产生自上次调用以来新创建的数字...... (2认同)