如何将 set_clip_path() 与多个多边形一起使用?
Posted
技术标签:
【中文标题】如何将 set_clip_path() 与多个多边形一起使用?【英文标题】:How to use set_clip_path() with multiple polygons? 【发布时间】:2021-09-21 11:47:55 【问题描述】:我正在尝试通过几个多边形剪辑点云,但我不知道plt.axis.set_clip_path()
是否可以做到这一点。
既然set_clip_path()
需要一个Path 或一个Patch 作为参数,你怎么能创建一个由几个多边形组成的几何图形呢?它类似于plt.MultiPolygon()
,但它不存在。我尝试使用所有多边形创建一个matplotlib.PatchCollection
,但这不起作用。
这是期望的目标(从上到下):
这是我希望 代码 的样子:
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
import numpy as np
fig, ax = plt.subplots()
points = np.array([np.random.random(100)*400,
np.random.random(100)*100]).T
A = plt.Polygon( np.array([( 0, 0),(50,100),(100, 0)]), color='w', ec='k' )
B = plt.Polygon( np.array([(120 , 0),(170 , 100), (220, 0)]), color='w', ec='k' )
C = plt.Polygon( np.array([(240 , 0),(290 , 100), (340, 0)]), color='w', ec='k' )
[ax.add_patch(i) for i in (A,B,C)]
ax.scatter(points[:,0], points[:,1], zorder=3).set_clip_path([A,B,C])
【问题讨论】:
【参考方案1】:您可以连接所有多边形的vertices
和codes
,并使用它们创建"compound path"。 Matplotlib's path tutorial 包含一个仅从一个复合路径创建直方图的示例。
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import numpy as np
points = np.array([np.random.random(100) * 400,
np.random.random(100) * 100]).T
A = plt.Polygon(np.array([(0, 0), (50, 100), (100, 0)]), color='w', ec='k')
B = plt.Polygon(np.array([(120, 0), (170, 100), (220, 0)]), color='w', ec='k')
C = plt.Polygon(np.array([(240, 0), (290, 100), (340, 0)]), color='w', ec='k')
fig, ax = plt.subplots()
all_polys = [A, B, C]
[ax.add_patch(i) for i in all_polys]
vertices = np.concatenate([i.get_path().vertices for i in all_polys])
codes = np.concatenate([i.get_path().codes for i in all_polys])
dots = ax.scatter(points[:, 0], points[:, 1], zorder=3)
dots.set_clip_path(PathPatch(Path(vertices, codes), transform=ax.transData))
plt.show()
【讨论】:
哇,效果非常好!非常感谢你。也可以将其应用于 matplotlib.collection(一旦它首次创建)。以上是关于如何将 set_clip_path() 与多个多边形一起使用?的主要内容,如果未能解决你的问题,请参考以下文章