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

Posted

技术标签:

【中文标题】绘制平面和正交向量时的错误结果【英文标题】:Wrong result when plotting a plane and an orthogonal vector 【发布时间】:2020-01-01 21:08:01 【问题描述】:

我需要以 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) 的矢量,平面实际上是正确的,但它们不是正交的。

我是否遗漏了一些非常明显的东西,或者只是一个视角问题?

【问题讨论】:

【参考方案1】:

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

为了使显示空间具有相等的纵横比,有pretty hacky solutions,但最简单的是

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

这可能看起来像这样。

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

【讨论】:

【参考方案2】:

我认为这是一个扩展问题。您可以使用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()

【讨论】:

以上是关于绘制平面和正交向量时的错误结果的主要内容,如果未能解决你的问题,请参考以下文章

绘制 3D 非正交坐标

推送到成员向量时的段错误

计算几何--平面向量

如何用MATLAB将特征向量标准化

R:如何在 ggplot2 中绘制 svm 的超平面和边距?

支持向量机+sklearn绘制超平面