如何将 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】:

您可以连接所有多边形的verticescodes,并使用它们创建"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() 与多个多边形一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自相交多边形划分为简单多边形?

如何获取arcgis中矢量图层的每个多边形质心具体方法

在多个多边形中搜索点的最佳方法

如何在Leaflet地图多边形上触发事件?

Boost Geometry:联合多个多边形 C++

OpenCV:如何混合多个不同颜色的半透明多边形?