返回介绍

Path

发布于 2024-05-19 17:51:50 字数 3118 浏览 0 评论 0 收藏 0

matplotlib.patch 对象底层的对象就是 Path 。它的基本用法如下:

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
verts = [
(0., 0.), # left, bottom
(0., 1.), # left, top
(1., 1.), # right, top
(1., 0.), # right, bottom
(0., 0.), # ignored
]
codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY,
]
path = Path(verts, codes)
fig = plt.figure()
ax = fig.add_subplot(111)
patch = patches.PathPatch(path)
ax.add_patch(patch)
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
plt.show()

Path

1. 创建和使用 PATH

PATH 对象的创建通过 matplotlib.path.Path(verts,codes) 创建,其中:

  • vertsPATH 的顶点。这些顶点必须构成一个封闭曲线。其中每个顶点必须指定 x 坐标和 y 坐标。
  • codes :指示如何使用这些 PATH 顶点。它与 verts 关系是一一对应的。有如下指令:
    • Path.STOP :结束 path 的标记
    • Path.MOVETO :画笔提起并移动到指定的顶点
    • Path.LINETO :画笔画直线,从 current position 到指定的顶点
    • Path.CURVE3 :画笔画二阶贝塞尔曲线,从 current position 到指定的 end point , 其中还有一个参数是指定的 control point
    • Path.CURVE4 :画笔画三阶贝塞尔曲线,从 current position 到指定的 end point , 其中还有两个参数是指定的 control points
    • Path.CLOSEPOLY :指定的 point 参数被忽略。该指令画一条线段, 从 current pointstart point

可以通过 matplotlib.patches.PathPatch(path) 来构建一个 PathPatch 对象,然后通过 Axes.add_patch(patch)Axes 添加 PathPatch 对象.这样就添加了 Path 到图表中。

贝塞尔曲线

2. Compound Path

matplotlib 中所有简单的 patch primitive ,如 RectangleCirclePolygon 等等,都是由简单的 Path 来实现的。而创建大量的 primitive 的函数如 hist()bar() (他们创建了大量的 Rectanle )可以使用一个 compound path 来高效地实现。

但是实际上 bar() 创建的是一系列的 Rectangle ,而没有用到 compound path ,这是由于历史原因,是历史遗留问题。( bar() 函数先于 Coupound Path 出现)

下面是一个 Compound Path 的例子:

... 
verts = np.zeros((nverts, 2))  # nverts 为顶点的个数加 1(一个终止符)
codes = np.ones(nverts, int) * Path.LINETO
## 设置 codes :codes 分成 5 个一组,
## 每一组以 Path.MOVETO 开始,后面是 3 个 Path.LINETO,最后是 Path.CLOSEPOLY 
codes[0::5] = Path.MOVETO
codes[4::5] = Path.CLOSEPOLY
## 设置顶点 verts ##
...
## 创建 Path 、PathPatch 并添加  ##
barpath = Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',edgecolor='yellow', alpha=0.5)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.add_patch(patch)
ax.show()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文