今天介绍的可视化数据图形,主要用来解决以下数据的可视化问题。
气泡图:三个定量变量之间关系的可视化展示
折线图:将散点图的点连接起来就可以得到折线图,用于两个定量变量之间关系的可视化展示
马赛克图:多个类别变量之间关系的可视化展示
气泡图
前面已经说过,通过三维图来展示三个变量之间的关系并不是最好的选择,因为其看上去虽然比较炫酷,但是信息传递可能并不是那么直观。
气泡图,首先创建一个二维散点图,然后用点的大小来代表第三个变量的值。
symbols( ),用来创建气泡图
查看数据:
## 查看数据 head(mtcars)
原始数据
作图:
x轴代表车重wt
y轴代表每加仑英里数mpg
气泡大小代表发动机排量disp
attach(mtcars) r = sqrt(disp/pi) #根据第三个变量发动机排量disp确定气泡的半径 symbols(wt,mpg,circle=r,inches=0.3,fg="white",bg="lightblue",main="气泡图",ylab="每加仑英里数",xlab="车重") #inches=0.3,用于控制圆圈的大小,默认是 1 inch text(wt,mpg,rownames(mtcars),cex=0.6) #text( ),用于添加气泡图中点的标签 detach(mtcars)
气泡图
从图中可以看出,随着每加仑汽油行驶英里数mpg的增加,车重wt和发动机排量disp都在逐渐减少。
折线图
将散点图中的点连接起来便可以得到折线图,相比于散点图,折线图更能刻画出数据的变动趋势。
查看数据:
head(Orange) #查看数据集
原始数据
par(mfrow=c(1,2)) #设置画布为1行2列 t1=subset(Orange,Tree==1) #取出树的种类为 1 的数据集 plot(t1$age,t1$circumference,xlab="年龄(days)",ylab="圆周(mm)",main="橘子树的生长情况") plot(t1$age,t1$circumference,xlab="年龄(days)",ylab="圆周(mm)",main="橘子树的生长情况",type="b")
折线图
以上两幅图的主要区别取决于参数type="b"。
折线图一般可用以下两个函数之一来创建:
plot(x,y,type=)
lines(x,y,type=)
其中,x和y是要连接的(x,y)点的数值型向量,type=的类型参见下表。具体的效果就不在这里展示了,感兴趣的同学可以自己画了试试看。
折线图类型
plot( )和lines( )函数工作原理并不相同。
plot( )函数是被调用时即创建一幅新图,而lines( )函数则是在已存在的图形上添加信息,并不能自己生成图形。
lines( )函数通常是在plot( )函数生成一幅图形后再被调用。如果对图形有要求,可以先通过plot( )函数中的type=n,来创建坐标、标题和其他图形特征,然后再使用lines( )函数添加各种需要绘制的曲线。
查看数据的类型信息:
#查看数据的类型信息 str(Orange)
Classes 'nfnGroupedData', 'nfGroupedData', 'groupedData' and 'data.frame': 35 obs. of 3 variables: $ Tree : Ord.factor w/ 5 levels "3"<"1"<"5"<"2"<..: 2 2 2 2 2 2 2 4 4 4 ... $ age : num 118 484 664 1004 1231 ... $ circumference: num 30 58 87 115 120 142 145 33 69 111 ... - attr(*, "formula")=Class 'formula' language circumference ~ age | Tree .. ..- attr(*, ".Environment")=<environment: R_EmptyEnv> - attr(*, "labels")=List of 2 ..$ x: chr "Time since December 31, 1968" ..$ y: chr "Trunk circumference" - attr(*, "units")=List of 2 ..$ x: chr "(days)" ..$ y: chr "(mm)"
作图:
Orange$Tree=as.numeric(Orange$Tree) #为了方便起见,将因子型转化为数值型 ntrees=max(Orange$Tree) #获取树的总的种类 xrange=range(Orange$age) yrange=range(Orange$circumference) plot(xrange,yrange,type="n",xlab="年龄(days)",ylab="圆周(mm)") colors=rainbow(ntrees) linetype=c(1:ntrees) #定义线的类型 plotchar=seq(18,18+ntrees,1) #定义点的类型 for(i in 1:ntrees){ tree=subset(Orange,Tree==i) lines(tree$age,tree$circumference,type="b",lty=linetype[i],pch=plotchar[i]) } title("树的生长情况","折线图的一个示例") legend(xrange[1],yrange[2],1:ntrees,col=colors,lty=linetype,pch=plotchar,title="Tree")
树的生长情况
从图中可以看出,Tree4和Tree5在整个时间段中一直保持着最快的增长速度,而且Tree5在大约600天的时候超过了Tree4。
马赛克图
用于多个类别变量数据的可视化。
在马赛克图(mosaic plot)中,嵌套矩形面积正比于单元格频率,其中该频率即多维列联表中的频率,颜色或阴影可表示拟合模型的残差值。
利用vcd包中的mosaic( )函数绘制
mosai(table),table是数组形式的列联表
以Titanic数据集为例,该数据集包括生存/死亡人数,乘客的船舱等级(一等,二等,三等和船员),性别(男/女),以及年龄(儿童/成年)等。
查看数据:
ftable(Titanic) #ftable( ),用来生成多维列联表
作图:
library(vcd) #载入需要的包 mosaic(Titanic,shade=TRUE,legend=TRUE)
马赛克图
马赛克图中隐含着大量的数据信息。例如:(1)从船员到头等舱,存活率陡然提高;(2)大部分孩子都处在三等舱和二等舱中;(3)在头等舱中的大部分女性都存活了下来;(4)船员中女性很少,导致改组的Survived标签重叠(图底部的No和Yes)。
颜色和阴影表示拟合模型的残差值。在本例中,蓝色阴影表明,在假定生存率和船舱等级、性别和年龄层无关的情况下,该类别的生存/死亡数通常超过预期值,红色阴影含义则相反。
图形表明,在模型的独立条件下,头等舱女性存活数和男性船员死亡数超过模型预期值,三等舱男性的存活数比模型预期低。