Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020

Version 3.1.1
matplotlib
Fork me on GitHub

目录

Related Topics

路径教程

在Matplotlib可视化中定义路径。

所有 matplotlib.patch 对象是 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()
路径教程

识别以下路径代码

代码 顶点 描述
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()
路径教程

复合路径

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()
路径教程