Python 使用Matplotlib回收地物

Python 使用Matplotlib回收地物,python,matplotlib,copy,Python,Matplotlib,Copy,我需要在同一画布上表示多个数据集,然后将每个数据集保存为一个图形。原始画布是一个包含一个带有多个轴和子图的Matplotlib图形的对象 为了避免在每个数据集绘图上反复创建此画布,我想以某种方式回收它。我的意思是,把它记在记忆里,我想什么时候就什么时候取 我使用copy.copy()函数尝试了这一点,但它不起作用,因为在同一个图形中,所有绘图最终都会相互重叠 这里我添加了一个最小可重复代码(MRE),以便更好地理解。画布示例图是通过修改生成的 从输出图中可以看出,不同的数据集共存于同一个图中(即

我需要在同一画布上表示多个数据集,然后将每个数据集保存为一个图形。原始画布是一个包含一个带有多个轴和子图的Matplotlib图形的对象

为了避免在每个数据集绘图上反复创建此画布,我想以某种方式回收它。我的意思是,把它记在记忆里,我想什么时候就什么时候取

我使用
copy.copy()
函数尝试了这一点,但它不起作用,因为在同一个图形中,所有绘图最终都会相互重叠

这里我添加了一个最小可重复代码(MRE),以便更好地理解。画布示例图是通过修改生成的

从输出图中可以看出,不同的数据集共存于同一个图中(即,
copy()
函数不起作用),而每个数据集应有一个图

我也尝试了
copy.deepcopy()
,但下一个错误不断出现:

NotImplementedError:无法复制TransformNode实例。考虑使用FROZEN()代替.< /P> 由于每个绘图的画布创建持续了程序执行的20%,我认为有必要回收图表。有人知道如何实现这一点吗


提前谢谢

只需使用删除方法删除您不想要的艺术家:


将matplotlib.pyplot作为plt导入
类图:
定义初始化(自身,ax):
斧头,策划我复杂的事情
图,ax=plt.子批次()
D=图表(ax)
对于数据集中的i:
艺术家=[]
艺术家=ax.plot(数据集)
艺术家+=[艺术家]
艺术家=最大散点(数据集)
艺术家+=[艺术家]
#等
fig.savefig(f'figure{i}.png')
艺术家中的艺术家:
删除艺术家()

为什么您实际上需要回收图形,而不仅仅是创建一个新图形?你想解决什么问题?如果你有一个函数可以为每个数据集创建一个新的图形,我怀疑它是最干净的解决方案。另一种选择是保持相同的图形,只需清除轴(ax.cla()),然后在其上绘制新的数据集。我需要它,因为可能有大量数据集,并且需要花费大量时间再次创建图形。我尝试过使用ax.cla(),但是包含图表的所有轴也被删除。我想做的是将图表保留在内存中,并在任何时候返回到它,而不必再次创建它。谢谢你的建议@Jody Klymak,我会尝试一下,我正在寻找一种创建独特图表对象的方法,这样我就可以以迭代的方式查找我想要的信息。我不确定这意味着什么。也许你应该用实际的可运行代码来澄清最初的问题。好的,我想我会这样做,再次感谢@Jody KlymakI已经更新了我的问题@Jody Klymak。我想现在更清楚了。我上面的建议仍然是正确的。我不知道你想复制任何东西-我不知道那应该做什么…
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import copy

class Canvas:
    '''Figure example to recycle'''
    def __init__(self):
        fig, ax = plt.subplots(figsize=(6, 6))
        circle = plt.Circle((0.5, 0.5), 1, facecolor='none', edgecolor='black', linewidth=3)
        ax.add_patch(circle)
        im = plt.imshow(np.random.random((100, 100)), cmap=plt.cm.plasma,
                        extent=([-0.5,1.5,-0.5,1.5]), alpha=0.6)
        im.set_clip_path(circle)
        self.fig, self.ax = fig, ax

class Plot:
    '''Create a DataFrame and represent its info within a figure'''
    
    def __init__(self):
        '''x and y dataframes for xy coordinates'''
        self.x = pd.DataFrame(dict(A=np.random.random(50), B=np.random.random(50), C=np.random.random(50),
                              D=np.random.random(50)), index=np.arange(50))
        self.y = pd.DataFrame(dict(A=np.random.random(50), B=np.random.random(50), C=np.random.random(50),
                              D=np.random.random(50)), index=np.arange(50))
        self.Graph = Canvas()
        self.fig, self.ax = self.Graph.fig, self.Graph.ax
                              
    def draw(self):
        '''Plot each column of both dataframes (x and y) into the figure'''
        for i,j in zip(self.x.columns, self.y.columns):
            copy_Graph = copy.copy(self.Graph)                    
            fig, ax = copy_Graph.fig, copy_Graph.ax
            ax.scatter(self.x[i], self.y[j])
            ax.axis('off')
            fig.savefig('{}.png'.format(i))

A = Plot()
A.draw()