解决MATLAB中biplot不能标注obslabels的问题
关键词:matlab biplot、matlab biplot函数、biplot图怎么看、biplot分析
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作图得到的最终效果如下:
转载请注明:数据分析 » 解决MATLAB中biplot不能标注obslabels的问题