Python:如何合并np.meshgrid生成的2D数组以绘制单一3D曲面图
问题原因
matplotlib的plot_surface函数要求传入的X、Y、Z参数均为二维网格数组,你直接使用默认参数的np.append会自动将输入数组扁平化后拼接为一维数组,因此触发报错。
解决方案
方案1:规则网格沿坐标轴拼接(效率最优)
如果你的两个曲面沿某一坐标轴连续分布、且另一坐标轴的采样范围和点数完全一致(比如示例中两个曲面的X轴均为0到1采样100个点,Y轴分别为0-1和1-2的连续区间),可以使用np.concatenate指定拼接轴,保留数组的二维结构:
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm fig = plt.figure(figsize=(8,4)) ax = fig.add_subplot(projection='3d') # 生成第一个曲面网格 x1 = np.linspace(0,1,100) y1 = np.linspace(0,1,100) X1,Y1 = np.meshgrid(x1,y1) Z1 = 2*Y1 # 生成第二个曲面网格,支持任意倾斜角度的Z函数 x2 = np.linspace(0,1,100) y2 = np.linspace(1,2,100) X2,Y2 = np.meshgrid(x2,y2) Z2 = 3*Y2 + X2 # 可替换为任意自定义函数 # 沿Y轴对应维度(axis=0)拼接二维网格 X = np.concatenate([X1, X2], axis=0) Y = np.concatenate([Y1, Y2], axis=0) Z = np.concatenate([Z1, Z2], axis=0) # 绘制合并后的单一曲面 solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True) plt.show()
如果是沿X轴拼接,只需将拼接轴改为axis=1即可。
方案2:通用任意曲面合并(适配所有场景)
如果两个曲面是不规则分布、网格采样不对齐,可以使用plot_trisurf替代plot_surface,无需严格的二维网格结构,直接传入所有点的一维坐标即可自动生成三角网格曲面:
# 拼接所有网格点的一维坐标 X_all = np.concatenate([X1.flatten(), X2.flatten()]) Y_all = np.concatenate([Y1.flatten(), Y2.flatten()]) Z_all = np.concatenate([Z1.flatten(), Z2.flatten()]) # 直接绘制三角曲面 ax.plot_trisurf(X_all, Y_all, Z_all, cmap=cm.coolwarm, linewidth=0, antialiased=True)
该方案支持任意形状、任意倾斜角度的曲面合并,无需提前对齐网格,仅在数据点量级极大时渲染效率略低于方案1。
内容的提问来源于stack exchange,提问作者Mateus Forcelini
相关产品推荐
相关产品推荐

