如何基于三列不规则[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
相关产品推荐
相关产品推荐

