3

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

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

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

4

1 回答 1

10

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

一些示例数据:

% 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我们可以直观地验证“降低分辨率”是否有效)

0.05现在,假设我想通过在 X 和 Y 方向上每单位只获得一个点来降低数据的分辨率,这是该正方形中所有点的平均值(所以由于我的XY从 0 到 1,我会得到共 20*20 分)。

% group into bins of 0.05
binsize = 0.05;

% create the bins
xbins = 0:binsize:1;
ybins = 0:binsize:1;

我用来histc计算每个 X 和 Y 所在的箱子(注意 - 在这种情况下,因为箱子是常规的,我也可以这样做idxx = floor((Xs - xbins(1))/binsize) + 1

% work out which bin each X and Y is in (idxx, idxy)
[nx, idxx] = histc(Xs, xbins);
[ny, idxy] = histc(Ys, ybins);

然后我用在每个 bin 内accumarray做一个平均值:temps

% calculate mean in each direction
out = accumarray([idxy idxx], temps', [], @mean);

(注意 - 这意味着 in 的点temps(i)属于行列处的“像素”(我们的输出矩阵)idxy(1)idxx(1)我这样做[idxy idxx]是为了[idxx idxy]让结果矩阵有 Y == 行和 X == 列))

你可以像这样绘制:

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

分箱数据

或者像这样的散点图(我在“像素”的中点绘制每个点,并将原始数据点也画在上面进行比较):

xx = xbins(1:(end - 1)) + binsize/2;
yy = ybins(1:(end - 1)) + binsize/2;
[xx, yy] = meshgrid(xx, yy);
scatter(Xs, Ys, 2, temps);
hold on;
scatter(xx(:), yy(:), 20, out(:));

覆盖

于 2013-04-15T02:15:40.557 回答