我有一种情况,我使用matplotlib生成超过20个不同的图像。这已经做了很多次。 20个图像中的每一个在背景中具有相同的轮廓集。为了减少处理时间,能够将countourf()
的结果从一个Axes
实例复制到另一个实例是有用的。为了做到这一点,我试过这个:
#!/bin/env python
import os
import numpy as np
from matplotlib import pyplot as plt
def copycontours():
#Create figures
fig1 = plt.figure()
fig2 = plt.figure()
fig3 = plt.figure()
#Create axes
ax1 = fig1.add_axes((0.05,0.05,0.90,0.90))
ax2 = fig2.add_axes((0.05,0.05,0.90,0.90))
ax3 = fig3.add_axes((0.05,0.05,0.90,0.90))
#Create random data
data = np.random.normal(25, size=(25,25))
#Add contours to first axes instance and save image
contours = ax1.contourf(data)
fig1.savefig('test.png')
#Add contours to second axes instance from first axes instance
for collection in ax1.collections:
ax2.add_collection(collection)
fig2.savefig('test2.png')
#Add contours to third axes instance from
for collection in contours.collections:
ax3.add_collection(collection)
fig3.savefig('test3.png')
os.system('display test.png &')
os.system('display test2.png &')
os.system('display test3.png &')
if __name__ == '__main__':
copycontours()
第一个数字(test.png)看起来是正确的。轴的范围为0到25,并填充完整的域。
另外两个(test2.png,test3.png)以不同的方式出现。它们的轴范围从0到1,轮廓区域仅填充从0.0到大约7.9的区域。
通过ax2.set_xlim(0,25)
和ax2.set_xlim(0,25)
重置轴限制会更改轴范围,但无法解决较大的问题。
是否有人想过如何解决此问题或其他方法以不同的方式重用contourf()
的结果?
答案 0 :(得分:2)
解决这个问题的一个侧面方法是重新使用具有轮廓的轴(因为看起来你正在保存每个图形而不是以交互方式查看它)。
ax = fig.add_axes()
ax.contourf(..)
keep_lst = ax.get_children()[:] # state of the figure before adding anything extra
for plot_pram in conditions:
# your plotting code
fig.savefig()
cur_children = ax.get_children()[:]
# all the extra stuff you just plotted on it
for a in cur_children:
if a not in keep_lst:
# if the artist isn't part of the initial set up, remove it
a.remove()