python - 如何从 3D numpy meshgrid 中提取 2D 平面

标签 python numpy matplotlib grid plane

[TLDR]:

基本上我的问题归结为如何从 3D numpy meshgrid 中提取平面的 2d 数据

[详细说明]:

我正在计算两个(或更多)点电荷的电场。我在 2D 中做了这个,可以使用 quiver 或 streamplot 通过 matplotlib 绘制结果

import numpy as np
from matplotlib import pyplot as plt

eps_0 = 8e-12
fac = (1./(4*np.pi*eps_0))

charges  = [1.0,-1.0]
qx       = [-2.0,2.0]
qy       = [0.0,0.0]

# GRID
gridsize = 4.0
N = 11
X,Y = np.meshgrid( np.linspace(-gridsize,gridsize,N),
                   np.linspace(-gridsize,gridsize,N))
# CALC E-FIELD   
sumEx = np.zeros_like(X)
sumEy = np.zeros_like(Y)

for q, qxi, qyi in zip(charges,qx,qy):
    dist_vec_x = X - qxi
    dist_vec_y = Y - qyi 
    dist = np.sqrt(dist_vec_x**2 + dist_vec_y**2)

    Ex = fac * q * (dist_vec_x/dist**3)
    Ey = fac * q * (dist_vec_y/dist**3)

    sumEx += Ex
    sumEy += Ey

# PLOT
fig = plt.figure()
ax = fig.add_subplot(111)
ax.streamplot(X,Y,sumEx,sumEy)
plt.show()

这会产生正确的结果 2D dipole

我可以轻松地将其扩展到 3D

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt

eps_0 = 8e-12
fac = (1./(4*np.pi*eps_0))

charges = [1.0,-1.0]
qx      = [-2.0,2.0]
qy      = [0.0,0.0]
qz      = [0.0,0.0]

# GRID
gridsize = 4.0
N = 11
X,Y,Z = np.meshgrid( np.linspace(-gridsize,gridsize,N),
                     np.linspace(-gridsize,gridsize,N),
                     np.linspace(-gridsize,gridsize,N))

# CALC E-FIELD   
sumEx = np.zeros_like(X)
sumEy = np.zeros_like(Y)
sumEz = np.zeros_like(Z)
for q, qxi, qyi, qzi in zip(charges,qx,qy,qz):
    dist_vec_x = X - qxi
    dist_vec_y = Y - qyi
    dist_vec_z = Z - qzi

    dist = np.sqrt(dist_vec_x**2 + dist_vec_y**2 + dist_vec_z**2)

    Ex = fac * q * (dist_vec_x/dist**3)
    Ey = fac * q * (dist_vec_y/dist**3)
    Ez = fac * q * (dist_vec_z/dist**3)

    sumEx += Ex
    sumEy += Ey
    sumEz += Ez  

# PLOT
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.quiver(X,Y,Z,sumEx,sumEy,sumEz, pivot='middle', normalize=True)
plt.show()

在 3D 中绘制时,这也会产生正确的结果(据我所知)

3D dipole

但出于某种原因,我不知道如何从生成的 3D numpy 网格中提取一个 x-y 平面的数据。我以为我可以做类似的事情

zplane = round(N/2)
ax.quiver(X,Y,sumEx[:,:,zplane],sumEy[:,:,zplane])

但这并不能解决问题。有谁知道这里的正确方法吗?

最佳答案

删除 projection='3d' 和索引 XY:

fig = plt.figure()
ax = fig.gca()
zplane = round(N / 2)
ax.quiver(X[:, :, zplane], Y[:, :, zplane], sumEx[:, :, zplane], sumEy[:, :, zplane])
plt.show()

如果您选择特定的 zplane,您的绘图将不再是 3D 绘图。

关于python - 如何从 3D numpy meshgrid 中提取 2D 平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50489505/

相关文章:

python - 找到python中分数列表的最小公分母

Python套接字蓝牙

python - 如何在 Python 中应用分段线性拟合?

python - 如何让这个过程更快?

python - Matplotlib:如何设置当前图形?

python - 使用 matplotlib,如何使轴标签的背景变白?

python - 如何在 Django 模板中的 {% %} 之间使用变量

python - 在Python中,当两个文件都未排序时,我应该如何有效地对一个大文件进行排序以匹配另一个大文件中的公共(public)元素?

python - Numpy 转置用法

Jupyter Notebook 中内联后端的 matplotlib 配置