如何在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
相关产品推荐
相关产品推荐

