Python 绘制平面和正交向量时出现错误结果

Python 绘制平面和正交向量时出现错误结果,python,matplotlib,3d,orthogonal,Python,Matplotlib,3d,Orthogonal,我需要计算一个向量相对于另一个向量的分量,在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 =

我需要计算一个向量相对于另一个向量的分量,在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()
箭袋探针实际绘制指向目标点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()

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

要使显示空间具有相等的纵横比,有多种方法,但最简单的是

摆正 在所有边上使用相等的边距 对所有轴使用相等的限制。 这可能看起来像这样

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()