我有一个带有x和y坐标的矩阵以及每个数据点的温度值。当我在散点图中绘制它时,一些数据点会使其他数据点模糊,因此,该图不能真实地表示我的数据集中温度如何变化。
为了解决这个问题,我想降低图表的分辨率并创建像素,这些像素代表像素区域内所有数据点的平均温度。另一种思考问题的方法,我需要将网格放在当前的图上,并平均每个网格段内的值。
我找到了这个帖子 - Generate a heatmap in MatPlotLib using a scatter data set - 它展示了如何使用python来实现我想要的最终结果。但是,我目前的代码是在MATLAB中,尽管我尝试了不同的建议,例如heatmap,contourf和imagesc,但我无法得到我想要的结果。
答案 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)
(我只按Xs
和temps
排序,以便获得上面的条纹图案,以便我们可以直观地验证“降低的分辨率”是否有效)
现在,假设我想通过在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]
或者像这样的散点图(我在'像素'的中点绘制每个点,并绘制原始数据点以进行比较):
% PLOT
imagesc(xbins, ybins, out)
set(gca, 'YDir', 'normal') % flip Y axis back to normal