2016-08-03 85 views
3

我有一個由2D矢量(X)表示的點的數據集。根據矢量值繪製符號

每個點屬於由整數值(從1到4)表示的分類數據(Y)。

我想繪製每個點與不同的符號取決於它的類。

玩具例子:

X = randi(100,10,2); % 10 points ranging 1:100 in 2D space 
Y = randi(4,10,1);  % class of the points (1 to 4) 

我爲每個類創建符號的載體:

S = {'bx' 'rx' 'b.' 'r.'}; 

然後我嘗試:

plot(X(:,1), X(:,2), S(Y)) 


Error using plot 
Invalid first data argument 

我怎麼能分配到的每個點X是基於Y值的不同符號?

詛咒我可以爲每個班級使用一個循環,並逐個繪製不同的班級。但是有沒有一種方法直接用不同的符號來繪製每個類?

回答

4

沒有必要爲一個循環,使用gscatter

X = randi(100,10,2); % 10 points ranging 1:100 in 2D space 
Y = randi(4,10,1);  % class of the points (1 to 4) 
color = 'brbr'; 
symbol = 'xx..'; 
gscatter(X(:,1),X(:,2),Y,color,symbol) 

您將得到: group scatter

+0

以前從未使用過它,所以沒有考慮它......這顯然是最好的答案! +1 =) –

+0

這正是我所期待的。謝謝 –

3

如果X有很多行,但只有幾個S類型,那麼我建議你先檢查第二種方法。它針對速度而不是可讀性進行了優化。如果矢量具有10個元素,則速度是其的兩倍;如果矢量具有1000個元素,則速度是速度的200倍。


第一種方法(便於閱讀):

不管的做法,我認爲你需要這樣的循環:

hold on 
arrayfun(@(n) plot(X(n,1), X(n,2), S{Y(n)}), 1:size(X,1)) 

或者寫循環中的「常規方式「:

hold on 
for n = 1:size(X,1) 
    plot(X(n,1), X(n,2), S{Y(n)}) 
end 

enter image description here

第二條本辦法(給出同樣的情節如上):

如果你的數據集較大,您可以排序[Y_sorted, sort_idx] = sort(Y),然後用sort_idx索引X,像這樣:X_sorted = X(sort_idx);。在此之後,您將X_sorted分爲4個組,每個個人Y-值使用histcmat2cell。然後你循環四個組並分別繪製每一組。

這樣,您只需循環四個值,而不管數據中元素的數量。如果元素數量很多,這應該會快很多。

[Y_sorted, Y_index] = sort(Y); 
X_sorted = X(Y_index, :); 
X_cell = mat2cell(X_sorted, histc(Y,1:numel(S))); 

hold on 
for ii = 1:numel(X_cell) 
    plot(X_cell{ii}(:,1),X_cell{ii}(:,2),S{ii}) 
end 

標杆:

我沒有使用timeit這兩種方法的一個非常簡單的標杆。結果表明,第二種方法是快了很多:

對於10個元素:

First approach: 0.0086 
Second approach: 0.0037 

爲1000個元素:

First approach = 0.8409 
Second approach = 0.0039 
+0

謝謝。實際上,不用排序,你可以得到與循環中正在處理的類相對應的X的值:'X(Y == i,:)'將返回屬於類'i'的點。 –