MATLAB - 将绘图像素化并将其制作成热图

时间:2013-04-15 01:00:42

标签: matlab heatmap

我有一个带有x和y坐标的矩阵以及每个数据点的温度值。当我在散点图中绘制它时,一些数据点会使其他数据点模糊,因此,该图不能真实地表示我的数据集中温度如何变化。

为了解决这个问题,我想降低图表的分辨率并创建像素,这些像素代表像素区域内所有数据点的平均温度。另一种思考问题的方法,我需要将网格放在当前的图上,并平均每个网格段内的值。

我找到了这个帖子 - Generate a heatmap in MatPlotLib using a scatter data set - 它展示了如何使用python来实现我想要的最终结果。但是,我目前的代码是在MATLAB中,尽管我尝试了不同的建议,例如heatmap,contourf和imagesc,但我无法得到我想要的结果。

1 个答案:

答案 0 :(得分:10)

您可以使用accumarray“降低数据的分辨率”,您可以在其中指定每个点应该输入的“bin”,并指定您希望对该bin中的所有点取平均值。< / p>

一些示例数据:

% make points that overlap a lot
n = 10000
% NOTE: your points do not need to be sorted.
% I only sorted so we can visually see if the code worked,
% see the below plot
Xs = sort(rand(n, 1));
Ys = rand(n, 1);
temps = sort(rand(n, 1));

% plot
colormap("hot")
scatter(Xs, Ys, 8, temps)

raw points plotted

(我只按Xstemps排序,以便获得上面的条纹图案,以便我们可以直观地验证“降低的分辨率”是否有效)

现在,假设我想通过在X和Y方向上每0.05个单位获得一个点来降低数据的分辨率,这是该方块中所有点的平均值(因此我{{1} }和X从0到1,我总共得到20 * 20分。

Y

我使用histc计算每个X和Y所在的bin(注意 - 在这种情况下,因为bin是常规的,我也可以% group into bins of 0.05 binsize = 0.05; % create the bins xbins = 0:binsize:1; ybins = 0:binsize:1;

idxx = floor((Xs - xbins(1))/binsize) + 1

然后我使用accumarray在每个bin中平均% work out which bin each X and Y is in (idxx, idxy) [nx, idxx] = histc(Xs, xbins); [ny, idxy] = histc(Ys, ybins);

temps

(注意 - 这意味着% calculate mean in each direction out = accumarray([idxy idxx], temps', [], @mean); 中的点属于行temps(i)idxy(1)的“像素”(我们的输出矩阵)。我做idxx(1)[idxy idxx]相反,以便生成的矩阵具有Y ==行和X ==列))

你可以这样画:

[idxx idxy]

binned data

或者像这样的散点图(我在'像素'的中点绘制每个点,并绘制原始数据点以进行比较):

% PLOT
imagesc(xbins, ybins, out)
set(gca, 'YDir', 'normal') % flip Y axis back to normal

overlaid