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