如何遍历引用matplotlib图形的字典
我有一些函数,每个函数都会创建一个或多个图形。当这些图形被创建时,我会在一个字典里添加一个引用,像这样:
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,没法测试这个。