matplotlib.tri
#
非结构化三角网格函数。
- class matplotlib.tri.Triangulation(x, y, triangles=None, mask=None)[source]#
由npoints个点和ntri个三角形组成的非结构化三角网格。三角形可以由用户指定,也可以使用Delaunay三角剖分自动生成。
- 参数:
- x, y(npoints,) 类数组对象
网格点的坐标。
- triangles(ntri, 3) int类型类数组对象, 可选
对于每个三角形,组成该三角形的三个点的索引,按逆时针顺序排列。如果未指定,则计算Delaunay三角剖分。
- mask(ntri,) bool类型类数组对象, 可选
哪些三角形被遮罩掉。
- 属性:
- triangles(ntri, 3) int类型数组
对于每个三角形,组成该三角形的三个点的索引,按逆时针顺序排列。如果要考虑mask,请改用
get_masked_triangles
。- mask(ntri, 3) bool类型数组或None
被遮罩掉的三角形。
- is_delaunay布尔值
Triangulation是否为计算得出的Delaunay三角剖分(其中未指定triangles)或不是。
备注
为了使Triangulation有效,它不能有重复的点、由共线点形成的三角形或重叠的三角形。
- calculate_plane_coefficients(z)[source]#
根据点 (x, y) 坐标和指定形状为 (npoints) 的 z 数组,计算所有未遮罩三角形的平面方程系数。返回的数组形状为 (npoints, 3),允许使用
z = array[tri, 0] * x + array[tri, 1] * y + array[tri, 2]
来计算三角形 tri 中 (x, y) 位置的 z 值。
- property edges#
返回形状为 (nedges, 2) 的整数数组,其中包含所有未遮罩三角形的边。
每行通过其起点索引和终点索引定义一条边。每条边只出现一次,即对于点 i 和 j 之间的边,只会出现 (i, j) 或 (j, i)。
- static get_from_args_and_kwargs(*args, **kwargs)[source]#
从 args 和 kwargs 返回一个 Triangulation 对象,以及移除了已消耗值的剩余 args 和 kwargs。
有两种替代方案:第一种是第一个参数是 Triangulation 对象,在这种情况下它被返回;第二种是 args 和 kwargs 足以创建一个新的 Triangulation 来返回。在后一种情况下,有关可能的 args 和 kwargs,请参阅 Triangulation.__init__ 的文档。
- get_trifinder()[source]#
返回此三角剖分的默认
matplotlib.tri.TriFinder
对象,如果需要则创建它。这允许轻松共享同一个 TriFinder 对象。
- property neighbors#
返回形状为 (ntri, 3) 的整数数组,其中包含相邻三角形。
对于每个三角形,其共享相同边的三个相邻三角形的索引,如果没有此类相邻三角形则为-1。
neighbors[i, j]
是从点索引triangles[i, j]
到点索引triangles[i, (j+1)%3]
的边对应的相邻三角形。
- class matplotlib.tri.TriContourSet(ax, *args, **kwargs)[source]#
基类:
ContourSet
为三角网格创建并存储一组等高线或填充区域。
该类通常不由用户直接实例化,而是由
tricontour
和tricontourf
实例化。- 属性:
- levels数组
等高线级别的值。
- layers数组
与线等高线的级别相同;对于填充等高线,位于级别之间的一半位置。请参见
ContourSet._process_colors
。
绘制三角网格等高线或填充区域,取决于关键字参数 filled 是 False(默认)还是 True。
初始化器的第一个参数必须是
Axes
对象。其余参数和关键字参数在tricontour
的文档字符串中描述。- set(*, agg_filter=<UNSET>, alpha=<UNSET>, animated=<UNSET>, antialiased=<UNSET>, array=<UNSET>, capstyle=<UNSET>, clim=<UNSET>, clip_box=<UNSET>, clip_on=<UNSET>, clip_path=<UNSET>, cmap=<UNSET>, color=<UNSET>, edgecolor=<UNSET>, facecolor=<UNSET>, gid=<UNSET>, hatch=<UNSET>, hatch_linewidth=<UNSET>, in_layout=<UNSET>, joinstyle=<UNSET>, label=<UNSET>, linestyle=<UNSET>, linewidth=<UNSET>, mouseover=<UNSET>, norm=<UNSET>, offset_transform=<UNSET>, offsets=<UNSET>, path_effects=<UNSET>, paths=<UNSET>, picker=<UNSET>, pickradius=<UNSET>, rasterized=<UNSET>, sketch_params=<UNSET>, snap=<UNSET>, transform=<UNSET>, url=<UNSET>, urls=<UNSET>, visible=<UNSET>, zorder=<UNSET>)[source]#
一次性设置多个属性。
支持的属性包括:
属性
描述
一个过滤函数,它接受一个 (m, n, 3) 浮点数组和一个 dpi 值,并返回一个 (m, n, 3) 数组以及图像左下角的两个偏移量
类数组或浮点数或 None
布尔值
布尔值或布尔值列表
类数组或 None
CapStyle
或 {'butt', 'projecting', 'round'}(vmin: 浮点数, vmax: 浮点数)
BboxBase
或 None布尔值
Patch 或 (Path, Transform) 或 None
Colormap
或 str 或 None颜色 或 RGBA 元组列表
edgecolor
或ec
或edgecolors
facecolor
或facecolors
或fc
str
{'/', '\', '|', '-', '+', 'x', 'o', 'O', '.', '*'}
未知
布尔值
JoinStyle
或 {'miter', 'round', 'bevel'}对象
linestyle
或dashes
或linestyles
或ls
字符串或元组或其列表
linewidth
或linewidths
或lw
浮点数或浮点数列表
布尔值
Normalize
或 str 或 None(N, 2) 或 (2,) 类数组
未知
None 或 布尔值 或 浮点数 或 可调用对象
浮点数
布尔值
(scale: 浮点数, length: 浮点数, randomness: 浮点数)
布尔值或 None
str
urls
布尔值
浮点数
- class matplotlib.tri.TriFinder(triangulation)[source]#
用于查找 Triangulation 中 (x, y) 点所在三角形的抽象基类。
通常最好使用函数
Triangulation.get_trifinder
,而不是实例化一个从 TriFinder 派生的类的对象。派生类实现 __call__(x, y) 方法,其中 x 和 y 是形状相同的类数组点坐标。
- class matplotlib.tri.TrapezoidMapTriFinder(triangulation)[source]#
基类:
TriFinder
使用 M. de Berg、M. van Kreveld、M. Overmars 和 O. Schwarzkopf 所著《计算几何,算法与应用》(第二版)一书中的梯形图算法实现的
TriFinder
类。三角剖分必须有效,即不能有重复点、由共线点形成的三角形或重叠的三角形。该算法对由共线点形成的三角形具有一定的容忍度,但不应依赖于此。
- class matplotlib.tri.TriInterpolator(triangulation, z, trifinder=None)[source]#
用于在三角网格上进行插值的抽象基类。
派生类实现以下方法
__call__(x, y)
,其中 x, y 是形状相同的类数组点坐标,并返回一个包含插值 z 值的形状相同的遮罩数组。gradient(x, y)
,其中 x, y 是形状相同的类数组点坐标,并返回一个包含插值器两个导数(插值 z 值相对于 x 和 y 的导数)的两个形状相同的遮罩数组列表。
- class matplotlib.tri.LinearTriInterpolator(triangulation, z, trifinder=None)[source]#
-
三角网格上的线性插值器。
每个三角形都由一个平面表示,使得点 (x, y) 处的插值值位于包含 (x, y) 的三角形平面上。因此,插值值在三角剖分上是连续的,但其一阶导数在三角形之间的边处是不连续的。
- 参数:
- triangulation
Triangulation
要进行插值的三角剖分。
- z(npoints,) 类数组对象
在网格点处定义的值数组,用于插值。
- trifinder
TriFinder
, 可选 如果未指定,将通过调用
Triangulation.get_trifinder
来使用Triangulation的默认TriFinder。
- triangulation
方法
`__call__` (x, y)
(返回 (x, y) 点处的插值值。)
`gradient` (x, y)
(返回 (x, y) 点处的插值导数。)
- class matplotlib.tri.CubicTriInterpolator(triangulation, z, kind='min_E', trifinder=None, dz=None)[source]#
-
三角网格上的三次插值器。
在一维空间中——在一个线段上——三次插值函数由函数值及其在两端的导数定义。这与在二维空间中三角形内部的情况几乎相同,不同之处在于函数值及其两次导数必须在每个三角形节点处定义。
CubicTriInterpolator 接收用户提供的每个节点处的函数值,并在内部计算导数值,从而实现平滑插值。(作为一项特殊功能,用户也可以指定每个节点处的导数值,但这并非预期的一般用法。)
- 参数:
- triangulation
Triangulation
要进行插值的三角剖分。
- z(npoints,) 类数组对象
在网格点处定义的值数组,用于插值。
- kind{'min_E', 'geom', 'user'},可选
平滑算法的选择,用于计算插值器的导数(默认为'min_E')
如果为 'min_E':(默认)计算每个节点处的导数以最小化弯曲能量。
如果为 'geom':每个节点处的导数计算为相关三角形法线的加权平均值。用于速度优化(大型网格)。
如果为 'user':用户提供参数 dz,因此无需计算。
- trifinder
TriFinder
, 可选 如果未指定,将通过调用
Triangulation.get_trifinder
使用 Triangulation 的默认 TriFinder。- dz类数组(dzdx, dzdy)元组,可选
仅当 *kind* ='user' 时使用。在这种情况下,*dz* 必须以 (dzdx, dzdy) 的形式提供,其中 dzdx, dzdy 是与 *z* 形状相同的数组,并且是 *triangulation* 点处的插值器一阶导数。
- triangulation
方法
`__call__` (x, y)
(返回 (x, y) 点处的插值值。)
`gradient` (x, y)
(返回 (x, y) 点处的插值导数。)
备注
本注释略带技术性,详细说明了三次插值是如何计算的。
插值基于 *triangulation* 网格的 Clough-Tocher 细分方案(更清楚地说,网格的每个三角形将分为 3 个子三角形,并且在每个子三角形上,插值函数是 2 个坐标的三次多项式)。这项技术源自 FEM(有限元方法)分析;所使用的元素是简化的 Hsieh-Clough-Tocher (HCT) 元素。其形状函数在 [1] 中有描述。组装后的函数保证是 C1 连续的,即它连续且其一阶导数也连续(这在三角形内部很容易证明,但在穿过边界时也成立)。
在默认情况下(*kind* ='min_E'),插值器在由 HCT 元素形状函数生成的函数空间上最小化曲率能量——在每个节点处有强制值但导数任意。最小化的泛函是所谓总曲率的积分(实现基于 [2] 中的算法 - PCG 稀疏求解器)
\[E(z) = \frac{1}{2} \int_{\Omega} \left( \left( \frac{\partial^2{z}}{\partial{x}^2} \right)^2 + \left( \frac{\partial^2{z}}{\partial{y}^2} \right)^2 + 2\left( \frac{\partial^2{z}}{\partial{y}\partial{x}} \right)^2 \right) dx\,dy\]如果用户选择 *kind* ='geom' 情况,则使用简单的几何近似(三角形法线向量的加权平均值),这可以在非常大的网格上提高速度。
参考
- class matplotlib.tri.TriRefiner(triangulation)[source]#
实现网格细化类的抽象基类。
TriRefiner 封装了一个 Triangulation 对象,并提供了网格细化和插值的工具。
派生类必须实现
refine_triangulation(return_tri_index=False, **kwargs)
,其中可选的关键字参数 kwargs 在每个 TriRefiner 具体实现中定义,并返回一个细化后的三角剖分,
可选地(取决于 return_tri_index),对于细化三角剖分的每个点:其所属的初始三角剖分三角形的索引。
refine_field(z, triinterpolator=None, **kwargs)
,其中z 在基本三角剖分节点处定义的场值数组(待细化),
triinterpolator 是一个可选的
TriInterpolator
>,其他可选的关键字参数 kwargs 在每个 TriRefiner 具体实现中定义;
并返回(作为元组)一个细化的三角网格和在细化三角剖分节点处插值的场值。
- class matplotlib.tri.UniformTriRefiner(triangulation)[source]#
基类:
TriRefiner
通过递归细分进行的统一网格细化。
- 参数:
- triangulation
Triangulation
封装的三角剖分(待细化)
- triangulation
- refine_field(z, triinterpolator=None, subdiv=3)[source]#
细化在封装三角剖分上定义的场。
- 参数:
- z(npoints,) 类数组对象
待细化的场值,定义在封装三角剖分的节点处。(
n_points
是初始三角剖分中的点数)- triinterpolator
TriInterpolator
>,可选 用于场插值的插值器。如果未指定,将使用
CubicTriInterpolator
>。- subdivint,默认值:3
细分的递归级别。每个三角形被划分为
4**subdiv
个子三角形。
- 返回:
- refi_tri
Triangulation
> 返回的细化三角剖分。
- refi_z一维数组,长度:*refi_tri* 节点计数。
返回的插值场(在 *refi_tri* 节点处)。
- refi_tri
- refine_triangulation(return_tri_index=False, subdiv=3)[source]#
计算封装的
triangulation
的均匀细化三角剖分 *refi_triangulation*。此函数通过将每个父三角形分割成在边中点节点上构建的 4 个子三角形来细化封装的三角剖分,递归 *subdiv* 次。最终,每个三角形因此被划分为
4**subdiv
个子三角形。- 参数:
- return_tri_indexbool,默认值:False
是否返回指示每个点的父三角形索引的索引表。
- subdivint,默认值:3
细分的递归级别。每个三角形被划分为
4**subdiv
个子三角形;因此,默认情况下,初始三角剖分的每个三角形会产生 64 个细化后的子三角形。
- 返回:
- refi_triangulation
Triangulation
> 细化后的三角剖分。
- found_indexint 数组
对于 *refi_triangulation* 的每个点,包含该点的初始三角剖分三角形的索引。仅当 *return_tri_index* 设置为 True 时返回。
- refi_triangulation
- class matplotlib.tri.TriAnalyzer(triangulation)[source]#
定义三角网格分析和改进的基本工具。
TriAnalyzer 封装了一个
Triangulation
> 对象,并提供了网格分析和网格改进的基本工具。- 参数:
- triangulation
Triangulation
待分析的封装三角剖分。
- triangulation
- 属性:
scale_factors
将三角剖分重新缩放为单位正方形的因子。
- circle_ratios(rescale=True)[source]#
返回三角剖分三角形平坦度的度量。
内切圆半径与外接圆半径之比是衡量三角形平坦度的常用指标。它始终
<= 0.5
,且仅在等边三角形时== 0.5
。圆半径比低于 0.01 表示非常平坦的三角形。为避免因两轴之间尺度差异导致不适当的低值,三角网格可以首先使用
scale_factors
> 重新缩放以适应单位正方形内部(仅当 *rescale* 为 True 时,这是其默认值)。- 参数:
- rescalebool,默认值:True
如果为 True,则内部重新缩放(基于
scale_factors
>),以便(未遮罩的)三角形正好适应单位正方形网格。
- 返回:
- 遮罩数组
封装三角剖分中每个“重新缩放”三角形的内切圆半径与外接圆半径之比。与被遮罩三角形对应的值被遮罩掉。
- get_flat_tri_mask(min_circle_ratio=0.01, rescale=True)[source]#
从三角剖分中消除过平坦的边界三角形。
返回一个遮罩 *new_mask*,它允许根据
circle_ratios()
> 清理封装三角剖分中位于边界的扁平三角形。此遮罩旨在随后使用Triangulation.set_mask
> 应用于三角剖分。*new_mask* 是初始三角剖分遮罩的扩展,即最初被遮罩的三角形将保持被遮罩。*new_mask* 数组是递归计算的;在每一步中,只有当扁平三角形与当前网格边界共享一条边时才会被移除。因此,在三角化域中不会创建新的孔洞。
- 参数:
- min_circle_ratiofloat,默认值:0.01
如果内切圆/外接圆半径比 r/R < *min_circle_ratio*,则会移除边界三角形。
- rescalebool,默认值:True
如果为 True,则首先在内部重新缩放(基于
scale_factors
>),以便(未遮罩的)三角形正好适应单位正方形网格。此重新缩放考虑了两个轴之间可能存在的尺度差异。
- 返回:
- 布尔数组
要应用于封装三角剖分的遮罩。所有最初被遮罩的三角形在新遮罩中仍保持被遮罩。
备注
此函数背后的基本原理是,Delaunay 三角剖分(用于非结构化点集)有时在其边界处包含几乎扁平的三角形,这会导致绘图中的伪影(特别是对于高分辨率等高线图)。使用计算出的 *new_mask* 进行遮罩后,封装的三角剖分将不再包含圆半径比低于 *min_circle_ratio* 的未遮罩边界三角形,从而提高后续绘图或插值的网格质量。
- property scale_factors#
将三角剖分重新缩放为单位正方形的因子。
- 返回:
- (浮点数, 浮点数)
缩放因子 (kx, ky),使得三角剖分
[triangulation.x * kx, triangulation.y * ky]
恰好适应单位正方形。