You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于三列不规则[X Y Z]数据绘制contourf等高线图

不规则[X Y Z]三列散点数据绘制填充等高线实现方案

contourf原生仅支持传入规整二维网格坐标及对应网格点的数值,不规则分布的散点格式数据无法直接传入,可通过以下两种成熟路径实现绘图:


方案1:散点插值到规整网格后调用contourf

这是最通用的实现方式,输出的等高线平滑度可控,适合绝大多数场景,操作步骤如下:

  • 拆分原始数据:将三列数据分别拆分为长度一致的一维x、y、z数组,同一下标对应单个采样点的横纵坐标、观测值
  • 构建目标网格:根据原始数据的横纵坐标范围,按需求的绘图精度生成横纵轴等间隔序列,再通过np.meshgrid生成二维网格坐标
  • 网格插值:选用合适的插值算法,将散点的Z值映射到刚生成的规整网格点上,常用插值选项:
    • linear:线性插值,计算速度最快,适合采样点密度较高的场景
    • cubic:三次插值,输出平滑度最高,适合需要顺滑等高线的场景
    • nearest:最近邻插值,无平滑效果,适合离散分类值的可视化
  • 传入contourf绘图:将生成的二维网格坐标、插值得到的二维Z值矩阵直接传入plt.contourf即可

最简实现代码参考:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# 替换为自身的原始数据
x = np.array([/* 你的X列数据 */])
y = np.array([/* 你的Y列数据 */])
z = np.array([/* 你的Z列数据 */])

# 生成100*100分辨率的规整网格
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
xi_grid, yi_grid = np.meshgrid(xi, yi)

# 三次插值得到网格对应Z值
zi_grid = griddata((x, y), z, (xi_grid, yi_grid), method='cubic')

# 绘制填充等高线
plt.figure(figsize=(8, 6))
cf = plt.contourf(xi_grid, yi_grid, zi_grid, levels=20, cmap="viridis")
plt.colorbar(cf, label="Z value")
# 可选:叠加原始采样点查看分布
plt.scatter(x, y, s=3, c="k", alpha=0.4)
plt.show()

方案2:直接使用三角剖分等高线接口,无需手动构建网格

Matplotlib原生提供tricontourf接口,内部会自动对不规则散点做三角剖分生成等高线,不需要提前构建meshgrid、也不需要手动插值,适合快速出图、不想引入插值误差的场景。

最简实现代码参考:

import numpy as np
import matplotlib.pyplot as plt

# 替换为自身的原始数据
x = np.array([/* 你的X列数据 */])
y = np.array([/* 你的Y列数据 */])
z = np.array([/* 你的Z列数据 */])

plt.figure(figsize=(8, 6))
cf = plt.tricontourf(x, y, z, levels=20, cmap="viridis")
plt.colorbar(cf, label="Z value")
plt.show()

注意事项:如果原始采样点分布极不均匀、研究区域存在无数据的空洞,插值法可能会在无采样点的区域生成不符合实际的虚假等高线,这类场景需要对插值结果做掩膜处理,将距离原始采样点过远的网格值设为空值后再绘图。

内容的提问来源于stack exchange,提问作者Anurag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:15:45