我一直在尝试在 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()
我一直在尝试移动和缩放坐标,但我更喜欢从一开始就准确地绘制这个表面。
您尚未传递有关 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])