前面介绍了许多数据的图形表示方法,但大多数是针对一元、二元数据的,三维图形虽然能画出来,但并不方便。对于三维以上数据如何来描述呢?结合R语言的特点,这里介绍几种多元数据的绘图方法:轮廓图、星图和调和曲线图。
设变量是p维数据,有n个观测数据,其中第k次的观测值为:
n次观测数据组成矩阵
轮廓图由以下作图步骤完成:
作直角坐标系,横坐标取p个点,以表示p个变量;
对给定的一次观测值,在p个点上的纵坐标与对应的变量取值成正比;
连接此p个点得一折线,即为该次观测值的一格轮廓线;
对于n次观测值,每次都重复上述步骤,可画出n条折线,构成n次观测值的轮廓图。
编写轮廓图函数,存储文件为“outline.R”
outline<>
if(is.data.frame(x)==TRUE){
x<>
}
m<>
n<>
plot(c(1,n),c(min(x),max(x)),type='n',main='The outline graph of Data', xlab = 'Number',ylab='Value')
for(i in 1:m){
lines(x[i,],col=i)
if(txt==TRUE){
k<>
text(1+(i-1)%%n,x[i,1+(i-1)%%n],k)
}
}
}
其中x是矩阵或数据框,txt是逻辑变量,当txt=TRUE(缺省值)时,绘图时给出观测值的标号,否则不给出标号。函数的运行结果是绘出n次观测值的轮廓图。
例子:为考察学生的学习情况,学生随机的抽取12名学生的5门课期末考试的成绩。如下图所示,画出12名学生学习成绩的轮廓图。
将数据输入到数据文件中,文件名为“course.data”
> X<>
> source('outline.R')
> outline(X)
由轮廓图可以直观的看出,哪个学生的成绩相似、哪些属于优秀、哪些中等、哪些较差。对于各门课程而言,也可以直观地看出各课程成绩的好坏和分散情况。这种图形在聚类分析中颇有帮助。
星图的作图步骤是:
作一个圆,并将圆周p等分;
连接圆心和各分点,把这p条半径一次定义为变量的坐标轴,并标以适当的刻度;
对给定的一次观测值,把p个变量分辨取在相应的坐标轴上,然后将它们连接成一个p边形;
n次观测可画出n个p边形。
R语言给出了作星图函数starts(),例如,画出上述学生学习成绩的星图,只需要
>stars(X)
星图中水平轴是变量X1,沿逆时钟方向依次是X2、X3...。由于星图既像雷达屏幕上看到的图像,也像一个蜘蛛网,因此,星图也称为雷达图或蜘蛛图。
starts()函数可以加各种参数,进而绘制出不同的星图,具体请参看官方文档。例如:
> stars(X,full = FALSE,draw.segments = TRUE,key.loc = c(5,0.5),mar=c(2,0,0,0))
调和曲线图的思想是 是根据三角变换方法将 p 维空间的点映射到二维平面上的曲线上。对于p维数据,假设Xr是第r观测值,即
则对应的调和曲线是:
n次观测数据对应n条曲线,现在同一张平面上就是一张调和曲线图。当变量数据的数值相差太悬殊,最好先标准化再作图。
编写调和权限函数,存储文件为“onison.R”
unison<>
if(is.data.frame(x)==TRUE)
x<>
t<-seq(-pi,pi,pi>-seq(-pi,pi,pi>
m<>
n<>
f<>
for(i in 1:m){
f[i,]<-x[i,1]>-x[i,1]>
for(j in 2:n){
if(j%%2==0)
f[i,]<-f[i,]+x[i,j]*sin(j>-f[i,]+x[i,j]*sin(j>
else
f[i,]<-f[i,]+x[i,j]*cos(j%>-f[i,]+x[i,j]*cos(j%>
}
}
plot(c(-pi,pi),c(min(f),max(f)),type='n',main='The Unison graph of Data',xlab = 't',ylab = 'f(t)')
for(i in 1:m) lines(t,f[i,],col=i)
}
加载并调用函数
> source('onison.R')
> unison(X)
调和曲线图对聚类分析帮助很大,如果选择聚类统计量为距离,则同类的曲线拧在一起,不同类的曲线拧成不同的束,非常直观。
联系客服