如何用Matplotlib获取多重叠圆图形的外部轮廓?
如何用Matplotlib绘制多个重叠圆的外部轮廓?
我有一个由三个相互重叠的圆组成的图形,希望仅显示该图形的外部轮廓,不显示内部线条(如下方图片所示)。请问能否通过Matplotlib的Circle模块实现该需求,还是需要采用其他方法?
原始实现代码
from matplotlib import pyplot as plt, patches plt.rcParams["figure.figsize"] = [7.00, 3.50] plt.rcParams["figure.autolayout"] = True fig = plt.figure() ax = fig.add_subplot() circle1 = patches.Circle((0.2, 0.2), radius=0.5, color='green', fill=None) circle2 = patches.Circle((0.8, 0.6), radius=0.8, color='red', fill=None) circle3 = patches.Circle((0.0, 0.8), radius=0.3, color='blue', fill=None) ax.add_patch(circle1) ax.add_patch(circle2) ax.add_patch(circle3) ax.axis('equal') plt.show()
原始效果(重叠的圆)

目标效果(仅显示外部轮廓)

解决方案说明
Matplotlib的patches.Circle只能单独绘制圆形,无法自动识别并隐藏重叠区域的内部线条。要实现仅显示外部轮廓,需要通过几何并集运算合并多个圆的轮廓,再绘制合并后的外部线条。
推荐使用Shapely库(专门处理几何对象的Python库)来简化运算,步骤如下:
1. 安装依赖库
如果尚未安装Shapely,执行以下命令:
pip install shapely
2. 实现代码
from matplotlib import pyplot as plt from shapely.geometry import Point from shapely.ops import unary_union plt.rcParams["figure.figsize"] = [7.00, 3.50] plt.rcParams["figure.autolayout"] = True fig = plt.figure() ax = fig.add_subplot() # 定义三个圆的中心坐标和半径 circle_specs = [ ((0.2, 0.2), 0.5), ((0.8, 0.6), 0.8), ((0.0, 0.8), 0.3) ] # 将每个圆转换为Shapely几何对象 shapely_circles = [] for (x, y), radius in circle_specs: shapely_circles.append(Point(x, y).buffer(radius)) # 计算所有圆的几何并集 union_geometry = unary_union(shapely_circles) # 提取并集的外部轮廓坐标并绘制 x, y = union_geometry.exterior.xy ax.plot(x, y, color='black', linewidth=2) ax.axis('equal') plt.show()
代码关键点
Point(x, y).buffer(radius):将Matplotlib的圆参数转换为Shapely的圆形几何对象unary_union(shapely_circles):合并多个圆形为一个整体的几何并集union_geometry.exterior.xy:提取并集的外部轮廓坐标,用ax.plot绘制单线条轮廓
如果不想依赖第三方库,也可以通过Matplotlib的Path对象手动处理路径交点和裁剪,但实现逻辑复杂且容易出错,不推荐。
内容的提问来源于stack exchange,提问作者Vadym Honcharuk
相关产品推荐
相关产品推荐

