如何使用Numpy绘制矢量场?

问题描述 投票:0回答:2

想法是绘制以下矢量字段:

enter image description here

我有两个主要问题:

1)我不知道如何确保箭头不会太长(我知道我必须使用length,但是如何?)。

2)我被告知使用Numpyto绘制矢量场但是又如何?

这是我尝试过的:

# The components of the vector field 
F_x = y*e**x
F_y = x**2 + e**x
F_z = z**2*e**z

# The grid
xf = np.linspace(-0.15, 2.25, 8)
yf = np.linspace(-0.15, 2.25, 8)
zf = np.linspace(-0.75, 2.50, 8)
X_grid, Y_grid, Z_grid = np.meshgrid(xf, yf, zf)

# The arrows; how to deal with them?
dx = 1
#dy = ...
#dz = ...

# Standardize the arrows; In this way all arrows have the same length.
length = np.sqrt(dx**2 + dy**2 + dz**2)
dx_N = dx/length
dy_N = dy/length
dz_N = dz/length

#how to involve numpy in the process??

# Drawing the figure
fig, ax = plt.subplots(1, 1)
ax.quiver(X_grid, Y_grid, Z_grid, dx_N, dy_N, dz_N, dy, dz, cmap=plt.get_cmap('gnuplot2'))
plt.show()

谢谢

编辑

根据提供的链接,我试过:

from sympy import *
x,y,z = sp.symbols('x y z', real = True)
import matplotlib.pyplot as plt
x, y, z = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
F_x = y * exp(x)
F_y = x**2 + exp(x)
F_z = z**2 * exp(z)

# Normalize the arrows:
F_x = F_x / np.sqrt(F_x**2 + F_y**2 + F_z**2)
F_y = F_y / np.sqrt(F_x**2 + F_y**2 + F_z**2)
F_z = F_z / np.sqrt(F_x**2 + F_y**2 + F_z**2)

plt.figure()
plt.title('Vector field')
Q = plt.quiver(x, y, z, F_x, F_y, F_z, units='width')
qk = plt.quiverkey(Q, 0.9, 0.9, 2, r'$2 \frac{m}{s}$', labelpos='E',
                   coordinates='figure')#I don't understand this line

TypeError:Shape应该只包含整数。

问题是我不理解这部分代码:

qk = plt.quiverkey(Q, 0.9, 0.9, 2, r'$2 \frac{m}{s}$', labelpos='E',
                       coordinates='figure')

我仍然坚持如何绘制这个矢量场

python numpy matplotlib plot
2个回答
1
投票

假设您想要3D箭袋,您可以查看matplotlib tutorial on quiver3D。要控制箭头大小,请查看Axes3d.quiver library doc,尤其是参数。

一个快速片段:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
x, y, z = np.meshgrid(np.arange(0, 2*np.pi, .5), np.arange(0, 2*np.pi, .5), np.arange(0, 2*np.pi, .5))

F_x = y * np.exp(x)
F_y = x**2 + np.exp(x)
F_z = z**2 * np.exp(z)

fig = plt.figure()
ax = fig.gca(projection='3d')

Q = ax.quiver(x, y, z, F_x, F_y, F_z, length=0.3, normalize=True)

但是3D箭袋情节可能非常拥挤! :)


1
投票

quiver()方法是渲染矢量场的好工具。由于Matplotlib是一个二维绘图库,我们需要导入mplot3d工具包来生成三维绘图。

这是一个很好的example

依赖关系: Axes3D用于3D渲染 Pyplot得到一个类似MATLAB的绘图框架 Numpy 用于数值数组操作

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

x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.25),
                      np.arange(-0.8, 1, 0.25),
                      np.arange(-0.8, 1, 0.8))

u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z))


fig = plt.figure()
ax = fig.gca(projection='3d')

ax.quiver(x, y, z, u, v, w,
          length=0.15,
          color='Purple'
          )


ax.view_init(elev=10, azim=30)
ax.dist=8

plt.show()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.