3

x 座標と y 座標、および各データ ポイントの温度値を含むマトリックスがあります。これを散布図にプロットすると、一部のデータ ポイントが他のデータ ポイントを覆い隠すため、プロットはデータ セット内の温度の変化を正確に表していません。

これを修正するには、グラフの解像度を下げて、ピクセルの領域内のすべてのデータ ポイントの平均温度を表すピクセルを作成します。現在のプロットにグリッドを配置し、グリッドの各セグメント内の値を平均化する必要があるという問題について考える別の方法。

このスレッド - Generate a heatmap in MatPlotLib using a scatter data set - を見つけました。これは、python を使用して必要な最終結果を達成する方法を示しています。ただし、現在のコードは MATLAB にあり、heatmap、contourf、imagesc などのさまざまな提案を試しましたが、必要な結果が得られません。

4

1 に答える 1

10

accumarrayを使用してデータの「解像度を下げる」ことができます。ここでは、各ポイントが入る出力「ビン」を指定し、そのビン内のすべてのポイントの平均を取ることを指定します。

いくつかのサンプルデータ:

% 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 方向の単位ごとに 1 つのポイントのみを取得して、データの解像度を下げたいとします。これは、その正方形内のすべてのポイントの平均です (つまり、0 から 1 に移動するため、取得しXますY合計 20*20 ポイント)。

% group into bins of 0.05
binsize = 0.05;

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

XとYのそれぞれがどのビンに入っているかを調べるために使用histcします(注-この場合、ビンは規則的であるため、私も行うことができます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);

次に、各ビン内accumarrayで平均を実行します。temps

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

(注 - これは、ポイントが(出力マトリックスの) 行columntemps(i)の「ピクセル」に属していることを意味します。結果のマトリックスが Y == 行と X == 列になるようにするのとは対照的に行いました))idxy(1)idxx(1)[idxy idxx][idxx idxy]

次のようにプロットできます。

% 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 に答える