2013-04-15 58 views
3

我有X和Y每一個我的數據點的矩陣座標以及溫度值。當我將它繪製在散點圖中時,某些數據點會遮擋其他點,因此,該圖不會真實地表示數據集中溫度的變化。MATLAB - Pixelize的陰謀,並使其成爲一個熱圖

爲了解決這個問題,我想我降低圖形的分辨率,並創建代表平均溫度爲像素的區域內的所有數據點的像素。另一種思考問題的方法是,我需要在當前圖上放置網格,並在網格的每個分段內平均值。

我發現這個線程 - Generate a heatmap in MatPlotLib using a scatter data set - 它展示瞭如何使用Python實現我想要的最終結果。然而,我目前的代碼是在MATLAB中,即使我嘗試了不同的建議,如heatmap,contourf和imagesc,我無法得到我想要的結果。

回答

9

您可以使用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) 

raw points plotted

(爲了得到上面的條紋圖案,使我們可以直觀地驗證,如果「降低分辨率」工作,我只能通過Xstemps排序)

現在,假設我想通過在X和Y方向上每個0.05單位獲得一個點來降低我的數據的分辨率,這是所有點的平均值該廣場(因爲我的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); 

然後我用accumarray來做每一段內的temps平均:

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

(注 - 這意味着在temps(i)點屬於「PIX el「(我們的輸出矩陣)在行idxy(1)idxx(1)。我做了[idxy idxx],而不是[idxx idxy],這樣生成的矩陣具有Ÿ==行和X ==列))

您可以繪製這樣的:

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

binned data

或者作爲散射劇情是這樣的(我繪製的每個點的「像素」的中點,並提請原始數據點上也比較):

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(:)); 

overlaid

+0

這個答案太神奇了!非常感謝!我已經玩了幾天你的解決方案,我能夠得到我想要的。我會去工作我的代表,讓我可以upvote,再次感謝! –