如何遍历引用matplotlib图形的字典

2 投票
3 回答
4333 浏览
提问于 2025-04-16 17:24

我有一些函数,每个函数都会创建一个或多个图形。当这些图形被创建时,我会在一个字典里添加一个引用,像这样:

self.figures['figureKey'] = figure()

在另一个函数中,我想遍历这个字典并保存每个图形;如果能把字典的键作为文件名的一部分或全部,那就太好了。我已经能够遍历这个字典,但figure()函数似乎需要一个对应图形编号的整数,而不是字典键给出的引用。

    for fig in self.figures:
        figure(self.figures[fig])  #does not work
        figure(fig)                #also does not work
        savefig(fig)               #seems to let me use the key as a filename--nice

我也尝试过使用`get_fignums()`并遍历返回的数组,但这样就失去了与键名的关联。也许可以从图形指针中获取图形编号?有没有人有好的方法呢?

请不要用“你为什么不直接...”这样的开头来回答。因为对我来说,这并不是一个明显的做法。我对这些还比较陌生。

3 个回答

2

我可能有些理解错了(我其实不太使用matplotlib),但你是不是把图形对象本身存储在字典里了?如果是这样的话,你可以用 for key, value in self.figures.items() 来同时遍历字典的键和值,然后通过 number 属性来获取图形的编号。

作为测试,我在交互式解释器中尝试了以下代码:

>>> import matplotlib.pyplot as plt
>>> figures = {}
>>> figures['name1'] = plt.figure()
>>> plt.plot([1, 2, 3])
>>> figures['name2'] = plt.figure()
>>> plt.plot([6, 5, 4])
>>> for key, figure in figures.items():
...     print 'Saving figure #%d as %s.' % (figure.number, key)
...     plt.figure(figure.number)
...     plt.savefig(key)
...
Saving figure #2 as name2
Saving figure #1 as name1

结果看起来是成功的:两个图(一个是单调递增的,一个是单调递减的)被保存为当前目录下的PNG文件,分别叫做name1.png和name2.png。

3

也许我对你在做什么有点困惑……如果你只是想保存图形,为什么不直接用fig对象的savefig方法呢?

pyplot.savefig是保存当前正在使用的图形,但如果你用某个特定图形实例的fig.savefig方法,就可以保存那个特定的图形,不管现在哪个图形是活跃的。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

figures = [plt.figure() for _ in range(10)]

for i, fig in enumerate(figures):
    ax = fig.add_subplot(111)
    ax.plot(x, i*x)
    ax.axis('equal')

for i, fig in enumerate(figures):
    fig.savefig('temp_slope_%02i.png' % i)
1

你可以从图形实例中获取图形的编号。根据文档

返回的图形对象有一个编号属性,用来保存这个编号。

所以,如果你想通过编号来访问一个图形,可以这样做:

figure(self.figures[fig].number)

不过我现在没有安装matplotlib,没法测试这个。

撰写回答