我用matplotlib创建了一个Line2D对象数组,我想在各种绘图中使用这些对象。但是,在多个绘图中使用同一个艺术家不起作用,因为我得到:
RuntimeError: Can not put single artist in more than one figure
我发现,艺术家一旦依附于一个轴心,就不能再依附于另一个轴心。
我的想法是简单地用copy()复制包含行的数组,但它不起作用。复制的数组仍然引用相同的对象。我想,那是因为你根本不能模仿艺术家(?)。在
有什么方法可以避免重新计算行2ds而只需计算一次?在
Tags:
我非常希望在
matplotlibs
的Artist Class中有一个copy
方法!在也许,有人想把下面的代码改编成
Artist Class
,以便有一种transfer
方法,将一个Artist
对象复制到另一个对象中。在走错了路
对包
copy
中的对象使用标准的copy
或deepcopy
函数不起作用。在例如,编写脚本是没有用的:
解决方案:
因此,我发现复制
Artist
对象的唯一方法是创建一个所需类型的空对象,然后通过循环将所有必需的属性从原始对象传输到新创建的对象。在将属性值从一个对象传递到另一个对象的工具是我定义的函数:
^{pr2}$在这个函数中,最重要的参数是
attr_list
。这是我们要从obj1
复制到obj2
的属性的名称列表,例如,对于一个对象Artist.Line2D
,它可以是attr_list = ('xdata', 'ydata', 'animated', 'antialiased', 'color', 'dash_capstyle', 'dash_joinstyle', 'drawstyle')
由于任何
Artist
对象具有不同的属性,因此此传输过程中的关键在于生成属性名称列表,其中包含要传输的正确属性。在有两种方法可以生成属性名称列表:
第一个选项:我们指定要选择的属性。也就是说,我们硬编码一个包含我们要传输的所有属性的列表。这比第二种选择更为艰难。我们必须为每种类型的对象完全指定属性:这些属性通常是长列表。只有当我们只处理一种类型的
Artist
对象时,才建议使用它。第二个选项:我们指定未选择的属性。也就是说,我们用我们不想传递的属性编写一个“异常列表”,我们自动选择对象的所有可转移属性,但不包括“例外列表”中的属性。这是最快的选项,我们可以同时对不同类型的
Artist
对象使用它。第一个选项:指定已传输属性的列表
我们只需编写一个赋值函数来定义要传递的属性列表,如上所示。在
此选项的缺点是不能立即扩展到不同的
Artist
对象,例如Line2D和Circle。因为我们必须硬编码不同的属性名列表,每种类型的Artist
对象对应一个。在完整示例
我展示了Line2D艺术家类的一个示例,如指定的问题中所示。在
输出
第二个选项:指定未传输属性的列表
在本例中,我们指定了不想传输的属性的名称:我们生成一个
exception list
。我们自动收集Artist
对象的所有可转移属性,并排除exception list
的名称。在其优点是,通常对于不同的
Artist
对象,排除的属性是相同的短列表,因此,可以更快地编写此选项的脚本。在下面的示例中,列表的长度为except_attributes = ('transform', 'figure')
本例中的关键函数是
list_transferable_attributes
,如下所示:完整示例
输出
相关问题 更多 >
编程相关推荐