本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Data_Visualization
等高线图(Contour Plot)通过一系列等值线来表示三维数据的表面形态,尤其适用于展示三维数据在二维平面上的分布规律,例如地理海拔、气象温度,还是物理场的强度分布等。
其核心逻辑是,通过将三维数据(X,Y,Z)中 Z 值相等的点连接成线,在二维平面上形成闭合曲线,从而间接反映 Z 值的空间分布。其中,X 和 Y 分别代表平面坐标的网格数据,Z 则是对应坐标点的数值(如海拔、温度等)。
函数语法:
plt.contour([X, Y,] Z, /, [levels], **kwargs)
-
X, Y:表示 Z 中数值对应的坐标数组。X 和 Y 要么均为与 Z 形状相同的二维数组(例如通过 numpy.meshgrid 创建),要么均为一维数组,且需满足 len(X) == N(N 为 Z 的列数)、len(Y) == M(M 为 Z 的行数)。X 和 Y 必须均为单调有序。若未指定 X 和 Y,则默认其为整数索引,即 X = range(N)、Y = range(M)。
-
Z:用于绘制等高线的高度值数组。这是绘制等高线的基础数据,一个二维数组 (形状为 (M, N)),表示网格上每个点的高度或数值。
-
levels:整数或类数组,用于确定等高线(或填充区域)的数量和位置。若为整数 n,则使用 MaxNLocator,该定位器会尝试在 Z 的数值最小值和最大值之间自动选择不超过 n+1 个 “合适” 的等高线级别。若为数组,则在指定的级别处绘制等高线。数组中的数值必须按递增顺序排列。 -
corner_mask:角点掩码处理。控制当 Z 为掩码数组时,如何处理四边形的角点。若为 True(默认),仅遮挡最靠近掩码点的三角形角;若为 False,任何接触掩码点的四边形都会被遮挡。
-
colors:颜色或颜色列表,用于指定不同级别等高线(contour 函数中的线条)或填充区域(contourf 函数中的区域)的颜色。颜色序列会按等高线级别递增顺序循环使用。若颜色序列长度小于等高线级别数量,则会重复使用该序列。
-
alpha:透明度混合值,取值范围在 0(完全透明)到 1(完全不透明)之间。
-
cmap:字符串或 Colormap 对象,默认值为 rcParams[“image.cmap”](默认值为 ‘viridis’)用于将标量数据映射为颜色的 Colormap 实例或已注册的颜色映射表名称。若设置了 colors 参数,则该参数会被忽略。
-
norm:用于在通过 cmap 将标量数据映射为颜色之前,将其缩放到 [0, 1] 范围的归一化方法。默认情况下使用线性缩放,将数据最小值映射为 0、最大值映射为 1。
-
vmin, vmax:颜色映射范围。当使用 cmap 且未明确设置 norm 时,用于定义颜色映射覆盖的数据范围。默认覆盖 Z 的完整范围。如果设置了 colors 参数,则此参数会被忽略。
-
colorizer:用于将颜色映射到数据的 Colorizer 对象。若为 None,则会根据 norm 和 cmap 创建一个 Colorizer 对象。若设置了 colors 参数,则该参数会被忽略。
-
origin:Z数组原点位置。确定 Z[0, 0] 在坐标系中的位置。仅在未指定 X, Y 时有意义。‘upper’:左上;‘lower’:左下;None:左下 (X=0, Y=0);‘image’:使用 rcParams[“image.origin”] (默认 ‘upper’)。
-
extent:数据范围。指定绘图在坐标轴上的显示范围,格式为 (x0, x1, y0, y1)。如果指定了 X 和 Y,此参数会被忽略。
-
locator:若未通过 levels 参数明确指定等高线级别,则使用该定位器确定等高线级别。默认值为 MaxNLocator。
-
extend:扩展颜色映射。对于 contourf,决定如何为 levels 范围之外的值着色。可选 ‘neither’(不扩展),’min’,‘max’,‘both’。
-
antialiased:抗锯齿。是否启用抗锯齿以使线条更平滑。对于线轮廓,默认取自 rcParams[“lines.antialiased”] (默认 True)。
-
nchunk:域分块数。如果为正整数,将域划分为 nchunk x nchunk 子域进行计算,可用于减少内存使用和渲染工作量,但可能在块边界引入渲染伪影。若为 0,则不分块。
-
linewidths:仅适用于 contour 函数,用于指定等高线线条的宽度。若为单个数值,则所有级别等高线均使用该宽度;若为序列,则等高线级别按递增顺序依次使用序列中对应的宽度值。
-
linestyles:线型样式。可为单一线型(如 ‘–‘),也可为线型序列(如 [‘-‘, ‘–‘, ‘:’])。若序列短于层级数,则会循环使用。若为 None,默认为 ‘solid’,除非线条是单色的(此时负等高线可能使用 negative_linestyles 参数)。
-
negative_linestyles:负等高线线型。当 linestyles 为 None 且线条为单色时,此参数指定负等高线(或特定情况下)使用的线型。
-
hatches:仅适用于 contourf 函数,用于指定填充区域的交叉阴影图案。若为 None,则不在等高线填充区域添加阴影。
-
algorithm:指定用于计算等高线和多边形的等高线算法。这些算法在 ContourPy 中实现,如需了解更多信息,请参考 ContourPy 文档。
-
clip_path:设置裁剪路径,版本 3.8 中新增该参数。
-
data:可索引对象,可选若指定了该参数,所有参数均可接受字符串 s,当 s 是 data 中的键时,会将其解释为 data[s]。
通过调整这些参数,可以灵活控制等高线图的视觉效果。
# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + 2* np.cos(Y)
plt.figure(figsize=(8, 6))
# 绘制等高线图
# 定义等高线的具体数值(层级)
levels = [-2.5, -1.5, -0.5, 0, 0.5, 1.5, 2.5]
contour = plt.contour(X, Y, Z, # 传入网格数据和高度数据
levels=levels, # 指定等高线的具体数值
colors=['red', 'green', 'blue', 'black', 'purple', 'orange', 'brown'], # 每条等高线的颜色
linestyles=['--', '-', ':', '-', '--', '-', ':'], # 每条等高线的线型
linewidths=[1.0, 1.5, 2.0, 2.5, 2.0, 1.5, 1.0], # 每条等高线的线宽
)
plt.title('基础等高线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
可视化结果如下图所示:

使用示例:
-
示例 1:为等高线图添加标签
为等高线图添加标签可以更直观地理解每条等高线所代表的具体数值。在 Matplotlib 中,主要通过ax.clabel()函数来实现,其基本语法如下:
ax.clabel(contour_object, **kwargs)
其中:
contour_object是contour()函数的返回值,** kwargs是控制标签样式的参数,主要包括以下常用参数:
-
inline:布尔值,是否将标签嵌入到等高线中(默认 False);
-
fontsize:标签字体大小;
-
fmt:格式化字符串,控制标签的显示格式(如‘%.1f’表示保留一位小数);
-
colors:标签颜色;
-
manual:布尔值或数组,是否手动指定标签位置;
-
rightside_up:布尔值,确保标签始终正立显示。
# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + 2* np.cos(Y)
plt.figure(figsize=(8, 6))
# 绘制等高线图
levels = [-2.5, -1.5, -0.5, 0, 0.5, 1.5, 2.5]
contour = plt.contour(X, Y, Z,
levels=levels,
colors=['red', 'green', 'blue', 'black', 'purple', 'orange', 'brown'],
linestyles=['--', '-', ':', '-', '--', '-', ':'],
linewidths=[1.0, 1.5, 2.0, 2.5, 2.0, 1.5, 1.0],
)
# 为等高线添加数值标签
plt.clabel(
contour, # 传入contour函数的返回对象
inline=True, # 标签嵌入到等高线中(而非在旁边)
fmt='%1.1f', # 标签格式:保留1位小数的浮点数
fontsize=8, # 标签字体大小为8
rightside_up=True # 确保标签始终正立显示(即使等高线倾斜)
)
plt.title('为等高线图添加标签')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
可视化结果如下图所示:

-
示例 2:带填充效果的等高线图(contourf () 函数配合使用)
实际应用中contour()函数常将其与contourf()函数(填充等高线)结合使用,以增强视觉效果。contourf()的参数与contour()基本一致,区别在于它会填充相邻等高线之间的区域。
# 生成模拟数据
def terrain(x, y):
return np.exp(-0.1*(x**2 + y**2)) * np.cos(0.5*x) * np.sin(0.5*y)
x = np.linspace(-5, 5, 200)
y = np.linspace(-5, 5, 200)
X, Y = np.meshgrid(x, y)
Z = terrain(X, Y)
plt.figure(figsize=(12, 10))
# 使用填充等高线绘制地形基础色
# contourf用于绘制填充式等高线,50表示等高线数量(值越大细节越丰富
contourf = plt.contourf(X, Y, Z, 50, cmap='terrain')
# 在填充等高线基础上叠加线条等高线,增强地形轮廓
# 20表示线条等高线数量(少于填充等高线,避免过于密集)
contour = plt.contour(X, Y, Z, 20, colors='black', linewidths=0.5, alpha=0.5)
# 添加标签
plt.clabel(contour, fmt='%.1f', inline=True, fontsize=8)
# 添加颜色条
plt.colorbar(contourf, label='数值')
plt.title('带填充效果的等高线图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid(True, alpha=0.3)
# 添加一些标记点
plt.plot(0, 0, 'ro', markersize=10) # 中心点
plt.annotate('中心点', xy=(0, 0), xytext=(1, 1),
arrowprops=dict(arrowstyle='->'), fontsize=12)
plt.show()
可视化结果如下图所示:

更多内容可以前往官网查看:
https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师