基于Python Matplotlib绘制非结构化网格温度数据的填充等高线图
解决非结构化网格数据的填充等高线图绘制问题
你的问题核心在于contourf要求输入的Z必须是和X、Y匹配的2D数组,但你的temp是1D的,且非结构化网格无法直接用meshgrid生成对应网格。以下是两种可行的解决方案:
方法一:插值到规则网格(适合需要规则网格输出的场景)
使用scipy.interpolate.griddata将非结构化的1D温度数据插值到规则网格上,再用contourf绘制:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import griddata # 假设x、y、temp是已加载的1D数组 x = np.asarray(x) y = np.asarray(y) temp = np.asarray(temp) # 生成规则网格的坐标范围 xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) Xi, Yi = np.meshgrid(xi, yi) # 插值得到2D的温度数据 Zi = griddata((x, y), temp, (Xi, Yi), method='cubic') # 可选linear/nearest/cubic # 绘制填充等高线 fig, ax = plt.subplots(1, 1) contour = ax.contourf(Xi, Yi, Zi) plt.colorbar(contour) plt.show()
linspace的100可按需调整,数值越大网格精度越高griddata的method参数:nearest速度最快但精度最低,linear是线性插值,cubic插值结果更平滑
方法二:直接基于三角剖分绘制(适合保留原始网格结构的场景)
利用matplotlib.tri.Triangulation对非结构化点做三角剖分,用tricontourf直接绘制,无需转换为规则网格:
import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as tri # 假设x、y、temp是已加载的1D数组 x = np.asarray(x) y = np.asarray(y) temp = np.asarray(temp) # 创建三角剖分对象 triang = tri.Triangulation(x, y) # 绘制填充等高线 fig, ax = plt.subplots(1, 1) contour = ax.tricontourf(triang, temp) plt.colorbar(contour) plt.show()
- 该方法直接使用原始非结构化点,无需插值,能更精准反映原始数据分布
- 若点分布存在异常(如凹域),可借助
tri.TriAnalyzer过滤不合理的三角形
内容的提问来源于stack exchange,提问作者aytas31
相关产品推荐
相关产品推荐

