我学会了从this问题中合并python中两个矩形的网格网格点。合并的网格点是:
这里每个网格点都包含它们各自的值,我想绘制它的三维表面图。对于完整网格(没有空白点),我写下以下代码:
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)
我期待下面的图(不完全相似但不相似)作为最终的三维表面图:
我如何绘制三维表面图是我的情况?
谢谢。
编辑:我尝试使用以下代码段进行绘图:
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()

我的代码如下:
现在的问题是说明这个数字。颜色代码(高值的红色,低值的蓝色)不再有效。因为蓝色网格点的gridValues
(在第一个图中)很高,所以它们中的大多数应该在表面图中具有红色。因此,合并两个单独的三维表面图并不能解决我的问题。请帮忙!
答案 0 :(得分:2)
如果您的gridValue
数组大于带有(12,10)
的网格网格,则需要将gridValue
插入到正确的形状中。
在你的情况下,因为我想你想要用80
点绘制显示的形状,你需要为网格网格的形状构造gridValue
的数组,然后将80个网格值分配给gridValue
数组的正确位置,形状为(12,10)
。如何完全分配完全取决于您拥有的信息,因此我不能帮助您。但是,例如考虑蓝色和绿色网格的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()
重写。
如果要在2d中绘制它,请使用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()