1

我有一个数字集 X、Y、Z,我想用这些值重现一个热图。bin 的大小是 20 x 20,X 轴和 Y 轴的范围是 -150 到 150,Z 是颜色。在该 bin 内,它应该包含该范围内 Z 值的平均值。

In Origin 包含此工具,可使用平均值制作热图,但我想在 MATLAB 中进行。我在 Origin 中制作的图以及我想在 MATLAB 中制作的图可以在图1中看到。

图1

我试过类似的东西

load xyz.dat 
x = xyz(:,1); 
y = xyz(:,2);
z = xyz(:,3); 
tbl = table(x,y,z); 
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

但它打印了这个警告

警告:更新 HeatmapChart 时出错。源表变量“x”中的值未分组到离散类别中。使用 discretize 函数对值进行分组。

4

1 回答 1

0

heatmap期望离散的 x 和 y 值。你的目标是将你的 x 和 y 分成 20 个离散的 bin 并平均每个 bin 的 z 值,但 x 和 y 本身是连续的。

为了实现您的目标,请听取警告消息的建议并使用discretize您的 x 和 y 值进行分类。

% I used the following stand ins for your data:
% x = rand(540, 1);
% y = rand(540, 1);

n_bins = 20; % Number of grid cells
% If you want the width of the grid cell to be 20, use 
% n_bins = (max(x) - min(x)) / 20; 

x_discrete = discretize(x, n_bins);
y_discrete = discretize(y, n_bins);
tbl = table(X_discrete,y_discrete,z, 'VariableNames', {'x', 'y', 'z'});
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

离散变量的热图

注意:为什么这不是样本数据的问题?

使用您的样本数据,

x = [49.8, 14.5, -60.7, -21.6, -10.6];
y = [45.3, 7.9, 23.9, -58.5, -55.4];
z = [0.2 , -0.06, -0.35, -0.15, -0.08];
tbl = table(x',y',z', 'VariableNames', {'x', 'y', 'z'});
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

不会抛出错误,因为它将每个 x 和 y 值视为一个单独的类别。heatmap使用调用categorical将连续值转换为分类值。

除了没有真正提供您想要的输出(每个点将是它自己的盒子而不是平均网格单元)之外,categorical它似乎对它将创建的分类值的数量有限制。我无法找到任何关于该限制究竟是什么的文档,但通过实验,它在 200 年代中期达到顶峰。由于您的向量长度为​​ 540 个元素,因此您会收到有关使用的警告discretize

于 2020-05-09T00:24:03.520 回答