我正在尝试在mayavi中可视化一些3D标量数据。我可以通过使用图像平面小部件来单独显示数据。我的目标是混合两个相同大小和间距的不同标量体积,并使用图像平面小部件显示它们。
我已经尝试过使用图像平面小部件。更改ipw的不透明度但无济于事,mayavi而不是将两个立方体混合在一起,将它们分别对待。
import dask.array as da
import numpy as np
import util
import matplotlib.pyplot as plt
import scipy
from mayavi import mlab
in_path = '/home/user/Desktop/Attribute_Extract_v_0.1/small_vol.hdf5'
in_path_2 = '/home/user/Desktop/Attribute_Extract_v_0.1/anu_malik.hdf5'
data = util.read(in_path)
data_2 = util.read(in_path_2)
shaped_data_2 = np.array(data_2)
shaped_data = np.array(data)
print(shaped_data.shape)
vm = np.percentile(shaped_data,99)
vm2 = np.percentile(shaped_data_2,99)
vm_3 = np.percentile(shaped_data_2,20)
vm_4 = np.percentile(shaped_data_2,80)
#Use mayavi to plot the 3D seismic cube with xline , inline and , Timeslice
source = mlab.pipeline.scalar_field(shaped_data)
source_2 = mlab.pipeline.scalar_field(shaped_data_2)
source.spacing = [1, 1, -1]
source_2.spacing = [1, 1, -1]
vol = mlab.pipeline.volume(source_2, vmin=vm_3, vmax=vm_4)
for axis in ['x', 'y', 'z']:
plane = mlab.pipeline.image_plane_widget(source_2,
plane_orientation='{}_axes'.format(axis),
slice_index=100, colormap='Spectral',opacity=0.2, vmin=-vm2, vmax=vm2 )
plane_2 = mlab.pipeline.image_plane_widget(source,
plane_orientation='{}_axes'.format(axis),
slice_index=100, colormap='seismic',opacity=0.5, vmin=-vm, vmax=vm )
# Flip colormap. you can choose to ignore
plane.module_manager.scalar_lut_manager.reverse_lut = True
mlab.outline()
mlab.show()
我希望将这两个体积混合在一起,并且只有一个ipw可见,有什么方法可以实现它。
答案 0 :(得分:0)
我认为您忘记为每个数据集和每个轴更新slice_index。查看您的图,两个XY平面都绘制在同一位置,但XZ和YZ并非如此。这可能意味着,在给定平面方向的情况下,slice_index不能代表两个数据集的相同空间位置。
现在,假设您已解决此问题,并且两组image_plane_widget完全重叠,那么您实际上如何融合它们并能够同时区分它们呢?不透明度可能是这里的唯一选择,您可能要使用plane_opacity。另一种选择是绘制一个当前的数据集,然后在第二个数据集的顶部绘制有意义的contours。
编辑:我无法将任何不透明度应用于volume_slice或image_plane_widget。但是,它似乎可以与scalar_cut_plane一起使用。不幸的是,飞机位置的设置方式不同。
scp = mlab.pipeline.scalar_cut_plane(
mlab.pipeline.scalar_field(data), plane_orientation='y_axes', opacity=0.5)
scp.implicit_plane.widget.origin = np.array([X, Y , Z])
scp.implicit_plane.widget.enabled = False