【问题标题】:increase the space between slices增加切片之间的空间
【发布时间】:2020-04-26 15:27:37
【问题描述】:

我试图在 20 个快照中说明 2D 矩阵。我使用slice 绘制它,但除了顶部矩阵之外,其余的都看不到。有没有办法增加切片之间的空间以便能够看到每个平面?也有人可以建议另一种方法来显示t=1:204x8 矩阵的时间演变吗? 这是我用来绘制数据的小代码:

T2=20;
Xc = zeros(8,4,T2);
for j = 1:T2
    Xc(:,:,j) = mdp2(j).X{1};
end
hs = slice(Xc,[],[],1:T2) ;
lightangle(-45,45);
view([-25 30]);
xticks(linspace(0,20,41));
axis on;

如何在此处更改坐标轴的刻度和标签? 提前致谢

【问题讨论】:

  • 您查看坐标区的 DataAspectRatio 属性了吗?在 z 轴上拉伸图形应该可以做到。
  • @CrisLuengo 感谢您的回复。我有一个问题:我正在尝试在 20 个切片中绘制 4x8 矩阵,但使用 slice 似乎它显示了 3x7 矩阵。例如imagesc 清楚地显示了4x8 矩阵的值。有什么方法可以结合imagescslice 例如?
  • slice 将数据放在顶点处,您有 4x8 个顶点,它们构成 3x7 矩形。您需要在切片中添加一行和一列,并适当设置插值以将数据显示为 4x8 矩形。这里有一个问答环节,我相信 Google 会为您提供。
  • @CrisLuengo 我一直在谷歌搜索,但找不到答案。我们如何向slice 添加行和列?对不起,我的问题可能。对你来说似乎很天真,但我最近才开始在 matlab 中编码,而且我对它还很陌生。谢谢。
  • 我找不到问答。您应该以Xc = zeros(9,5,T2); 开头,然后复制Xc(1:8,1:4:,j) = mdp2(j).X{1};。看看这是否能改善你的身材。

标签: arrays matlab matrix slice matlab-figure


【解决方案1】:

您的代码带有一些随机数据:

T2=20;
Xc = zeros(8,4,T2);
for j = 1:T2
    Xc(:,:,j) = rand(8,4);
end
hs = slice(Xc,[],[],1:T2) ;
lightangle(-45,45);
view([-25 30]);
xticks(linspace(0,20,41));
axis on;

正如@CrisLuengo 提到的,这里是DataAspectRatio 属性(或使用函数daspect(),请参阅here,以获取此信息):

h = gca;
h.DataAspectRatio
ans =

                         1          2.33333333333333          6.66666666666667
% Or use function daspect()

来自MATLAB Documentation

daspect([1 2 3]) 指定一个单位沿 x 轴等于沿 y 轴的两个单位和三个单位的长度 沿 z 轴。

减少h.DataAspectRatio[3] 会增加切片间隙。例如:

set(h, 'DataAspectRatio', [1 2.333 2])

使图像像这样:

我还会添加一些透明度以使数据可见:

alpha(h, 0.7);

如何在此处更改坐标轴的刻度和标签

使用坐标区属性或函数XTickYTickZTick。另外,通过view() 更改相机视线

xticks(1:4);
view(30, 20);

给出:

编辑 1

当使用slice(Xc,[],[],1:T2) 时,假设Xc 是一个体积数据,其坐标由Xc 的大小定义。这些坐标遵循grid representation,这意味着整个网格由这些坐标定义。如果您的数据表示网格点之间的坐标(这里就是这种情况),那么您应该在每个维度的末尾调整缺失的数据。因此,如果我构建一个大小为 8 x 4 x 20 的二进制随机数据集,我有:

T2=20;
nRows = 8;
nCols = 4;
mdp2 = zeros(nRows, nCols, T2);
for j = 1:T2
    mdp2(:,:,j) = round(rand(nRows,nCols)); % Binary data
end

要使网格大小一致,您应该执行以下操作:

Xc = zeros(nRows+1,nCols+1,T2);
for j = 1:T2
    expan1 = [mdp2(:,:,j) mdp2(:,1,j)];
    Xc(:,:,j) = [expan1; expan1(1,:)];
end

然后在Xc 中绘制整个数据

hs = slice(Xc,[],[],1:T2);

【讨论】:

  • 感谢您的回答我有一个小问题。首先,我的8x4 矩阵是二进制矩阵,但正如您在绘图中看到的那样,单元格的数量是3x7?
  • 您将Xc 直接用作网格数据,这意味着这些数据是指网格点(不在点之间)的网格坐标数据。我已经添加了如何实际绘制每个平面中的整个 8x4 数据。