我有3组数据,其中PCA作为一组进行。我想用不同的颜色突出显示每个变量组。在此之前,我覆盖了3个biplots。这会产生不同的颜色,但会在每个双标图功能使数据偏斜时在数据中产生失真。这导致所有组都被不同的数量倾斜,使得情节不正确。
如何获取PCA分数矩阵(30x3)并将其拆分,使得前10x3是一种颜色,下一个10x3是另一种颜色,第三种10x3是另一种,没有数据偏斜?
答案 0 :(得分:1)
这是我用来绘制不同颜色的双标图数据的方法。绘图之前的代码行来自biplot.m文件。双模式操作数据的方式保持不变,并在使用重叠双图时停止数据偏移。
这种编码不是最有效的,可以看到可以切割的部分。我想保持代码完好无损,这样就可以看出biplot如何在其中完成。
%%%%%%%%%%%%%%%%%%%%%
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 :(得分:1)
“Skewing”正在发生,因为biplot正在重新规范分数,因此最远的分数是距离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');
答案 2 :(得分:0)
我不确定它是否会有所帮助,但在重叠图表后尝试axis equal
。