文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Path
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()
1. 创建和使用 PATH
PATH
对象的创建通过 matplotlib.path.Path(verts,codes)
创建,其中:
verts
:PATH
的顶点。这些顶点必须构成一个封闭曲线。其中每个顶点必须指定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 point
到start point
可以通过 matplotlib.patches.PathPatch(path)
来构建一个 PathPatch
对象,然后通过 Axes.add_patch(patch)
向 Axes
添加 PathPatch
对象.这样就添加了 Path
到图表中。
2. Compound Path
在 matplotlib
中所有简单的 patch primitive
,如 Rectangle
、 Circle
、 Polygon
等等,都是由简单的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论