【问题标题】:Plot data with MATLAB biplot with more than 1 color使用 MATLAB biplot 绘制超过 1 种颜色的数据
【发布时间】:2011-06-30 01:13:47
【问题描述】:

我有 3 组数据,它们作为一组执行了 PCA。我想用不同的颜色突出显示每个变量组。在此之前,我覆盖了 3 个双标图。这会给出不同的颜色,但会在数据中产生失真,因为每个 biplot 函数都会扭曲数据。这会导致所有组都出现不同程度的偏差,从而导致绘图不正确。

如何获取 PCA 分数矩阵 (30x3) 并将其拆分,以便第一个 10x3 是一种颜色,下一个 10x3 是另一种颜色,第三个 10x3 是另一种颜色,而不会使数据倾斜?

【问题讨论】:

  • “叠加”3 个双标图是什么意思?你有没有使用hold on,每组数据调用 BIPLOT 3 次?
  • 是的,我就是这么做的。每个双标图都以不同的方式倾斜数据。我正在寻找使用 scatter3 或 plot3 以及使用 biplot 命令操作的数据进行绘图。我需要确保我可以有不同的颜色并且能够画一条线。我认为我的问题是我不精通情节属性。
  • 您是否尝试在制作 3 个双标图后调用命令 axis equal?这可能会纠正您看到的“倾斜”。
  • @user379362:您能否详细说明一下数据是如何被扭曲的?也许是一张照片?

标签: matlab colors plot color-scheme


【解决方案1】:

“倾斜”正在发生,因为 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');

【讨论】:

  • 唯一的问题是数据需要采用 biplot 的转换格式 - 最高分数为 1。我上面的编码使用 biplot 代码和您应用的相同方法。跨度>
【解决方案2】:

这是我用不同颜色绘制双标图数据的方法。绘图之前的代码行取自 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');  

【讨论】:

    【解决方案3】:

    我不确定它是否会有所帮助,但请在覆盖图之后尝试axis equal

    【讨论】:

    • 数据发生的事情是乘以一个因子。 Biplot 这样做是为了使数据的最高数字为 +1。因此,它将分数矩阵乘以每个双标图的单个因子,因为乘法因子基于数据。发生的事情是我试图用数据在最远的点之间画一条线。这条线与标绘点不匹配。数据是正确的,但 biplot 改变了它所在的位置。我要做的是通过 biplot 函数,了解它如何更改数据并使用 scatter3 和 plot3 - 请参阅我的答案。
    猜你喜欢
    • 2013-05-05
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多