问题描述

假设有一个立方体区域,包含了多孔支架和散布在其中的各种细胞。这个立方体被划分成均匀的单元立方体,每个小单元只可能有一种状态,如孔、支架或者某种细胞。用一个三维矩阵表示该立方体,矩阵中每一个数与相应位置的立方单元对应,用数值来表示这一单元的状态,如0表示孔,1表示支架,2表示某种细胞等。

如何绘制四维图,表示这个立方体?

基本思想

利用matlab函数slice,通过体数据显示正交切平面。

语法

1
2
3
slice(V,sx,sy,sz)
slice(X,Y,Z,V,sx,sy,sz)
h = slice(...)

slice(V,sx,sy,sz) 沿三维体 V 中的 x、y、z 方向在 sx、sy 和 sz 向量中的点处绘制切片。V 是一个 m×n×p 的三维体数组,包含在 X = 1:n、Y = 1:m、Z = 1:p 处的数据值。向量 sx、sy 和 sz 中的每个元素在 x、y 或 z 轴方向定义一个切平面。
slice(X,Y,Z,V,sx,sy,sz) 绘制三维体 V 的切片。X、Y 和 Z 是指定 V 的坐标的三维数组。X、Y 和 Z 必须是单调正交分布的(比如由 meshgrid 函数生成的)。每个点处的颜色由三维体 V 中的三维插值确定。
h = slice(...) 将句柄向量返回至曲面图形对象。

简单实现

设用于存储立方体的矩阵为v,大小为xsize*ysize*zsize。
显示其中某几个面的切片代码如下:

1
2
3
4
5
6
[xsize, ysize, zsize] = size(v);
[x,y,z] = meshgrid(1:ysize,1:xsize,1:zsize);
xslice = xsize/2;
yslice = [ysize/2, ysize];
zslice = zsize/2;
slice(x,y,z,v,xslice,yslice,zslice)

效果如图

圆柱状孔,孔内一端有若干细胞

整体绘制

利用上面的方法,修改xslice,yslice,zslice可以将整个立方体绘制出来。

1
2
3
4
5
6
[xsize, ysize, zsize] = size(v);
[x,y,z] = meshgrid(1:ysize,1:xsize,1:zsize);
xslice = 1:xsize;
yslice = 1:ysize;
zslice = 1:zsize;
slice(x,y,z,v,xslice,yslice,zslice)

立方体

一些设置

当然,上面得到的这张图还是过于简陋,并且只能看到外表面的一层,内部完全看不到。下面我们还可以对它做些改进,比如透明度、修改颜色、部分显示等等。

透明度设置

alpha(0.8)
括号内的数字可以自己修改,并且应当在0~1之间,1表示完全不透明,0表示完全透明。

坐标轴设置

axis off
不显示坐标轴
axis equal
保持各个维度坐标轴刻度等长
caxis([0, 6])
将颜色的刻度范围设置为0~6,0处为最小值,6处为最大值

色标

colorbar
在图像一侧显示色标

视角设置

1
2
3
az = -20;
el = 10;
view(az, el);

az为方位角,el为仰角,均以度为单位。

增加改进后,现在似乎好看了一点点

改进

最终效果

上面这张图还是啥也看不到哎,能不能只显示其中一部分呢?比如像地球剖面图一样…

嗯?在说我吗?

那就要用到强大的NaN了。在绘图前加上这句:
v(v == 1) = NaN;
把不想画出来的值全部替换为NaN,画图时就可以不显示了。

不过这里还要注意,如果设置为NaN后,相应的位置变成了带黑边的小立方体,是因为slice画图默认的EdgeColor是黑色,所以会显示黑色的边框,只要设置去掉edge显示就可以了。
set(h,'EdgeColor','none');

最后,只显示其中圆柱体的完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
v(v == 1) = NaN;
[xsize, ysize, zsize] = size(v);
[x,y,z] = meshgrid(1:ysize,1:xsize,1:zsize);
xslice = 1:xsize;
yslice = 1:ysize;
zslice = 1:zsize;
h=slice(x,y,z,v,xslice,yslice,zslice);
set(h,'EdgeColor','none');
colorbar
alpha(0.9)
caxis([0, 6])
axis off
axis equal
az = -20;
el = 10;
view(az, el);

效果如图:
最终效果