R中的基本图形包括:条形图(barplot),饼状图(pie),直方图(hist),核密度图(plot(density(x)),箱线图(boxplot),散点图(plot、dotchart)。
1、条形图
1.1 简单条形图
条形图通过水平或垂直的条形展示了类别型变量的频数分布。条形图绘制通过barplot()函数,barplot(height, ...)
, height
表示一个向量或者矩阵。
> head(Arthritis); counts <- table(Arthritis$Improved);counts
ID Treatment Sex Age Improved
1 57 Treated Male 27 Some
2 46 Treated Male 29 None
3 77 Treated Male 30 None
4 17 Treated Male 32 Marked
5 36 Treated Male 46 Marked
6 23 Treated Male 58 Marked
None Some Marked
42 14 28
> opar <- par(no.readonly=TRUE)
> par(mfrow=c(2,2))
> barplot(counts, main='Fig 1',xlab='Improment', ylab='Frequency')
> barplot(counts, main='Fig 2',ylab='Improment', xlab='Frequency', horiz=T)
###当要绘制的类别型变量是一个因子或有序型因子时,可以直接使用plot()快速绘制条形图
> plot(Arthritis$Improvement, main='Fig 3',xlab='Improment', ylab='Frequency')
> plot(Arthritis$Improvement, main='Fig 4',ylab='Improment', xlab='Frequency',horiz=T)
> par(opar)
1.2 堆砌条形图和分组条形图
如果height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。若beside=FALSE(默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出堆砌的“子条”的高度。若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。更多的参数调整可使用?barplot
进行查看。
> counts <- table(Arthritis$Improved, Arthritis$Treatment)
> counts
Placebo Treated
None 29 13
Some 7 7
Marked 7 2
> barplot(counts, main='Stacked fig', xlab='Treatment', ylab='Frequency',col=c('red','blue','green'), legend=rownames(counts))
> barplot(counts, main='Unstacked fig', xlab='Treatment', ylab='Frequency',col=c('red','blue','green'), legend=rownames(counts), beside=T)
1.3 棘状图
棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即
表示比例(可理解为进行了标准化)。棘状图可由vcd
包中的函数spine()
绘制。
> counts <- table(Arthritis$Treatment, Arthritis$Improved);counts
None Some Marked
Placebo 29 7 7
Treated 13 7 21
> spine(counts, main='Spinogram Example')
2、饼图
饼图可以观察到各部分的比例,但是用的较少,大多认为他不及条形图来的直观。饼图使用pie()
进行绘制。
> par(mfrow=c(2,2))
> slices<-c(10,12,4,16,8)
> lbs<-c('US','UK','Australia','Germany','France')
### 图1
> pie(slices,labels=lbs,main='Fig-1')
> pct<-round(slices/sum(slices)*100)
> lbs2<-paste(lbs,' ',pct,'%',sep='')
### 图2
> pie(slices,labels=lbs2,col=rainbow(length(lbs2)),main='Fig-2')
> library(plotrix)
### 图3
> pie3D(slices,labels=lbs,explode=0.1,main='Fig-3D')
> mytable<-table(state.region)
> lbs3<-paste(names(mytable),'\n',mytable,sep='')
### 图4
> pie(mytable,labels=lbs3,main='Fig-4')
3、直方图
条形图用来绘制类别型变量,而直方图则是用来绘制连续型变量,在y轴显示相应的频数。用法hist(x)
,x为数值向量。较为常用的参数有freq
和breaks
,freq=FALSE
表示使用概率密度而不是频数,breaks
则是用于控制直方图中方条的数量(或称分组数量)。
par(mfrow=c(2,2))
### 最简单的直方图,使用默认参数
hist(mtcars$mpg)
### 设置填充颜色,分组数量,标题等
hist(mtcars$mpg,breaks=12,col='blue',xlab='MPG',main='Hist 2')
### 使用概率密度而非频数
hist(mtcars$mpg,freq=F,col='green',xlab='MPG',main='Hist 3',breaks=12)
### 添加轴须线,并使用jitter将聚集在一起的节打散
rug(jitter(mtcars$mpg))
### 添加核密度曲线
lines(density(mtcars$mpg),col='red',lwd=2)
x<-mtcars$mpg
h<-hist(x,col='yellow',xlab='MPG',main='Hist 4',breaks=12)
xfit<-seq(min(x),max(x),length=40);yfit=dnorm(xfit,mean=mean(x),sd=sd(x));yfit<-yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col='red',lwd=2)
### 添加外框
box()
在图三中我们添加了两个另外的图:轴须线(使用rug生成,并使用jitter将聚集在一起的点打散),和核密度曲线。最后一个图添加的正态曲线来自于Peter Dalgaard的建议。
4、核密度图
核密度估计是用于估计随机变量概率密度函数的一种非参数方法。核密度图可用来观察连续型变量分布。单独的核密度图绘制很简单:plot(density(x)
,在已有的图形中添加核密度曲线则可以使用lines(density(x))
。
par(mfrow=c(1,2))
d<-density(mtcars$mpg)
### 图1,简单绘图
plot(d)
### 图2 添加标题
plot(d, main='Density')
### 填充图形
polygon(d,col='red',border='blue')
### 添加轴须线
rug(jitter(mtcars$mpg),col='green')
polygon()函数根据顶点的x和y坐标(图2中由density()函数提供)绘制了多边形。 使用sm包中的sm.density.compare()函数可向图形叠加两组或更多的核密度图。使用格式为:
sm.density.compare(x, factor)`,其中的x是一个数值型向量, factor是一个分组变量。请在第一次使用sm包之前先安装它。下面的例子比较了拥有4个、 6个或8个汽缸车型的每加仑汽油行驶英里数。
par(lwd=2)
library(sm)
attach(mtcars)
cyl.f <- factor(cyl, levels=c(4,6,8),labels=c('4 cyl', '6 cyl', '8 cyl'))
sm.density.compare(mpg,cyl,xlab='MPG')
title(main='MPG distribution')
colfill<-c(2:(1+length(levels(cyl.f))))
legend(locator(1),levels(cyl.f),fill=colfill)
detach(mtcars)
5、箱线图
5.1 普通箱线图
箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值, IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。
箱线图可以展示单个变量或分组变量,使用格式为boxplot(formula, data=dataframe
,其中的formula是一个公式, dataframe代表提供数据的数据框(或列表)。一个示例公式为y ~A,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式y ~ A*B则将为类别型变量A和B所有水平的两两组合生成数值型变量y的箱线图。
添 加 参 数varwidth=TRUE
将 使 箱 线 图 的 宽 度 与 其 样 本 大 小 的 平 方 根 成 正 比 。 参 数horizontal=TRUE
可以反转坐标轴的方向。通过添加notch=TRUE
,可以得到含凹槽的箱线图。若两个箱的凹槽互不重叠,则表明它们的中位数有显著差异
layout(matrix(c(1,2,3,3),2,2,byrow=TRUE),widths=c(1,2))
### 单个变量的分布范围
boxplot(mtcars$mpg, main='mpg')
### 一个分组变量,通过cyl对mpg进行分组
boxplot(mpg~cyl,mtcars,varwidth=TRUE,notch=TRUE,main='mpg~cyl',xlab='cyl',ylab='mpg')
### 两个分组变量:使用(cyl, am)组合对mpg进行分组
## 创建cyl的因子
cyl.f <- factor(mtcars$cyl, levels=c(4,6,8), labels=c('4','6','8'))
## 创建am的因子
am.f <- factor(mtcars$am, levels=c(0,1),labels=c('aotu','standard'))
boxplot(mpg~cyl.f*am.f,data=mtcars,varwidth=TRUE,col=c('green','red'),main='mpg~am*cyl',xlab='auto type', ylab='mpg')
5.2 小提琴图
小提琴图是箱线图与核密度图的结合。可以使用vioplot包中的vioplot()函数绘制它。
格式为vioplot(x1, x2, ..., names=, col=)
,其中x1, x2, …表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数names是小提琴图中x轴标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。
library(vioplot)
attach(mtcars)
x1<-mpg[cyl==4]
x2<-mpg[cyl==6]
x3<-mpg[cyl==8]
vioplot(x1,x2,x3,names=c('4 cyl','6 cyl','8 cyl'), col='gold')
title(main='vioplot mpg~cyl',xlab='cyl',ylab='mpg')
detach(mtcars)
小提琴图基本上是核密度图以镜像方式在箱线图上的叠加。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
6、点图
6.1 简单散点图
简单散点图可以直接通过plot(x, y, ...)
来绘制。
x<-seq(1,5)
y<-seq(3,7)
plot(x,y,main='scatter',pch=8,col='red')
### 拟合一条曲线
abline(lm(y~x),lty=2,lwd=2)
6.2 点图
点图提供了一种在简单水平刻度上绘制大量有标签值的方法。可以使用dotchart()
函数创建点图。格式为:dotchart(x, labels=)
,其中的x是一个数值向量,而labels则是由每个点的标签组成的向量。通过添加参数groups
来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor
可以控制不同组标签的颜色, cex
可控制标签的大小。
通常来说,点图在经过排序并且分组变量被不同的符号和颜色区分开的时候最有用。
layout(matrix(c(1,2,1,2),2,2,byrow=TRUE))
### 未经整理的数据
dotchart(mtcars$mpg, labels=row.names(mtcars),cex=0.7,main='mgp for car models',xlab='mpg')
### 根据cyl进行排序
x<-mtcars[order(mtcars$mpg),]
### 将cyl转换为因子
x$cyl<-factor(x$cyl)
### 添加color变量到数据框中
x$color[x$cyl==4]<-'red'
x$color[x$cyl==6]<-'blue'
x$color[x$cyl==8]<-'green'
dotchart(x$mpg, labels=row.names(x), cex=0.7,
groups=x$cyl, ### 根据cyl因子来进行分组
gcolor='black', ### 分组标签 4,6,8的颜色
color=x$color, ### 点和标签的颜色
main='mpg for car models',
xlab='mpg')
此外, Hmisc包也提供了一个带有许多附加功能的点图函数(恰如其分地叫做dotchart2)。