基本图形
本篇文章主要参考了《R语言实战》1这本书。做了一些简化,是笔者学习的笔记,总结,书中例子复现。侵删。
条形图
条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。函数barplot()的最简 单用法是:barplot(height)
其中的height是一个向量或一个矩阵。
简单条形图
若height是一个向量,则它的值就确定了各条形的高度,并将绘制一幅垂直的条形图。使 用选项horiz=TRUE则会生成一幅水平条形图。你也可以添加标注选项。选项main可添加一个图 形标题,而选项xlab和ylab则会分别添加x轴和y轴标签。
library(vcd)
counts<-table(Arthritis$Improved)
counts
None Some Marked
42 14 28
你可以使用一幅垂直或水平的条形图来绘制变量counts。
barplot(counts,main = "Simple Bar Plot",xlab = "Improved",ylab = "Frequency")
#绘制简单条形图
barplot(counts,main = "Horizontal Bar Plot",xlab = "Frequency",ylab = "Improved",horiz = TRUE)
#绘制水平条形图
堆砌条形图和分组条形图
如果height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。 若beside=FALSE(默认值),则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出 堆砌的“子条”的高度。若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将 并列而不是堆砌。
library(vcd)
counts<-table(Arthritis$Improved,Arthritis$Treatment)
counts
barplot(counts,
main = "Stacked Bar Plot",
xlab = "Treatment",
ylab = "Frequency",
col = c("red","yellow","green"),
legend=rownames(counts))#堆砌条形图
barplot(counts,
main = "Grouped Bar Plot",
xlab = "Treatment",
ylab = "Frequency",
col = c("red","yellow","green"),
legend=rownames(counts),beside = TRUE)#分组条形图
第一个barplot函数绘制了一幅堆砌条形图,而第二个绘制了一幅分组条形图。我们同时使 用col选项为绘制的条形添加了颜色。参数legend.text为图例提供了各条形的标签(仅在 height为一个矩阵时有用)。
均值条形图
条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给 barplot()函数,来创建表示均值、中位数、标准差等的条形图。
states<-data.frame(state.region,state.x77)
means<-aggregate(states$Illiteracy,
by=list(state.region),
FUN=mean)
means
Group.1 x
1 Northeast 1.000000
2 South 1.737500
3 North Central 0.700000
4 West 1.023077
means<-means[order(means$x),]#将均值从小到大排序
means
Group.1 x
3 North Central 0.700000
1 Northeast 1.000000
4 West 1.023077
2 South 1.737500
barplot(means$x,names.arg = means$Group.1)
title("Mean Illiteracy Rate")#添加标题
条形图的微调
有若干种方式可以微调条形图的外观。例如,随着条数的增多,条形的标签可能会开始重叠。 你可以使用参数cex.names来减小字号。将其指定为小于1的值可以缩小标签的大小。可选的参 数names.arg允许你指定一个字符向量作为条形的标签名。你同样可以使用图形参数辅助调整文本间隔。
par(mar=c(5,8,4,2))
par(las=2)
counts<-table(Arthritis$Improved)
barplot(counts,
main="Treatment Outcome",
horiz=TRUE,cex.names=0.8,
names.arg=c("No Improvement","Some Improved",
"Marked Improvement"))
我们(使用las=2)旋转了条形的标签、修改了标签文本,并(使用mar)增加了y 边界的大小,为了让标签更合适,(使用cex.names=0.8)缩小了字体大小。par()函数能够让 你对R的默认图形做出大量修改。
棘状图
棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即 表示比例。棘状图可由vcd包中的函数spine()绘制。以下代码可以生成一幅简单的棘状图:
library(vcd)
attach(Arthritis)
counts<-table(Treatment,Improved)
spine(counts,main = "Spinogram Example")
detach(Arthritis)
治疗组同安慰剂组相比,获得显著改善的患者比例明显更高。
饼图
饼图可由以下函数创建:
pie(x,labels)
其中x是一个非负数值向量,表示每个扇形的面积,而labels则是表示各扇形标签的字符型向量。
par(mfrow=c(2,2))
slices<-c(10,12,4,16,8)
#将四幅图行组合为一幅
lbls<-c("US","UK","Australa","Germany","France")
pie(slices,labels = lbls,
main = "Simple Pie Chart")
pct<-round(slices/sum(slices)*100)
#为饼图添加比例数值
lbls2<-paste(lbls," ",pct,"%",sep = "")
pie(slices,labels = lbls2,col = rainbow(length(lbls2)),
main = "Pie Chart with Percentages")
#rainbow定义各扇的颜色
library(plotrix)#用这个包中的pie3d花三维饼图
pie3D(slices,labels=lbls,explode=0.1,
main="3D Pie Chart ")
mytable<-table(state.region)
lbls3<-paste(names(mytable),"\n",mytable,sep = "")
pie(mytable,labels = lbls3,
main = "Pie Chart from a Table\n (with sample sizes)")
library(plotrix)
slices<-c(10,12,4,16,8)
#将四幅图行组合为一幅
lbls<-c("US","UK","Australa","Germany","France")
fan.plot(slices,labels = lbls,main = "Fan Plot")
直方图
直方图通过在X 轴上将值域分割为一定数量的组,在Y 轴上显示相应值的频数,展示了连续 型变量的分布。可以使用如下函数创建直方图:
hist(x)
其中的x是一个由数据值组成的数值向量。参数freq=FALSE表示根据概率密度而不是频数绘制 图形。参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。
par(mfrow=c(2,2))
hist(mtcars$mpg)#简单直方图
#指定组数和颜色
hist(mtcars$mpg,
breaks = 12,
col = "red",
xlab = "Miles Per Gallon",
main = "Colored histogram with 12 bins")
#添加轴须图
hist(mtcars$mpg,
freq=FALSE,
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Histogram,rug plot density curve")
rug(jitter(mtcars$mpg))
lines(density(mtcars$mpg),col="blue",lwd=2)
x<-mtcars$mpg#添加正态密度曲线和外框
h<-hist(x,
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Histogram wih normal curve and box")
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="blue",lwd=2)
box()
核密度
核密度估计是用于估计随机变 量概率密度函数的一种非参数方法。
plot(density(x))
其中的x是一个数值型向量。由于plot()函数会创建一幅新的图形,所以要向一幅已经存在的图 形上叠加一条密度曲线,可以使用lines()函数。
par(mfrow=c(2,1))
d<-density(mtcars$mpg)
plot(d)
d<-density(mtcars$mpg)
plot(d,main="Kernel Density of Miles Per Gallon")
polygon(d,col="red",border="blue")
rug(mtcars$mpg,col = "brown")
在第一幅图中,你看到的是完全使用默认设置创建的最简图形。在第二幅图中,你添加了一 个标题,将曲线修改为蓝色,使用实心红色填充了曲线下方的区域,并添加了棕色的轴须图。 polygon()函数根据顶点的x和y坐标(本例中由density()函数提供)绘制了多边形。
par(lwd=2)#双倍线条宽度
library(sm)
attach(mtcars)
#创建分子因子
cyl.f<-factor(cyl,levels = c(4,6,8),
labels = c("4 cylinder","6 cyclinder",
"8 cyclinder"))
#创建密度图
sm.density.compare(mpg,cyl,xlab="Miles Per Gallon")
title(main = "MPG Distribution by Car Cylinders")
#通过鼠标单击添加图例
colfill<-c(2:(1+length(levels(cyl.f))))
legend(locator(1),levels(cy1.f),fill = colfill)
detach(mtcars)
箱线图
箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分 位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量 的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上 四分位数与下四分位数的差值)的观测。
boxplot(mtcars$mpg,main="Box plot",ylab="Miles per Gallon")
使用并列箱线图进行跨组比较
箱线图可以展示单个变量或分组变量。使用格式为:
boxplot(formula,data=dataframe)
其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。一个示例公式为y ~ A,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式y ~ A*B则将为类别型 变量A和B所有水平的两两组合生成数值型变量y的箱线图。 添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。参数 horizontal=TRUE可以反转坐标轴的方向。
boxplot(mpg~cyl,data = mtcars,
main="Car Mileage Dta",
xlab = "Number of Cylinders",
ylab = "Miles Per Gallon")
箱线图灵活多变,通过添加notch=TRUE,可以得到含凹槽的箱线图。
boxplot(mpg~cyl,data = mtcars,
notch=TRUE,
varwidth=TRUE,
col="red",
main="Car Mileage Dta",
xlab = "Number of Cylinders",
ylab = "Miles Per Gallon")
两个交叉因子的箱线图
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="MPG Distribution by Auto Type",
xlab = "Auto Type")
小提琴图
小提 琴图是箱线图与核密度图的结合。你可以使用vioplot包中的vioplot()函数绘制它。请在第一 次使用之前先安装vioplot包。 vioplot()函数的使用格式为:
vioplot(x1,x2,..,names=,col=)
其中x1, x2, …表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数 names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。
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("4 cyl","6 cyl","8 cyl"),
col="gold")
title("Violin Plots of Miles Per Gallon")
在图中,白点是中位数,黑色盒 型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
点图
你可以使用dotchart()函数 创建点图,格式为: dotchart(x,labels=)
其中的x是一个数值向量,而labels则是由每个点的标签组成的向量。你可以通过添加参数 groups来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor可以控制 不同组标签的颜色,cex可控制标签的大小。
dotchart(mtcars$mpg,labels = row.names(mtcars),
cex = .7,main = "Gas Mileage for Car Models",
xlab = "Miles Per Gallon")
分组、排序、着色后的点图
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 = .7,
groups = x$cyl,
gcolor = "black",
color = x$color,
pch=19,
main = "Gas Mileaga for Car Models\ngrouped by cylinder",
xlab = "Miles Per Gallon")
-
R语言实战 [美] Robert I. Kabacoff ↩︎