0

我有 11 个包含密度的 1x50 矩阵。第一个看起来像 [20, 20, 20... 20] 并且表示时间 = 0。第二个看起来像 [20, 19, 22,..] 等,表示时间 = 100。这些继续变化,直到 t=1000。

我希望做的是创建一个绘图,其中元素在 x 轴上的位置(每个 50 条数据的 50 个位置)和时间(0-1000)在 y 轴上。理想情况下,我希望绘图完全填充颜色密度,并在侧面显示颜色范围代表的密度。

任何帮助将不胜感激!

灵感来自: http: //www.chrisstucchio.com/blog/2012/dont_use_scatterplots.html

4

2 回答 2

2

假设您拥有(或可以安排拥有)所有这些向量作为 11x50 矩阵的列:

A = randi(100, 11,50); %//example data

你可以使用

imagesc(1:50, 0:100:1000, A)
colorbar
axis xy %// y axis increasing, not decreasing

例子:

在此处输入图像描述

于 2014-07-07T22:37:33.797 回答
2

查看评论,将这些向量堆叠成二维矩阵会更容易。您有 11 个单独命名的向量。假设您的向量被命名为vec1vec2vec3等,创建一个二维矩阵A,将这些向量堆叠在一起。此外,您需要在此矩阵的末尾包含一个额外的行和列,其中包含所有向量的最小值。这样做的原因稍后会很明显,但现在相信我的话,因为这就是你所需要的。

换句话说:

A = [vec1; vec2; vec3; vec4; vec5; vec6; vec7; vec8; ...
     vec9; vec10; vec11];
minA = min(A(:));
A = [A minA*ones(11,1); minA*ones(1,51)];

因此,第一行包含时间 0 的信息,下一行包含时间 100 的信息,依此类推,直到时间 1000。

现在我们已经完成了,我们可以使用该pcolor函数为您绘制这些数据。 pcolor代表伪彩色棋盘图。您可以通过以下方式调用它:

pcolor(A);

这将采用存储的矩阵A并生成数据的棋盘图。矩阵中的每个点都被分配了一种颜色。颜色会自动映射,以便将最小值映射到最低颜色,而将最大值映射到最高颜色。 pcolor不绘制矩阵的最后一行和最后一列,但使用矩阵pcolor的所有数据。为了确保正确映射颜色,我们需要填充矩阵,以便将最后一行和最后一列分配给所有向量的最小值。由于您想绘制矩阵中的所有值,这就是我们执行上述操作的原因。

完成此操作后,我们需要修改 X 和 Y 刻度,使其符合您的数据。像这样:

pcolor(A);
set(gca, 'XTick', 0.5:5:51.5);
set(gca, 'XTickLabel', 0:5:50);
set(gca, 'YTick', 1.5:11.5);
set(gca, 'YTickLabel', 0:100:1000);
xlabel('Sample Number');
ylabel('Time');
colorbar;

上面的代码所做的是它生成了一个棋盘模式,就像我们讨论的那样。这在 x 轴上标记样本编号,而时间在 y 轴上。你会看到set我所做的两个命令,这有点小技巧。默认情况下,y 轴标记从 1 到 12 的刻度。我所做的是我更改了这些标签,以便它们以 100 的步长从 0 变为 1000,并且我还删除了 12 的刻度。此外,我有确保这些标签位于每行的中间。我通过设置YTick属性来做到这一点,以便我将 0.5 添加到从 1 到 11 的每个值。一旦我这样做了,我就会更改标签,以便它们以 100 为步长从 0 到 1000。我也对x 轴的方式与 y 轴类似。然后我添加一个colorbar根据您的要求放在一边。

按照上面的代码,并根据您的评论生成介于 13 和 27 之间的随机整数数据:

A = randi([13,27], 11, 50);
minA = min(A(:));
A = [A minA*ones(11,1); minA*ones(1,51)];

我们得到:

在此处输入图像描述

显然,颜色条的限制将根据数据的动态范围而变化。我使用randi并生成了 13 到 27 范围内的随机整数。当您将此代码用于您的目的时,颜色条的范围将根据数据的动态范围而变化,但颜色会相应调整。

祝你好运!

于 2014-07-07T22:39:34.407 回答