在 Mayavi 中绘制曲面时坐标不正确?

问题描述 投票:0回答:1

我一直在尝试在 Mayavi 中绘制隐式立方曲面,但是,当我绘制曲面时,曲面的坐标全部错误。它应该为所有轴绘制从 -10 到 10 的范围,但我得到的是:

这是重现此问题的代码:

import numpy as np
from mayavi import mlab


k = 2
x, y, z = np.ogrid[-10: 10: 200j, -10: 10: 200j, -10: 10: 200j]

F = x**2 + y**2 + z**2 - x * y * z - k - 2

mlab.contour3d(F, contours=[0])
mlab.axes()
mlab.show()

我一直在尝试移动和缩放坐标,但我更喜欢从一开始就准确地绘制这个表面。

python numpy mayavi mayavi.mlab
1个回答
0
投票

您尚未传递有关 x、y 和 z 的任何信息。所以索引被用作坐标。

理解 F 不包含 -10:10 的任何内容。它是根据从 -10 到 10 的值计算的。但它本身不包含 x、y、z 信息。

只是为了用更简单的 1d 示例来澄清(和 matplotlib,因为我破坏了我的 malavi 安装。但同样的问题),

import matplotlib.pyplot as plt

x=np.ogrid[-10:10:100j]
f=np.sin(x)
plt.plot(f)
# or
x2=np.ogrid[-1:1:100j]
f2=np.sin(10*x2)
plt.plot(f2)

将绘制完全相同的事物的两次(下面的第一张图)。因为 f 和 f2 是完全相同的数组。一个是从 -10 到 10 的 x 中得到的,公式为

sin(x)
。另一个是 x 从 -1 到 1,公式为
sin(10x)
。但 matplotlib 无法猜测这一点。它看到的只是 100 个数字。 因此它绘制 x 轴的索引(从 0 到 99),以及 y 轴的这 100 个值。

如果你想让 ax x 显示原始值,你必须

plt.plot(x, f)
# or
plt.plot(x2,f2)

给出下面的第二张和第三张图

所以,对于马拉维来说也是一样的。如果传递 f 值的 3d 数组,它只有值。并使用该 3d 数组的索引作为轴。

如果你想使用原来的x,y,z,你必须传递它们

mlab.contour3d(x,y,z,F, contours=[0])
© www.soinside.com 2019 - 2024. All rights reserved.