R语言学习系列19基本统计图形.docx
《R语言学习系列19基本统计图形.docx》由会员分享,可在线阅读,更多相关《R语言学习系列19基本统计图形.docx(20页珍藏版)》请在冰豆网上搜索。
R语言学习系列19基本统计图形
19.基本统计图形
目录:
一.条形图
二.饼图
三.直方图
四.箱线图
五.点图
六.散点图
七.相关图
八.QQ图
九.等高线图
十.热图
正文:
要观察分类变量与定量变量的数据,最基本的方法就是用图形:
1.将变量的分布作可视化展示;
2.通过结果变量进行跨组比较。
一、条形图
条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。
函数barplot()的最简单用法是:
barplot(height)
其中,height为向量或矩阵。
1.简单条形图(height为向量)
library(vcd)#使用数据集Arthritis
counts<-table(Arthritis$Improved)
counts
NoneSomeMarked
421428
par(mfrow=c(1,2))
barplot(counts,main="SimpleBarPlot",xlab="Improvement",ylab="Frequency")#竖直条形图
barplot(counts,main="HorizontalBarPlot",xlab="Frequency",ylab="Improvement",horiz=TRUE)#水平条形图
2.堆砌条形图和分组条形图(height为矩阵)
若beside=FALSE(默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出堆砌的“子条”的高度。
若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。
library(vcd)#使用数据集Arthritis
counts<-table(Arthritis$Improved,Arthritis$Treatment)
counts
PlaceboTreated
None2913
Some77
Marked721
par(mfrow=c(1,2))
barplot(counts,main="StackedBarPlot",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),legend=rownames(counts))#堆砌条形图
barplot(counts,main="GroupedBarPlot",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),legend=rownames(counts),beside=TRUE)#分组条形图
注:
棘状图可对堆砌条形图进行重缩放
library(vcd)
attach(Arthritis)
counts<-table(Treatment,Improved)
spine(counts,main="SpinogramExample")
detach(Arthritis)
3.均值条形图
条形图并不一定要基于计数数据或频率数据,也可以使用数据整合函数并将结果传递给函数barplot(),来创建表示均值、中位数、标准差等的条形图。
states<-data.frame(state.region,state.x77)
means<-aggregate(states$Illiteracy,by=list(state.region),FUN=mean)
means<-means[order(means$x),]#均值从小到大排序
means
Group.1x
3NorthCentral0.700000
1Northeast1.000000
4West1.023077
2South1.737500
barplot(means$x,names.arg=means$Group.1)#参数2设置标签
title("MeanIlliteracyRate")
4.条形图的微调
par(mar=c(5,8,4,2))
par(las=2)#旋转图形标签
counts<-table(Arthritis$Improved)
barplot(counts,main="TreatmentOutcome",horiz=TRUE,cex.names=0.8,names.arg=c("NoImprovement","SomeImprovement","MarkedImprovement"))#cex.names缩小字体
二、饼图
饼图的功能同条形图,每一个扇形的角度与相应频数成比例。
基本函数为:
pie(x,labels)
其中,x为非负数值向量,表示每个扇形的面积;labels表示各扇形标签的字符型向量。
attach(mtcars)
piedata<-table(cyl)
percent<-as.vector(piedata)/sum(as.vector(piedata))*100#计算百分比
pie(piedata,labels=paste(c("4","6","8"),"cylinders:
",percent,"%"))
detach(mtcars)
注:
饼图不容易比较各扇形的大小,plotrix包中的fan.plot()函数可以绘制扇形图。
library(plotrix)
slices<-c(10,12,4,16,8)
lbls<-c("US","UK","Australia","Germany","France")
fan.plot(slices,labels=lbls,main="FanPlot")
三、直方图
对于定量变量(数值型变量),常用直方图来展示某个变量取值的分布,利用直方图可以估计总体的概率密度。
将变量取值的范围分成若干区间。
直方图是用面积而不是用高度来表示数,总面积是100%.每个区间矩形的面积恰是落在该区间内的百分数(频率),所以
矩形的高=频率/区间长度=密度
特别地,若区间是等长的,则“矩形的高”就是频率。
注意:
直方图矩形之间是没有间隔的。
函数hist()用于绘制直方图,基本格式为:
hist(x,breaks="Sturges",freq=NULL,
probability=...,main=...)
其中,x为数值向量;
breaks为分段区间:
各区间端点构成的向量、分段数、计算划分区间的算法名称、划分区间个数的函数(方法);
freq默认为TRUE表示绘制频数直方图,若为FALSE则绘制频率直方图;
probability与freq对立,设置是否以概率密度作图,默认为FALSE
attach(mtcars)
par(mfrow=c(2,2))
hist(mpg)#简单直方图
hist(mpg,breaks=12,col="red",xlab="MilesPerGallon",main="Coloredhistogramwith12bins")#指定组数和颜色
hist(mpg,freq=FALSE,breaks=12,col="red",xlab="MilesPerGallon",main="Histogram,rugplot,densitycurve")
rug(jitter(mpg))#添加轴须
lines(density(mpg),col="blue",lwd=2)#添加密度曲线
x<-mpg
hist(x,breaks=12,freq=FALSE,col="red",xlab="MilesPerGallon",main="Histogramwithnormalcurveandbox")
lines(density(rnorm(1e+6,mean(mpg),sd(mpg))),lty=2,col="red")#添加正态密度曲线
box()
detach(mtcars)
注:
sm包中的函数pare()也用于绘制核密度图,可以堆放多条密度曲线,用于组间差异的比较。
基本格式为:
pare(x,group,h,...)
其中,x为数值向量;group为分组变量(因子型数据);h为光滑参数。
示例:
library(sm)
attach(mtcars)
pare(wt,factor(cyl))
legend("topright",levels(factor(cyl)),lty=1:
3,col=2:
4,bty="n")
detach(mtcars)
四、箱线图
在一条数轴上,以数据的上下四分位数(Q1-Q3)为界画一个矩形盒子(中间50%的数据落在盒内);在数据的中位数位置画一条线段为中位线;用◇标记数据的均值;默认延长线不超过盒长的1.5倍,之外的点认为是异常值(用○标记)。
箱线图的主要应用就是,剔除数据的异常值、判断数据的偏态和尾重、可视化组间差异。
用函数boxplot()绘制箱线图,单独的箱线图调用格式:
boxplot(x,range=1.5,width=NULL,varwidth=FALSE,
notch=FALSE,horizontal=FALSE,...)
其中,x为一系列数值向量,依次做出箱线图;
range设置延长线长度:
几倍盒长,默认1.5;
width设置盒长;
varwidth设置盒宽与样本量的平方根是否成比例,默认FALSE
notch设置是否绘制带刻槽的凹形盒,默认FALSE
horizontal设置箱线图的方向,默认FALSE垂直作图,TURE为水平作图;
2.组间比较的箱线图调用格式:
boxplot(formula,data=NULL,subset,...)
其中,formula为一个公式,例如y~grp,表示y为数值向量,grp为分组变量;
data为提供数据的数据框;
boxplot(mpg~cyl,data=mtcars,
main="不同汽缸数量车型油耗的箱线图",
xlab="NumberofCylinders",
ylab="MilesPerGallon")
可见,随着汽缸数的减少,油耗明显降低。
mtcars$cyl.f<-factor(mtcars$cyl,levels=c(4,6,8),labels=c("4","6","8"))
mtcars$am.f<-factor(mtcars$am,levels=c(0,1),labels=c("auto","standard"))
boxplot(mpg~am.f*cyl.f,data=mtcars,
varwidth=TRUE,col=c("gold","darkgreen"),
main="两个交叉因子的箱线图",
xlab="AutoType")
可见,对于四缸和六缸车型,标准变速箱的油耗更高。
但是对于八缸车型,油耗似乎没有差别。
注:
将核密度图以镜像方式在箱线图上的叠加,可得到小提琴图。
白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。
外部形状即为核密度估计。
library(vioplot)
x1<-mtcars$mpg[mtcars$cyl==4]
x2<-mtcars$mpg[mtcars$cyl==6]
x3<-mtcars$mpg[mtcars$cyl==8]
vioplot(x1,x2,x3,names=c("4cyl","6cyl","8cyl"),col="gold")
title("ViolinPlotsofMilesPerGallon")
五、点图
点图提供了一种在简单水平刻度上绘制大量有标签值的方法。
用dotchart()函数绘制点图,基本格式为:
dotchart(x,labels=,groups=,cex=,pt.cex=,
pch=,gpch=,color=,gcolor=...)
其中,x为数值向量;
labels为各个点的标签组成的向量;
groups指定用来对x中元素进行分组的因子(参数gcolor可以控制不同组标签的颜色,cex可控制标签的大小);
pch,pt.cex,color指定绘图符号,及其大小、颜色;
dotchart(mtcars$mpg,labels=row.names(mtcars),cex=0.7,
main="GasMilageforCarModels",
xlab="MilesPerGallon")
展示了同一个水平轴上观察每种车型的每加仑汽油行驶英里数,通常点图在经过排序并且分组变量被不同的符号和颜色区分开的时候最有用。
x<-mtcars[order(mtcars$mpg),]
x$cyl<-factor(x$cyl)
x$color[x$cyl==4]<-"red"
x$color[x$cyl==6]<-"blue"
x$color[x$cyl==8]<-"darkgreen"
dotchart(x$mpg,labels=row.names(x),cex=0.7,
pch=19,groups=x$cyl,
gcolor="black",color=x$color,
main="GasMilageforCarModels\ngroupedbycylinder",xlab="MilesPerGallon")
六、散点图
1.一般散点图
以两个定量变量的数值在二维坐标系中描点,生成的图形就是散点图。
散点图能直观地显示出因变量随自变量变化而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。
用函数plot()绘制散点图,基本格式为:
plot(x,y,type,main=,…)
其中,x为自变量数据;y为因变量数据;main设置标题。
x<-seq(from=0,to=2*pi,length=10)
y=sin(x)
type=c("p","l","b","o","c","h","s","S","n")
op=par(mfrow=c(3,3),mar=c(4,4,1,1))
for(iin1:
9){
plot(x,y,type=type[i],main=paste("type:
",type[i]))
}
par(op)
两组数据的关系用散点图可以清楚地描述,在散点图中加入一条拟合曲线有助于更好地把握变量间的关系。
lowess()函数通过加权多项式回归对散点图进行平滑拟合一条非线性的曲线,但只能处理二维情形,类似的函数loess()可处理多维。
基本格式为:
lowess(x,y=NULL,f=2/3,iter=3)
其中,x,y为两个向量;
f为平滑的跨度,值越大曲线越平滑;
iter为迭代次数。
attach(cars)
plot(dist,speed)
lines(lowess(dist,speed),col="red",lwd=1.5)
detach(cars)
注1:
要克服散点图中数据点重叠的问题,可以绘制向日葵散点图,它在有重叠的地方,用一朵“向日葵花”的花瓣数目来表示数据重叠的个数,基本格式:
sunflowerplot(x,y,number,rotate=,size=,seg.col=,seg.lwd=)
注2:
plot(图类名(x),…)可以绘制相应类型的图形,例如
plot(density(wt))——绘制数据变量wt的核密度图;
plot(data.frame数据)——绘制两两列的散点图矩阵;……
2.散点图矩阵
即多个变量的两两散点图以矩阵的形式排列起来,矩阵中每个散点图的行、列的长度都是固定的。
使用函数pairs()绘制散点图矩阵,绘图对象为数据框的调用格式:
pairs(x,labels,panel=points,...)
其中,x为数据框的若干列数据;labels设置变量名标签;panel面板函数。
或者绘图对象为公式的调用格式:
pairs(formula,data=NULL,subset,...)
其中,公式为~x+y+z的形式,设置要绘制的变量;data为数据框名;subset可选取部分子集。
如下两种代码效果相同:
pairs(mtcars[,c(1,3,5,6)],col=as.integer(factor(cyl))+1,main="ScatterPlotMatrix")
pairs(~mpg+disp+drat+wt,data=mtcars,col=as.integer(factor(cyl))+1,main="ScatterPlotMatrix")
七、相关图
相关图是对相关系数矩阵的可视化,散点图矩阵只能显示两两变量间的相关关系,变量数增加将不再适用。
使用corrgram包中的函数corrgram(),基本格式为:
corrgram(x,type=,order=FALSE,labels,panel=panel.shade,lower.panel=,upper.panel=,diag.panel=NULL,text.panel=textPanel,cor.method="pearson",...)
其中,x为数据框;
type="data"或"cor/corr",设置x是数据框还是相关矩阵;
order设置变量排序,默认FALSE,相关矩阵按数据框名对变量排序,若为TRUE,相关矩阵将用主成分分析法对变量重排序,这将使得二元变量的关系模式更为明显;
lower.panel,upper.panel设置主对角下方、上方的元素类型:
panel.pie用饼图的填充比例表示相关性大小,panel.shade用阴影的深度表示相关性大小,panel.ellipse绘制置信椭圆和平滑拟合曲线,panel.pts绘制散点图;
text.panel取值panel.txt时输出变量名字;
diag.panel控制主对角线元素类型,panel.minmax输出变量的最大、最小值;
cor.method设置计算相关性的方法,默认是"pearson",可选项还有"spearman","kendall"
以mtcars为例,绘制相关图。
library(corrgram)
attach(mtcars)
#相关图,主对角线上方绘制置信椭圆和平滑拟合曲线,主对角线下方绘制阴影
corrgram(mtcars,order=TRUE,upper.panel=panel.ellipse,main="Correlogramofmtcarsintercorrelations")
#相关图,主对角线上方绘制散点图,主对角线下方绘制饼图
corrgram(mtcars,order=TRUE,upper.panel=panel.pts,lower.panel=panel.pie,main="Correlogramofmtcarsintercorrelations")
detach(mtcars)
运行结果:
八、QQ图
QQ图用来检查数据是否服从某种分布。
其原理是,若一批数据服从某种理论分布,看其经验分布和理论分布是否一致。
将排序后的数据与理论分布的分位数进行比较,若大致相等,则说明经验分布和理论分布相似。
用函数qqplot(),qqline(),qqnorm()绘制QQ图,基本格式为:
qqnorm(y,ylim,...)
qqline(y,...)
qqplot(x,y,...)
以mtcars的wt为例,绘制正态和t分布的QQ图。
attach(mtcars)
par(mfrow=c(1,2))
qqnorm(wt)
qqline(wt)
qqplot(qt(ppoints(length(wt)),df=5),wt,xlab="TheoreticalQuantiles",ylab="SampleQuantiles",main="Q-Qplotfortdsn")
#QQ图中,函数ppoints()用来生成一组概率值,以估计逆分布
#函数qt()为t分布的分位数函数
qqline(wt)
detach(mtcars)
运行结果:
九、等高线图
对三维数据(x,y,z),其中(x,y)表示坐标位置,z值为每个坐标位置上的高度值构成的矩阵。
将z值相等的点连接起来形成的线就是等高线。
估计x,y的核密度,得到一个密度值矩阵,然后用x,y以及密度值矩阵做等高图,由于密度值反映的是某个位置上数据的密集程度,所以,这样的等高线图展示了一个聚类现象。
用函数contour()绘制等高线图,基本格式为:
contour(x,y,z,nlevels=10,levels=,labels=,
xlim,ylim,zlim,drawlabels=TRUE,method=)
其中,x,y,z为坐标位置和高度值;
nlevels为等高线条数,调整等高线的疏密;
levels为一系列等高线的z值,只有这些值或者附近的点才被连起来;
labels为等高线上的标记字符串,默认是高度数值;
xlim,ylim,zlim设置坐标轴范围;
drawlabels设置是否绘制标签,默认TRUE;
method为等高线标签的画法:
默认"flattest"值等高线平缓的地方加标签,嵌在等高线内;"simple"在等高线末端加标签,标签与等高线重叠;"edge"值等高线末端加标签,嵌在等高线内。
示例:
library(KernSmooth)
attach(mtcars)
datas<-data.frame(wt,mpg)
est<-bkde2D(datas,apply(datas,2,dpik))#估计二维核密度
contour(est$x1,est$x2,est$fhat,nlevels=15,col="darkgreen",xlab="wt",ylab="mpg")
points(datas)#加上数据散点
detach(mtcars)
运行结果:
十、热图
热图将数值用颜色表达,颜色越深表示数值越大。
热图不只是简单的显示数值的分布状况,而且对数据进行层次聚类,以聚类的顺序排列。
用函数heatmap()绘制热图,基本格式为:
heatmap(x,Rowv=,Colv=,distfun=dist,hclustf