Выход из анимации matplotlib.pyplot изящно - PullRequest
2 голосов
/ 14 ноября 2009

У меня есть скрипт, который отображает данные некоторых апертур фотометрии, и я хочу построить их на графике xy. Я использую matplotlib.pyplot с python 2.5.

Входные данные хранятся в 500 файлах и читаются. Я знаю, что это не самый эффективный способ ввода данных, но это еще одна проблема ...

Пример кода:

import matplotlib.pyplot as plt

xcoords = []
ycoords = []

# lists are populated with data from first file

pltline, = plt.plot(xcoords, ycoords, 'rx')

# then loop populating the data from each file

for file in filelist:
    xcoords = [...]
    ycoords = [...]

pltline.set_xdata(xcoords)
pltline.set_ydata(ycoords)
plt.draw()

Поскольку существует более 500 файлов, я иногда захочу закрыть окно анимации в середине графика. Мой код для построения графика работает, но он не выходит очень изящно. Окно графика не реагирует на нажатие кнопки закрытия, и мне приходится Ctrl+C из него.

Может ли кто-нибудь помочь мне найти способ закрыть окно анимации во время работы скрипта, пока он выглядит изящным (гораздо более изящным, чем ряд ошибок трассировки Python)?

1 Ответ

2 голосов
/ 15 ноября 2009

Если вы обновите данные и проведете отрисовку в цикле, вы сможете прервать их. Вот пример (который рисует неподвижный круг, а затем перемещает линию по периметру):

from pylab import *
import time

data = []   # make the data
for i in range(1000):
    a = .01*pi*i+.0007
    m = -1./tan(a)
    x = arange(-3, 3, .1)
    y = m*x
    data.append((clip(x+cos(a), -3, 3),clip(y+sin(a), -3, 3)))


for x, y in data:  # make a dynamic plot from the data
    try:
        plotdata.set_data(x, y)
    except NameError:
        ion()
        fig = figure()
        plot(cos(arange(0, 2.21*pi, .2)), sin(arange(0, 2.21*pi, .2)))
        plotdata = plot(x, y)[0]
        xlim(-2, 2)
        ylim(-2, 2)
    draw()
    time.sleep(.01)

Я ввел команду time.sleep(.01), чтобы быть уверенным, что смогу прервать выполнение, но в моих тестах (под управлением Linux) это не было необходимо.

...