使用 mayavi 组合多个图

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

我有一个 3D 等高线图,是用 python 的 mayavi 库制作的,我想在其中绘制一些箭头。对于等值线图,我使用

mlab.contour3d
和箭头
mlab.quiver3d
链接到 mlab 文档到 quiver3d到轮廓3d)。为了使示例简单,我在这里使用球体作为轮廓。只要我分别绘制这两件事,即在不同的运行中,它就可以正常工作,请参见下图。

Two separated plots

但是,当我尝试合并两个图时,它无法正常工作,两个图的坐标似乎不匹配,请参见下图,其中箭头位于左下角非常小的位置。我也不知道轴及其标签发生了什么。

combined plots

这是我的代码:

import numpy as np
from mayavi import mlab

# starting coordinates of vector
x = np.array([2.])
y = np.array([1.])
z = np.array([0.])

# components for vectors
u = np.array([3.])
v = np.array([0.])
w = np.array([0.])

# making 3D arrays for quiver3d
XX, YY, ZZ = np.meshgrid(x, y, z)
UU, VV, WW = np.meshgrid(u, v, w)

# coordinates for caluclating the sphere
x_arr = np.linspace(0,5,50)
y_arr = np.linspace(0,5,50)
z_arr = np.linspace(0,5,50)

# center and radius of sphere
xc = 2
yc = 2.5
zc = 3
r  = 2

# make the sphere
data2plot = np.zeros( (len(x_arr), len(y_arr), len(z_arr)) )
for ii in range(len(x_arr)):
    for jj in range(len(y_arr)):
        for kk in range(len(z_arr)):
            if np.sqrt( (x_arr[ii]-xc)**2 
                       +(y_arr[jj]-yc)**2 
                       +(z_arr[kk]-zc)**2 ) < r:
                data2plot[ii,jj,kk] = 1


fig1 = mlab.figure( bgcolor=(1,1,1), fgcolor=(0,0,0))

# contour plot and arrow-plot, separately, they work, combined not
xx_arr, yy_arr, zz_arr = np.meshgrid(x_arr, y_arr, z_arr, indexing='ij')
contPlot = mlab.contour3d( xx_arr, yy_arr, zz_arr, data2plot, 
                           transparent=True, opacity=.4, figure=fig1)
arrowPlot = mlab.quiver3d(XX, YY, ZZ, UU, VV, WW, 
                          line_width=1, mode='arrow', figure=fig1 )

ax1 = mlab.axes( color=(1,1,1), nb_labels=4 )

mlab.show()

非常感谢任何关于我遗漏或做错的事情的提示!

python 3d mayavi mayavi.mlab
1个回答
0
投票

原则上,我上面的代码是有效的,将箭头与球体进行比较,看起来奇怪的尺寸似乎是由于视角造成的。该代码在轴方面存在一些缺陷。这是更新的部分:

# explicitly define the extent of the axes
ax1 = mlab.axes( nb_labels=4,
                 extent=[0, xc+r,
                         0, yc+r,
                         0, zc+r, ],
               )

# to not only have the axes around one of the drawn objects
mlab.outline(ax1)

结果如下:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.