绘制平面和正交向量时的错误结果

Wrong result when plotting a plane and an orthogonal vector

我需要在 3D 中计算一个向量相对于另一个向量的分量。显示结果时,虽然我对它下面的简单数学很有信心,但可视化是完全错误的。

我写了一个小脚本来重现这个问题。该平面为 z = x + y,即 x + y - z = 0。与其正交的向量为 (1, 1, -1)。然而,当用quiver绘制时,视觉结果是错误的。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X,Y = np.meshgrid(np.arange( -1,  1, 0.1), np.arange( -1, 1, 0.1))
XX = X.flatten()
YY = Y.flatten()
Z = X + Y 
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)

ax.scatter(1, 1, -1, c="orange", s=20, marker='o')

ax.quiver(0, 0, 0, 1, 1, -1, color="blue")
plt.show()

quiver探测实际绘制指向目标点(1, 1, -1)的向量,平面实际上是正确的,但它们不是正交的。

我是不是遗漏了一些非常明显的东西,还是仅仅是视角问题?

我认为这是一个缩放问题。您可以使用 ax.set_xlim3d 为所有轴设置相同的范围。

看起来不错:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X,Y = np.meshgrid(np.arange( -1,  1, 0.1), np.arange( -1, 1, 0.1))
XX = X.flatten()
YY = Y.flatten()
Z = X + Y 
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)

ax.scatter(1, 1, -1, c="orange", s=20, marker='o')

ax.quiver(0, 0, 0, 1, 1, -1, color="blue")

ax.set_xlim3d(-1,1) 
ax.set_ylim3d(-1,1) 
ax.set_zlim3d(-1,1) 

plt.show()

橙色点是正确的,正确的?所以指向那个点的向量也是正确的,因为它从原点开始。所以唯一的问题是,虽然矢量是正确的并且与数据中的平面正交 space,但它不在显示中 space。

要使显示 space 具有相同的纵横比,有 pretty hacky solutions 但最简单的是

  1. 做一个正方形
  2. 在所有边上使用相等的边距
  3. 对所有轴使用相同的限制。

这可能看起来像这样。

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

fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
fig.subplots_adjust(.1,.1,.9,.9)
ax.set(xlim=(-2,2), ylim=(-2,2), zlim=(-2,2))

X,Y = np.meshgrid(np.arange( -1,  1, 0.1), np.arange( -1, 1, 0.1))
Z = X + Y 
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)

ax.scatter(1, 1, -1, c="orange", s=20, marker='o')
ax.quiver(0, 0, 0, 1, 1, -1, color="blue")
plt.show()