python - 使用Python中不同大小网格点的数据生成3D曲面图

标签 python python-3.x numpy matplotlib

我从 this 学会了在 python 中合并两个矩形的网格点问题。合并后的网格点为:

enter image description here

这里每个网格点都包含它们各自的值,我想绘制它的 3D 曲面图。对于完整的网格(没有空白点),我会编写以下代码:

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x=np.arange(0,10,1)
y=np.arange(0,12,1)
X, Y = np.meshgrid(x,y)
print (Y)
Z = gridValue.reshape(X.shape)
cset = ax.pcolormesh(X, Y, Z, cmap=cm.coolwarm, linewidth =0, antialiased = False)
ax.clabel(cset, fontsize=9, inline=1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('σ ')
fig.colorbar(cset, shrink=0.5, aspect =5)
plt.show()

当我尝试使用上面的代码绘制网格值(80 点)时,我收到一个明显的错误:

ValueError: cannot reshape array of size 80 into shape (12,10)

我期待下图(不完全相同,但类似)作为最终的 3-D 曲面图:

enter image description here

我的情况如何绘制 3D 曲面图?

谢谢。

编辑:我尝试使用以下代码片段进行绘图:

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x1=np.arange(0,2,1)
x2 = np.arange(0,10,1)
y1 =np.arange(0,5,1)
y2=np.arange(5,12,1)
Y1, X1 = np.meshgrid(x1,y1)
Y2, X2 = np.meshgrid(x2,y2)
gridValue1 = gridValue[:10]
gridValue2 = gridValue[10:]
Z1 = gridValue1.reshape(X1.shape)
Z2 = gridValue2.reshape(X2.shape)
cset1 = ax.plot_surface(X1, Y1, Z1, cmap=cm.coolwarm, linewidth =0, antialiased = False)
cset2 = ax.plot_surface(X2, Y2, Z2, cmap=cm.coolwarm, linewidth =0, antialiased = False)
ax.clabel(cset1, fontsize=9, inline=1)
ax.clabel(cset2, fontsize=9, inline=1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('σ ')
plt.show()

我用这段代码得到了下图:

enter image description here

现在的问题是如何说明这个图。颜色代码(红色表示高值,蓝色表示低值)不再有效。由于蓝色网格点(第一张图中)的 gridValues 较高,因此它们中的大多数在曲面图中应为红色。因此,合并两个单独的 3-D 曲面图并不能解决我的问题。如有任何帮助,请!

最佳答案

如果您的 gridValue 数组大于 (12,10) 的网格网格,您需要将 gridValue 插值到正确的形状。 在你的情况下,因为我猜你想用 80 点绘制显示的形状,所以你需要使用网格的形状为 gridValue 构造一个数组,然后分发将 80 个网格值移动到形状为 (12,10)gridValue 数组的正确位置。如何进行分发完全取决于您所拥有的信息,因此不幸的是我无法帮助您。但例如考虑蓝色和绿色网格的 y 排序顺序分布:

gridValue_new = np.zeros_like(X)
gridValue_new[:, 0] = gridValue[:12]
gridValue_new[:, 1] = gridValue[12:24]
gridValue_new.reshape(-1)[:8, 2:] = gridValue[24:]

前两个线分布点也可以使用reshape()重写。

如果您想以二维方式绘制它,请使用pcolormesh。 对于 3d 绘图,使用 ax.plot_surface() 可以满足您的需求。 如果您想在一个轴上绘制两个网格,请执行以下操作:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

X, Y = np.meshgrid(np.arange(0, 10, 1), np.arange(0, 12, 1))
X1 = X[5:, :]
Y1 = Y[5:, :]
X2 = X[0:5, 0:2]
Y2 = Y[0:5, 0:2]
Z1 = np.random.rand(7, 10)  # generating some random grid values
Z2 = np.random.rand(5, 2)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X1, Y1, Z1)
ax.plot_surface(X2, Y2, Z2)

要获得正确的颜色条,请获取数组的最小/最大值:

vmin = gridValue.min()
vmax = gridValue.max()

并将两者作为参数传递给 plot_surface():

cset1 = ax.plot_surface(X1, Y1, Z1, cmap=cm.coolwarm, linewidth =0, antialiased = False, vmin=vmin, vmax=vmax)
cset2 = ax.plot_surface(X2, Y2, Z2, cmap=cm.coolwarm, linewidth =0, antialiased = False, vmin=vmin, vmax=vmax)

所以你的完整代码将如下所示:

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x1=np.arange(0,2,1)
x2 = np.arange(0,10,1)
y1 =np.arange(0,5,1)
y2=np.arange(5,12,1)
Y1, X1 = np.meshgrid(x1,y1)
Y2, X2 = np.meshgrid(x2,y2)
gridValue1 = gridValue[:10]
gridValue2 = gridValue[10:]
Z1 = gridValue1.reshape(X1.shape)
Z2 = gridValue2.reshape(X2.shape)
vmin = gridValue.min()
vmax = gridValue.max()
cset1 = ax.plot_surface(X1, Y1, Z1, cmap=cm.coolwarm, linewidth =0, antialiased = False, vmin=vmin, vmax=vmax)
cset2 = ax.plot_surface(X2, Y2, Z2, cmap=cm.coolwarm, linewidth =0, antialiased = False, vmin=vmin, vmax=vmax)
ax.clabel(cset1, fontsize=9, inline=1)
ax.clabel(cset2, fontsize=9, inline=1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('σ ')
plt.show()

关于python - 使用Python中不同大小网格点的数据生成3D曲面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368416/

相关文章:

python - XGBoost R 与 python - 不同的性能和功能重要性

python - 更新了 : reshape each row data into a (x, 1) 数组

python-3.x - Ansible 使用 venv 模块创建一个 virtualenv

python - tensorflow:如何喂养 numpy.ndarray?

python - 使用 pandas.to_csv(df) 仅在 Excel 中显示 numpy.array 的子集

python - vscode python重构失败

python - 反转 'edit_post',参数为 '(' ', )' not found. 1 pattern(s) tried: [' edit_post/(?P<post_id>\\d+)/$']

python - 增加 pandas GroupBy 中满足条件的计数

Python3快速查找集合中是否有任何元素是字符串的子串

python - 从 numpy 数组中查找并删除列