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

如何在matplotlib中绘制等高线?遇TypeError报错求助

解决Matplotlib等高线图报错:TypeError: Input z must be 2D, not 1D

错误原因

你用np.meshgrid(x, y)生成的X和Y是30×30的二维数组(因为x、y各有30个元素),但你的z是一维数组(仅30个元素),三者维度不匹配,导致contourf报错要求z必须为二维。

你的数据是6组非规则散点,每组对应固定的z值,每组包含5个(x,y)点,这类数据不能直接用常规contourf+meshgrid组合绘制,需要调整处理方式。

解决方案

方案1:用tricontourf直接绘制非规则散点等高线

tricontourf专门适配非规则网格的散点数据,无需转换维度,直接传入一维的x、y、z即可:

import numpy as np
import matplotlib.pyplot as plt

x= [7.7, 7.7, 7.7, 7.7, 7.7, 6.7, 6.7, 6.7, 6.7, 6.7, 5.8, 5.8, 5.8, 5.8, 5.8, 4.8, 4.8, 4.8, 4.8, 4.8, 3.9, 3.9, 3.9, 3.9, 3.9, 2.9, 2.9, 2.9, 2.9, 2.9]
y= [3, 4, 5, 6, 7, 2, 4.5, 5, 6.7, 8, 3.2, 4.5, 5.5, 6, 7.5, 4.3, 8.5, 7, 6.4, 3.5, 2.4, 4.5, 6.8, 7.5, 8, 2.5, 4.3, 5.4, 7.6, 8.2]
z= [1, 1, 1, 1, 1, 1.5, 1.5, 1.5, 1.5, 1.5, 2, 2, 2, 2, 2, 2.5, 2.5, 2.5, 2.5, 2.5, 3, 3, 3, 3, 3, 3.5, 3.5, 3.5, 3.5, 3.5]

fig, ax = plt.subplots(1,1)
# 绘制三角等高线
cp = ax.tricontourf(x, y, z)
# 叠加原始散点
ax.scatter(x, y, color='green')
fig.colorbar(cp)
plt.show()

方案2:插值生成规则网格后绘制

如果需要规则网格的平滑等高线效果,可以用插值将散点数据转换为规则网格:

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

x= [7.7, 7.7, 7.7, 7.7, 7.7, 6.7, 6.7, 6.7, 6.7, 6.7, 5.8, 5.8, 5.8, 5.8, 5.8, 4.8, 4.8, 4.8, 4.8, 4.8, 3.9, 3.9, 3.9, 3.9, 3.9, 2.9, 2.9, 2.9, 2.9, 2.9]
y= [3, 4, 5, 6, 7, 2, 4.5, 5, 6.7, 8, 3.2, 4.5, 5.5, 6, 7.5, 4.3, 8.5, 7, 6.4, 3.5, 2.4, 4.5, 6.8, 7.5, 8, 2.5, 4.3, 5.4, 7.6, 8.2]
z= [1, 1, 1, 1, 1, 1.5, 1.5, 1.5, 1.5, 1.5, 2, 2, 2, 2, 2, 2.5, 2.5, 2.5, 2.5, 2.5, 3, 3, 3, 3, 3, 3.5, 3.5, 3.5, 3.5, 3.5]

# 转换为numpy数组
x_np = np.array(x)
y_np = np.array(y)
z_np = np.array(z)

# 创建规则网格,可调整100为更大数值提升精度
xi = np.linspace(x_np.min(), x_np.max(), 100)
yi = np.linspace(y_np.min(), y_np.max(), 100)
xi, yi = np.meshgrid(xi, yi)

# 插值计算网格点的z值,method可选'linear'/'nearest'/'cubic'
zi = griddata((x_np, y_np), z_np, (xi, yi), method='linear')

# 绘制等高线
fig, ax = plt.subplots(1,1)
cp = ax.contourf(xi, yi, zi)
ax.scatter(x_np, y_np, color='green', label='原始点')
fig.colorbar(cp)
ax.legend()
plt.show()

关键说明

  • 常规contourf要求X、Y、Z必须是维度完全一致的二维数组,对应规则网格的每个点。
  • 非规则散点数据优先用tricontourf,无需额外转换;如果需要规则网格效果,再用插值方法处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:24:26