将轮廓从一个轴实例复制到另一个轴实例

时间:2013-01-17 17:22:52

标签: python matplotlib

我有一种情况,我使用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,并填充完整的域。

test1.png

另外两个(test2.png,test3.png)以不同的方式出现。它们的轴范围从0到1,轮廓区域仅填充从0.0到大约7.9的区域。

test2.png

通过ax2.set_xlim(0,25)ax2.set_xlim(0,25)重置轴限制会更改轴范围,但无法解决较大的问题。

test3.png

是否有人想过如何解决此问题或其他方法以不同的方式重用contourf()的结果?

1 个答案:

答案 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()