添加带有仿射变换的 PatchCollection
Adding PatchCollection with Affine Transformations
我有一些 patches
,我在 matplotlib
中应用了不同的 Affine2D
转换。
是否可以将它们添加为 collections.PatchCollection
?如果我为每个单独调用 ax.add_patch()
,我只能以某种方式绘制它们。
from matplotlib import pyplot as plt, patches, collections, transforms
fig, ax = plt.subplots()
trafo1 = transforms.Affine2D().translate(+0.3, -0.3).rotate_deg_around(0, 0, 45) + ax.transData
trafo2 = transforms.Affine2D().translate(+0.3, -0.3).rotate_deg_around(0, 0, 65) + ax.transData
rec1 = patches.Rectangle(xy=(0.1, 0.1), width=0.2, height=0.3, transform=trafo1, color='blue')
rec2 = patches.Rectangle(xy=(0.2, 0.2), width=0.3, height=0.2, transform=trafo2, color='green')
ax.add_collection(collections.PatchCollection([rec1, rec2], color='red', zorder=10))
# ax.add_patch(rec1)
# ax.add_patch(rec2)
看起来 PatchCollection
不支持单独转换的元素。从Matplotlib documentation,我们可以读出一个Collection
是一个
class for the efficient drawing of large collections of objects that share most properties, e.g., a large number of line segments or polygons.
您可以通过创建没有任何单独转换的补丁的集合来理解这一点:
rec1 = patches.Rectangle(xy=(0.1, 0.1), width=0.2, height=0.3, color='blue')
rec2 = patches.Rectangle(xy=(0.2, 0.2), width=0.3, height=0.2, color='green')
col = collections.PatchCollection([rec1, rec2], color='red', zorder=10)
print(col.get_transform())
为最后一条语句打印 IdentityTransform()
,并正确显示 (non-transformed) 个补丁。这些补丁可以从 PatchCollection
转换 all-at-once,无需单独指定。
相反,当您为每个补丁应用单独的转换时(就像您的情况一样),.get_transform()
方法 returns 一个空列表。这可能是因为 PatchCollection
类 为了加快绘图效率(如上所述)而将 patches
与许多公共属性聚集在一起,包括 transform
属性。
注意:在 this answer 上,您可以找到一种解决方法,将 patch
转换为 path
,然后再转换为 PathCollection
与单独的补丁绘制相比,绘制效率有所提高。
我有一些 patches
,我在 matplotlib
中应用了不同的 Affine2D
转换。
是否可以将它们添加为 collections.PatchCollection
?如果我为每个单独调用 ax.add_patch()
,我只能以某种方式绘制它们。
from matplotlib import pyplot as plt, patches, collections, transforms
fig, ax = plt.subplots()
trafo1 = transforms.Affine2D().translate(+0.3, -0.3).rotate_deg_around(0, 0, 45) + ax.transData
trafo2 = transforms.Affine2D().translate(+0.3, -0.3).rotate_deg_around(0, 0, 65) + ax.transData
rec1 = patches.Rectangle(xy=(0.1, 0.1), width=0.2, height=0.3, transform=trafo1, color='blue')
rec2 = patches.Rectangle(xy=(0.2, 0.2), width=0.3, height=0.2, transform=trafo2, color='green')
ax.add_collection(collections.PatchCollection([rec1, rec2], color='red', zorder=10))
# ax.add_patch(rec1)
# ax.add_patch(rec2)
看起来 PatchCollection
不支持单独转换的元素。从Matplotlib documentation,我们可以读出一个Collection
是一个
class for the efficient drawing of large collections of objects that share most properties, e.g., a large number of line segments or polygons.
您可以通过创建没有任何单独转换的补丁的集合来理解这一点:
rec1 = patches.Rectangle(xy=(0.1, 0.1), width=0.2, height=0.3, color='blue')
rec2 = patches.Rectangle(xy=(0.2, 0.2), width=0.3, height=0.2, color='green')
col = collections.PatchCollection([rec1, rec2], color='red', zorder=10)
print(col.get_transform())
为最后一条语句打印 IdentityTransform()
,并正确显示 (non-transformed) 个补丁。这些补丁可以从 PatchCollection
转换 all-at-once,无需单独指定。
相反,当您为每个补丁应用单独的转换时(就像您的情况一样),.get_transform()
方法 returns 一个空列表。这可能是因为 PatchCollection
类 为了加快绘图效率(如上所述)而将 patches
与许多公共属性聚集在一起,包括 transform
属性。
注意:在 this answer 上,您可以找到一种解决方法,将 patch
转换为 path
,然后再转换为 PathCollection
与单独的补丁绘制相比,绘制效率有所提高。