Matplotlib pyplot show () не работает после закрытия - PullRequest
6 голосов
/ 01 марта 2011

У меня есть такая петля

#!/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()

Это прекрасно работает, когда я = 0. Для продолжения программы мне нужно закрыть новую фигуру, созданную pyplot. Для всех других итераций цикла (i> 0) другая новая фигура не создается, график не отображается, и программа просто движется дальше. Почему закрытие фигуры делает пиплот неспособным открыть новый (например, MATLAB)?

Я ожидаю, что поведение:

  1. Исполнение останавливается на p.show ()
  2. Когда я закрываю фигуру, выполнение продолжается
  3. Когда p.show () встречается снова, отображается новое изображение.
  4. Повторяйте шаг 2 до тех пор, пока на графике больше не останется

Ответы [ 4 ]

5 голосов
/ 01 марта 2011

Возможно, есть лучший способ оживить imshow, но это должно работать в крайнем случае. Это слегка измененная версия примера анимации из документации .

# 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()
3 голосов
/ 01 марта 2011

Это может быть из-за ошибки в предыдущих версиях matplotlib.У меня была похожая проблема, когда я выполнял последовательные show() команды - только первая показала (и осталась);но когда я обновил matplotlib до 1.0.1, проблема исчезла.

0 голосов
/ 28 ноября 2011

Я давно изучаю эту проблему, и у меня может быть решение, хотя я еще не проверил его полностью.

Ключ в написании кода, более похожего на MatLab, назовите свои цифры и затем вызовите их, чтобы показать ().

например.

 from matplotlib import pyplot as plt

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

 fig1.show()
 fig2.show()

Это может работать для анимации и построения графиков на разных этапах

0 голосов
/ 28 июля 2011

После работы с примером 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...