如何从3D numpy meshgrid中提取二维平面数据?
我来帮你解决这个从3D网格中提取二维平面数据的问题!
问题根源分析
你遇到的问题主要有两个:
- 3D网格生成的
X、Y、sumEx、sumEy都是三维数组(形状为(N,N,N)),但2D版的quiver只接受二维数组,你之前只对电场分量做了切片,却忘了处理X和Y; - 2D
quiver的参数顺序是(X, Y, U, V),你之前的写法把参数位置搞错了。
正确实现方法
咱们一步步来修正:
确定目标平面的索引
你用round(N/2)来取中间平面的索引是对的——当N=11时,索引5刚好对应Z轴的0位置(因为你的Z网格是linspace(-4,4,11),第6个点就是0)。对所有相关数组做二维切片
把X、Y、sumEx、sumEy都提取出[:,:,zplane]的二维切片,这样它们的形状就变成(N,N),完全符合2D绘图的要求。调用正确的2D绘图函数
使用子图的ax.quiver,传入切片后的二维数组即可。
完整修正代码示例
在你完成3D电场计算后,添加这段代码:
# 提取Z=0平面的索引 zplane = round(N/2) # 对所有数组做二维切片,得到平面数据 X_slice = X[:, :, zplane] Y_slice = Y[:, :, zplane] Ex_slice = sumEx[:, :, zplane] Ey_slice = sumEy[:, :, zplane] # 绘制2D电场矢量图 fig, ax = plt.subplots() ax.quiver(X_slice, Y_slice, Ex_slice, Ey_slice, pivot='middle', normalize=True) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_title('Electric Field in Z=0 Plane') plt.show()
额外扩展:提取其他平面
如果需要提取X固定或Y固定的平面,比如X=0的平面,只需要调整切片的维度即可:
# 提取X=0平面的索引 xplane = round(N/2) # 提取Y、Z平面坐标和对应的电场分量 Y_slice = Y[xplane, :, :] Z_slice = Z[xplane, :, :] Ey_slice = sumEy[xplane, :, :] Ez_slice = sumEz[xplane, :, :] # 绘图 fig, ax = plt.subplots() ax.quiver(Y_slice, Z_slice, Ey_slice, Ez_slice, pivot='middle', normalize=True) ax.set_xlabel('Y') ax.set_ylabel('Z') ax.set_title('Electric Field in X=0 Plane') plt.show()
这样就能轻松提取任意二维平面的数据并完成绘图啦!
内容的提问来源于stack exchange,提问作者Wiggles
相关产品推荐
相关产品推荐

