路径教程

在Matplotlib可视化中定义路径。

所有 matplotlib.patches 对象是 Path 它支持标准的moveto、line to、curveto命令集,用于绘制由线段和样条线组成的简单和复合轮廓。这个 Path 用(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, ax = plt.subplots()
patch = patches.PathPatch(path, facecolor='orange', lw=2)
ax.add_patch(patch)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
plt.show()
path tutorial

识别以下路径代码

代码 顶点 描述
STOP 1(忽略) 整个路径末端的标记(当前不需要且被忽略)。
MOVETO 1 拿起笔,移动到给定的顶点。
LINETO 1 从当前位置到给定顶点画一条线。
CURVE3 2: 1个控制点,1个终点 从给定控制点的当前位置到给定终点绘制二次B_zier曲线。
CURVE4 3: 2个控制点,1个终点 在给定控制点的情况下,从当前位置到给定终点绘制一条三次B_zier曲线。
CLOSEPOLY 1(忽略该点) 绘制一条直线段到当前多段线的起点。

BéZier实例

一些路径组件需要多个顶点来指定它们:例如,曲线3是 bézier 曲线有一个控制点和一个端点,曲线4有三个顶点用于两个控制点和端点。下面的示例显示了一条曲线4 b_zier样条曲线——b_zier曲线将包含在起点、两个控制点和终点的凸面外壳中。

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, ax = plt.subplots()
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()
path tutorial

复合路径

Matplotlib、Rectangle、Circle、Polygon等中的所有简单面片基元都是用简单路径实现的。绘图功能类似 hist()bar() 它可以创建许多基元,例如一组矩形,通常可以使用复合路径更有效地实现。原因 bar 创建一个矩形列表,而不是复合路径主要是历史路径: Path 代码比较新,而且 bar 早于它。虽然我们现在可以更改它,但它会破坏旧代码,因此这里我们将介绍如何创建复合路径,替换条形图中的功能,以防出于效率原因需要在自己的代码中这样做,例如,您正在创建动画条形图。

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

# 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个顶点:1个用于 MOVETO 3,用于 LINETO 和1的 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)
import numpy as np
import matplotlib.patches as patches
import matplotlib.path as path

fig, ax = plt.subplots()
# Fixing random state for reproducibility
np.random.seed(19680801)

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

# 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
nrects = len(left)

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

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

ax.set_xlim(left[0], right[-1])
ax.set_ylim(bottom.min(), top.max())

plt.show()
path tutorial

关键词:matplotlib代码示例,codex,python plot,pyplot Gallery generated by Sphinx-Gallery