解决MATLAB中biplot不能标注obslabels的问题

在 2013-05-23 发布于 大学相关 下以来已有5,866人读过本文 | 1条评论 发表评论

biplot函数在MATLAB中比较罕用,通常只是在对数据矩阵进行主成分分析之后,对得到的结果中的得分和载荷矩阵作图时才需要用到。biplot功能如名所示,用来同时作两个图,其中一个是得分图,另一个就是载荷图,将其同时显示在同一张图像上。而且,通常会将主成分分析中的变量(variables)和观测量(即样品类别,samples或observations)作为样本点显示在图像上。

另外,biplot还可以加入诸如VarLabels变量,将变量名标识在图像上。除此之外,biplot还提供了ObsLabels变量名,用以将样品名称,也即观测量名称显示在最终的图形中。

不过遗憾的是,我们在MATLAB中使用形如

biplot(coeff(:,1:2),’scores’,score(:,1:2),’varlabels’,var)

的调用方式,可以在最终的图像上显示主成分分析的变量名,如下图所示:

但是,如果我们按照调用规则再在biplot函数中加入ObsLabels变量,以这样的调用形式:

biplot(coeff(:,1:2),’scores’,score(:,1:2),’varlabels’,var,’obslabels’,name)

去调用函数,则在最终的图像上并没有把用于主成分分析的样品名称显示出来,显示结果依然与上图一样。而这显然与我们的要求不符,obslabels变量并没有在图像上显示出来。

问题究竟出现在哪里呢?于是在MATLAB中打开biplot函数的源文件biplot.m。仔细查看发现,原来其中竟然没有绘制obslabels的部分,只有一段用户绘制出varlabels的代码。

但考虑到两部分变量名最终显示在图像上的过程类似,其代码应该也基本相同,所以在biplot源文件中找到绘制varlabels的部分,基本在“if ~isempty(varlabs)”代码块里,将其复制并替换掉后面的“if ~isempty(obslabs)”代码块。当然,其中涉及到的varlabs变量应该更改为obslabs,varlabel修改为obslabels,coefs变量改成scores。此外,还需要特别注意的是这段代码里的p变量,这是coefs矩阵的行数,因为前面有:

[p,d] = size(coefs);

所以,我们可以取出scores的大小,使用如下形式:

[pp,dd] = size(scores);

然后将复制过来的代码段中的p变量修改为pp。这么修改完毕,将其以文件名biplotdiy.m保存到MATLAB的工作目录下,使用下面的调用形式:

biplotdiy(coeff(:,1:2),’scores’,score(:,1:2),’varlabels’,var,’obslabels’,name)

即可以看到最终的结果,如下图:

可是从上图也可以看到,显示的两种变量名称颜色都是系统默认的黑色,没有区别性,显示效果不是太好。

但是既然我们已经修改了biplot函数,为什么不更进一步,将其修改地显示效果更好呢?

那么,我们将variables名称显示为蓝色,将observation labels显示为红色,打开biplotdiy.m文件,找到如下语句:

varTxtHndl = text(coefs(:,1)+delx,coefs(:,2)+dely,varlabs);

这是将varlabs在图上标示出来的语句,并且创建了一个句柄,我们使用这个句柄为其改变颜色,在其后添加如下语句:

set(varTxtHndl,’Color’,’b’);

当然,这是以二维图为例,也是以varlabs为例,至于其余三维图,还有obslabels,与此类似,你可以自行修改。修改完成后,使用biplotdiy作图得到的最终效果如下:

1条评论

  1. 月夜
    2013/05/24 10:26:31

    试试看看能不能阻止垃圾评论。

    回复评论

发表评论

您的昵称 *

您的邮箱 *

您的网站