3

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

测试1.png

其他两个(test2.png,test3.png)的结果不同。它们的轴范围从 0 到 1,等高线区域仅填充从 0.0 到大约 7.9 的区域。

测试2.png

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

测试3.png

有没有人想过如何解决这个问题或以其他方式重用结果的另一种contourf()方法?

4

1 回答 1

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()
于 2013-01-18T00:20:41.570 回答