You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:37:41