Matplotlib 中文用户指南 3.8 路径教程

简介: 路径教程 原文:Path Tutorial 译者:飞龙 协议:CC BY-NC-SA 4.0位于所有matplotlib.patch对象底层的对象是Path,它支持moveto,lineto,curveto命令的标准几个,来绘制由线段和样条组成的简单和复合轮廓。

路径教程

原文:Path Tutorial

译者:飞龙

协议:CC BY-NC-SA 4.0

位于所有matplotlib.patch对象底层的对象是Path,它支持movetolinetocurveto命令的标准几个,来绘制由线段和样条组成的简单和复合轮廓。 路径由(x,y)顶点的(N,2)数组,以及路径代码的长度为 N 的数组实例化。 例如,为了绘制(0,0)(1,1)的单位矩形,我们可以使用这个代码:

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, facecolor='orange', lw=2)
ax.add_patch(patch)
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
plt.show()

下面的路径代码会被接受:

代码 顶点 描述
STOP 1 (被忽略) 标志整个路径终点的标记(当前不需要或已忽略)
MOVETO 1 提起笔并移动到指定顶点
LINETO 1 从当前位置向指定顶点画线
CURVE3 2 (一个控制点,一个终点) 从当前位置,以给定控制点向给定端点画贝塞尔曲线
CURVE4 3 (两个控制点,一个终点) 从当前位置,以给定控制点向给定端点画三次贝塞尔曲线
CLOSEPOLY 1 (点自身被忽略) 向当前折线的起点画线

贝塞尔示例

一些路径组件需要以多个顶点来指定:例如CURVE3是具有一个控制点和一个端点的贝塞尔曲线,CURVE4具有用做两个控制点和端点的三个顶点。 下面的示例显示了CURVE4贝塞尔曲线 - 贝塞尔曲线将包含在起始点,两个控制点和终点的凸包中:

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

verts = [
    (0., 0.),  # P0
    (0.2, 1.), # P1
    (1., 0.8), # P2
    (0.8, 0.), # P3
    ]

codes = [Path.MOVETO,
         Path.CURVE4,
         Path.CURVE4,
         Path.CURVE4,
         ]

path = Path(verts, codes)

fig = plt.figure()
ax = fig.add_subplot(111)
patch = patches.PathPatch(path, facecolor='none', lw=2)
ax.add_patch(patch)

xs, ys = zip(*verts)
ax.plot(xs, ys, 'x--', lw=2, color='black', ms=10)

ax.text(-0.05, -0.05, 'P0')
ax.text(0.15, 1.05, 'P1')
ax.text(1.05, 0.85, 'P2')
ax.text(0.85, -0.05, 'P3')

ax.set_xlim(-0.1, 1.1)
ax.set_ylim(-0.1, 1.1)
plt.show()

复合路径

所有在 matplotlib,Rectangle,Circle,Polygon 等中的简单补丁原语都是用简单的路径实现的。通过使用复合路径,通常可以更有效地实现绘制函数,如hist()bar(),它们创建了许多原语,例如一堆Rectangle,通常可使用复合路径来实现。bar创建一个矩形列表,而不是一个复合路径,很大程度上出于历史原因:路径代码是比较新的,bar在它之前就存在。虽然我们现在可以改变它,但它会破坏旧的代码,所以如果你需要为了效率,在你自己的代码中这样做,例如,创建动画条形图,在这里我们将介绍如何创建复合路径,替换bar中的功能。

我们将通过为每个直方图的条形创建一系列矩形,来创建直方图图表:矩形宽度是条形的宽度,矩形高度是该条形中的数据点数量。首先,我们将创建一些随机的正态分布数据并计算直方图。因为 numpy 返回条形边缘而不是中心,所以下面的示例中bins的长度比n的长度大 1:

# histogram our data with numpy
data = np.random.randn(1000)
n, bins = np.histogram(data, 100)

我们现在将提取矩形的角。 下面的每个leftbottom等数组长度为len(n),其中n是每个直方图条形的计数数组:

# get the corners of the rectangles for the histogram
left = np.array(bins[:-1])
right = np.array(bins[1:])
bottom = np.zeros(len(left))
top = bottom + n

现在我们必须构造复合路径,它由每个矩形的一系列MOVETOLINETOCLOSEPOLY组成。 对于每个矩形,我们需要 5 个顶点:一个代表MOVETO,三个代表LINETO,一个代表CLOSEPOLY。 如上表所示,closepoly的顶点被忽略,但我们仍然需要它来保持代码与顶点对齐:

nverts = nrects*(1+3+1)
verts = np.zeros((nverts, 2))
codes = np.ones(nverts, int) * path.Path.LINETO
codes[0::5] = path.Path.MOVETO
codes[4::5] = path.Path.CLOSEPOLY
verts[0::5,0] = left
verts[0::5,1] = bottom
verts[1::5,0] = left
verts[1::5,1] = top
verts[2::5,0] = right
verts[2::5,1] = top
verts[3::5,0] = right
verts[3::5,1] = bottom

剩下的就是创建路径了,将其添加到PathPatch,将其添加到我们的轴域:

barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath, facecolor='green',
  edgecolor='yellow', alpha=0.5)
ax.add_patch(patch)

结果为:

相关文章
|
2天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 7
通过在`plot()`方法中添加多对x,y值,可以实现多条线的同时绘制。示例代码展示了如何使用Matplotlib和NumPy库绘制并展示两条不同样式的线。
14 6
|
3天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 5
自定义绘图线样式,包括线型、颜色和粗细等属性。通过 `color` 或 `c` 参数可设定线的颜色,支持多种颜色标记(如 'r' 表示红色)及自定义颜色(如 'SeaGreen')。示例展示了如何应用自定义颜色绘制图形。
20 6
|
2天前
|
数据可视化 Python
Matplotlib 教程 之 Matplotlib 轴标签和标题 1
使用 Matplotlib 的 `xlabel()` 和 `ylabel()` 方法为 x 轴和 y 轴添加标签。通过简单的 NumPy 数组操作和 Matplotlib 的绘图功能,您可以轻松地为图表添加描述性的轴标签,使数据可视化更加清晰明了。
13 5
|
2天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 6
使用 Matplotlib 自定义绘图线样式,包括线的类型、颜色和大小等属性。通过设置 `linewidth` 参数(可简写为 `lw`)调整线宽,该参数接受浮点数值
14 5
|
1天前
|
Python
Matplotlib 教程 之 Matplotlib 网格线 1
使用 Matplotlib 的 `grid()` 方法在图表中添加网格线,通过设置参数如 b(开启或关闭网格线)、which(主次网格线)、axis(指定方向)及 kwargs(颜色、线型等),轻松自定义网格样式,增强图表可读性。
14 6
|
1天前
|
前端开发 Python
Matplotlib 教程 之 Matplotlib 轴标签和标题 3
使用 Matplotlib 的 `title()`, `xlabel()`, 和 `ylabel()` 方法来设置图表标题及轴标签的位置,并通过实例展示了如何利用 `loc` 参数实现标题和标签的定位,同时演示了如何设置中文字体和样式。
6 1
|
4天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 3
Matplotlib 中自定义线条样式,包括线条类型、颜色和大小等属性。通过 `color` 参数或其简写 `c`,可以设置线条颜色,支持预设颜色标记(如 'r' 表示红色)及自定义颜色(如 SeaGreen)。示例展示了使用红色线条绘制数组数据的方法。
11 1
|
4天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 2
Matplotlib教程之绘图线篇的第二部分,主要介绍如何自定义绘制线的样式,包括线型、颜色及粗细等属性。重点讲解了使用`linestyle`参数或其简写`ls`来设置不同类型的线条:实线、点虚线、破折线、点划线以及不显示线。并通过一个具体示例展示了如何应用点划线。
12 1
|
5天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图线 1
本教程介绍如何使用 Matplotlib 自定义绘图中的线条样式,包括线的类型、颜色和大小等属性。通过设定 `linestyle` 参数,可以轻松实现实线、点虚线、破折线及点划线等多种样式。示例代码展示了如何绘制点虚线。
12 1
|
5天前
|
Python
Matplotlib 教程 之 Matplotlib 绘图标记 9
在本教程中,我们将探讨如何使用 Matplotlib 的 `plot()` 方法中的 `marker` 参数来自定义图表标记。您可以选择不同的线类型(如实线 `'-'`、虚线 `':'` 等),以及颜色类型(如红色 `'r'`、绿色 `'g'` 等)。同时,通过调整 `markersize (ms)`、`markerfacecolor (mfc)` 和 `markeredgecolor (mec)` 参数,可以定制标记的大小和颜色。
10 1

相关实验场景

更多
下一篇
无影云桌面