import matplotlib.pyplot as pltimport numpy as npplt.style.use('_mpl-gallery')# Make datan = 4x = np.linspace(-1, 1, n)y = np.linspace(-1, 1, n)z = np.linspace(-1, 1, n)X, Y, Z = np.meshgrid(x, y, z)U = (X + Y)/5V = (Y - X)/5W = Z*0# Plotfig, ax = plt.subplots(subplot_kw={"projection": "3d"})ax.quiver(X, Y, Z, U, V, W)ax.set(xticklabels=[], yticklabels=[], zticklabels=[])plt.show()
# 1. 导入库import matplotlib.pyplot as pltimport numpy as np# 2. 设置内置绘图样式plt.style.use('_mpl-gallery')# 3. 生成三维网格数据n = 4 # 每个维度上取 4 个等间距点。# 在区间 [-1, 1] 内生成包含 n 个点的等差数列,# 因此 x, y, z 均为 [-1, -1/3, 1/3, 1] 这样的值(具体值由 n 决定)。x = np.linspace(-1, 1, n)y = np.linspace(-1, 1, n)z = np.linspace(-1, 1, n)X, Y, Z = np.meshgrid(x, y, z) # 生成三维网格坐标。X, Y, Z 均为形状 (4,4,4) 的三维数组,分别代表每个网格点的 x、y、z 坐标。# 4. 定义向量场U = (X + Y)/5V = (Y - X)/5W = Z*0# U、V、W 分别表示每个网格点上向量的三个分量。# U = (X + Y)/5:x 方向分量与网格点的 (X+Y) 成正比,除以 5 是为了缩放箭头长度,避免箭头太长或太短。# V = (Y - X)/5:y 方向分量与 (Y-X) 成正比。# W = Z * 0:z 方向分量为零,因此所有箭头都平行于 XY 平面(即在水平面内),没有垂直分量。# 这个向量场实际上是一个简单的旋转场:(U, V) = ((x+y)/5, (y-x)/5),它描述了一个围绕原点的旋转运动(类似于刚体旋转的切向速度分布)。# 5. 创建 3D 图形并绘制箭头fig, ax = plt.subplots(subplot_kw={'projection': '3d'}) # 创建一个带 3D 坐标轴的子图。ax.quiver(X, Y, Z, U, V, W)# 在三维空间中绘制箭头。每个箭头的起点为 (X[i,j,k], Y[i,j,k], Z[i,j,k]),# 方向由 (U[i,j,k], V[i,j,k], W[i,j,k]) 决定。由于 W 全为零,所有箭头都水平放置。# 6. 隐藏坐标轴刻度标签ax.set(xticklabels=[], yticklabels=[], zticklabels=[])# 7. 显示图形plt.show()