2012-11-09 76 views
17

我想要繪製散佈,是這樣的:MATLAB:散點圖高數目的數據點

scatter(coor(:, 2), coor(:, 3), 1, coor(:, 4)); 

的問題是,我有相當大數量的座標繪製(100〜000)。它需要很長時間來繪製它,當我嘗試將圖導出到tiff時 - 那麼matlab在幾分鐘內就死了...任何改善繪圖或至少tiff導出的解決方案?忘記了,第三座標(coor(:, 4))是一個顏色代碼。因此,當我使用分散(如上)時,我在下面的圖像上有類似的東西,這就是我想要看到的東西(只是它的超級慢,我不能導出):

scatter

當我做:

plot3(COOR(:,2),COOR(:,3),COOR(:,4), '')

效果不如酷一NY更多(注:圖片是不是來自同一個座標...):

enter image description here

+0

有誰知道如何解決這個問題,通過將數據分塊爲像素,然後將其顯示爲圖像? – Anael

回答

23

你可以使用plot,但是所有的點都有相同的顏色。但是,您可以將在不同子集的集合,並用自己的顏色繪製他們每個:

N = 100000; 
x = rand(N,1); 
y = rand(N,1); 
C = sin(2*x)+y; 

cdivs = 10; 
[~, edges] = hist(C,cdivs-1); 
edges = [-Inf edges Inf]; % to include all points 
[Nk, bink] = histc(C,edges); 

figure; 
hold on; 
cmap = jet(cdivs); 
for ii=1:cdivs 
    idx = bink==ii; 
    plot(x(idx),y(idx),'.','MarkerSize',4,'Color',cmap(ii,:)); 
end 

colormap(cmap) 
caxis([min(C) max(C)]) 
colorbar 

enter image description here

其響應已經比scatter(x,y,1,C)賦予大致相同的情節,好了很多,但有較高的色分辨率(可以在上面的代碼中調整)。

+0

+1。我經常使用這種方法,所以我甚至寫了一個簡單的方法來更容易地做到這一點(儘管我常常允許將數據分成幾個不同的組)。 –

+0

非常聰明的解決方案。謝謝! – Art

0

是,使用plot3

plot3(coor(:, 2), coor(:, 3), coor(:, 4), '.') 

這將做同樣作爲3D散點圖(點將會是小點,如果你願意的話也可以使用'o' or 'x'

+0

感謝您的興趣,但它不能解決我的問題,請參閱上面的編輯... – Art

+0

是的,不幸的是我不知道如何使用plot3改變顏色 –

0

如果你有太多的點數,它可能是合理的精簡數據。

基本上你可以做兩種方法:

  1. 簡單 - 只需選擇 - 說出點的10%隨機。

  2. 丟棄不可見的點,顯然是那些超出範圍的點,但是如果你有那麼多重疊 - 比如點的直徑應該是3px - 那麼點就會覆蓋9px。在我的機器上,您發佈的情節會是 - 例如400x400px,因此最多可以顯示ceil(400*400/9) < 20 000數據點。


,你也可以嘗試劇情分成小塊 - 般的情節1000點,發出drawnow那麼接下來的1000,直到你做。所以你不必在黑屏前等待。

1

我的經驗是matlab中最高效的繪圖命令是Patch,我用它來模擬散射或散射3的功能,效率更高。

如果你有一個點的列表,使用每個點爲你的特定數據定義一個合理邊長的方塊(或八角形,或其他),然後用一次調用來打補丁的集合。創建圖形對象後,您可以更新其顏色數據以單獨爲方塊着色。

通過在數據集中構建多維數據集或三維十字架,您可以在3D中使用相同的概念。

這段代碼創建1e5個隨機放置的方塊,在這種情況下使用隨機顏色,並在我四歲的筆記本電腦上稍微運行一下。類似的分散呼叫需要40秒,並返回難以操縱的笨重圖形。

tic 
P=rand(1e5,2); 
Edge=.01; 
X=[P(:,1)'; P(:,1)'+Edge; P(:,1)'+Edge; P(:,1)']; 
Y=[P(:,2)'; P(:,2)'; P(:,2)'+Edge; P(:,2)'+Edge]; 
figure; 
h=patch(X,Y,'r'); 
set(h,'facevertexcdata',rand(size(X,2),3),'facecolor','flat','edgecolor','none') 
drawnow 
toc