2016-08-03 3 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 개이면 약 2 배, 벡터의 요소가 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,992,967,

두 번째 접근 방법은 (위와 같은 플롯을 제공) : 데이터 집합이 큰

경우에는 다음과 같이 인덱스 Xsort_idx를 사용 [Y_sorted, sort_idx] = sort(Y)을 정렬 할 수 있습니다 X_sorted = X(sort_idx);. 그런 다음 X_sortedhistcmat2cell을 사용하여 Y 개의 개별 값에 대해 하나씩 네 그룹으로 나눕니다. 그런 다음 네 개의 그룹을 반복하여 각 그룹을 개별적으로 그립니다.

이렇게하면 데이터의 요소 수에 관계없이 네 개의 값만 반복하면됩니다. 요소 수가 많으면이 속도가 훨씬 빨라집니다.

[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 

1,000 요소를 들어 그 결과는 두 번째 접근법은 훨씬 더 빠르다는 것을 보여준다

First approach = 0.8409 
Second approach = 0.0039 
+0

감사합니다. 사실, 정렬 대신 루프에서 처리되는 클래스에 해당하는 X의 값을 얻을 수 있습니다.'X (Y == i, :)'는 클래스 'i'에 속한 점을 반환합니다. –