matlab绘制四维透明图,matlab四维图绘制

问题描述

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

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

基本思想

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

语法1

2

3(V,sx,sy,sz)

(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)

效果如图

1.png

整体绘制

利用上面的方法,修改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)

2.png

一些设置

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

透明度设置

alpha(0.8)

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

坐标轴设置

axis off

不显示坐标轴

axis equal

保持各个维度坐标轴刻度等长

caxis([0, 6])

将颜色的刻度范围设置为0~6,0处为最小值,6处为最大值

色标

colorbar

在图像一侧显示色标

视角设置1

2

3az = -20;

el = 10;

view(az, el);

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

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

3.png

最终效果

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

timg.jpg

那就要用到强大的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

16v(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);

效果如图:

4.png

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值