【问题标题】: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) 的矢量,平面实际上是正确的,但它们不是正交的。

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

【问题讨论】:

    标签: python matplotlib 3d orthogonal


    【解决方案1】:

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

    为了使显示空间具有相等的纵横比,有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()
    

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2018-06-18
        相关资源
        最近更新 更多