优雅地退出matplotlib.pyplot动画

2 投票
1 回答
3405 浏览
提问于 2025-04-15 16:01

我有一个脚本,用来绘制一些光度测量的图形,我想把它们画成一个xy坐标图。我正在使用python 2.5中的matplotlib.pyplot库。

输入的数据存储在大约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

如果你在一个循环里更新数据并进行绘图,你应该能够中断这个过程。下面是一个例子(这个例子画了一个静止的圆,然后让一条线在圆的边缘移动):

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系统),其实并不需要这个命令。

撰写回答