Данные графика с биплотом MATLAB с более чем 1 цветом - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть 3 группы данных, в которых PCA была выполнена как одна группа.Я хочу выделить каждую переменную группу другим цветом.До этого я перекрыл 3 болта.Это дает разные цвета, но создает искажение в данных, поскольку каждая функция биплота искажает данные.Это привело к тому, что все группы были искажены на разную величину, что сделало график неправильным представлением.

Как взять матрицу оценок PCA (30x3) и разделить ее так, чтобы первые 10x3 были одного цвета, а следующие10x3 - это другое, а третье 10x3 - это другое, без перекоса данных?

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Это метод, который я использовал для построения данных биплота разными цветами. Строки кода перед построением взяты из файла biplot.m. Способ, которым биплот манипулирует данными, сохраняется в неизменном виде и останавливает перекос данных при использовании накладных биплотов.

Это кодирование не самое эффективное, можно увидеть детали, которые можно разрезать. Я хотел сохранить код в целости, чтобы было видно, как биплот работает полностью.

%%%%%%%%%%%%%%%%%%%%%

xxx = coeff(:,1:3); 
yyy= score(:,1:3);

**%Taken from biplot.m; This is alter the data the same way biplot alters data - having the %data fit on grid axes no larger than 1.**

[n,d2] = size(yyy);  
[p,d] = size(xxx); %7 by 3  
[dum,maxind] = max(abs(xxx),[],1);  
colsign = sign(xxx(maxind + (0:p:(d-1)*p)));  
xxx = xxx .* repmat(colsign, p, 1);  
yyy= (yyy ./ max(abs(yyy(:)))) .* repmat(colsign, 42, 1);  
nans = NaN(n,1);  

ptx = [yyy(:,1) nans]';  
pty = [yyy(:,2) nans]';  
ptz = [yyy(:,3) nans]';  

**%I grouped the pt matrices for my benefit** 

plotdataholder(:,1) = ptx(1,:);  
plotdataholder(:,2) = pty(1,:);  
plotdataholder(:,3) = ptz(1,:);  

**%my original score matrix is 42x3 - wanted each 14x3 to be a different color**

scatter3(plotdataholder(1:14,1),plotdataholder(1:14,2),plotdataholder(1:14,3),35,[1 0 0],'marker', '.');   
hold on;  
scatter3(plotdataholder(15:28,1),plotdataholder(15:28,2),plotdataholder(15:28,3),35,[0 0 1],'marker', '.') ;  
scatter3(plotdataholder(29:42,1),plotdataholder(29:42,2),plotdataholder(29:42,3),35,[0 1 0],'marker', '.');   
xlabel('Principal Component 1');  
ylabel('Principal Component 2');  
zlabel('Principal Component 3');  
1 голос
/ 19 февраля 2011

«Перекос» происходит потому, что биплот перенормирует оценки, поэтому самый дальний результат - расстояние 1.axis equal не собирается это исправить.Вы должны использовать scatter3 вместо biplot

data = rand(30,3);
group = scores(1:10,:)
scatter3(group(:,1), group(:,2), group(:,3), '.b')

hold all
group = scores(11:20,:)
scatter3(group(:,1), group(:,2), group(:,3), '.r')

group = scores(21:30,:)
scatter3(group(:,1), group(:,2), group(:,3), '.g')
hold off

title('Data')
xlabel('X')
ylabel('Y')
zlabel('Z')

или изменить строки scatter3 вашего кода так, чтобы маркеры были разных цветов.Параметр после 'marker' указывает, какой символ и какой символ и цвет наносить на график.Например, «.r» - красная точка.См. Linespec для параметров маркера и цвета.

scatter3(plotdataholder(1:14,1),plotdataholder(1:14,2),plotdataholder(1:14,3),35,[1 0 0],'marker', '.b');

hold on;

scatter3(plotdataholder(15:28,1),plotdataholder(15:28,2),plotdataholder(15:28,3),35,[0 0 1],'marker', '.r') ;

scatter3(plotdataholder(29:42,1),plotdataholder(29:42,2),plotdataholder(29:42,3),35,[0 1 0],'marker', '.g');
0 голосов
/ 18 февраля 2011

Я не уверен, поможет ли это, но попробуйте axis equal после того, как вы перекрыли графики.

...