本章内容
条形图、箱线图和点图
饼图和扇形图
直方图与核密度图
6.1条形图(Simple Bar Plot简单条形图)(Horizontal Bar Plot水平条形图)
条形图通过垂直的或水平的条形展示了类别型变量的分布(频数)。
使用barplot()函数:barplot(height)。其中的height是一个向量或一个矩阵。
01简单条形图(height 是一个向量时)
示例如下:
>install.packages("vcd")#安装vcd包
> library(vcd)#载入包
> counts<-table(Arthritis$Improved)#提取样本中改善的量
> counts#输出结果
None Some Marked
42 14 28
>
> barplot(counts,
+ main = "Simple Bar Plot",
+ xlab = "Improvement",ylab = "Frequency")#绘制简单条形图
> barplot(counts,
+ main = "Horizontal Bar Plot",
+ xlab = "Frequency",ylab = "Improvement", col = c("red","yellow","green"),
+ horiz = TRUE)#绘制水平条形图,horiz = TRUE表示水平绘制,使用col添加颜色
02堆砌条形图和分组条形图(height 是一个矩阵时)
> library(vcd)
> counts<-table(Arthritis$Improved,Arthritis$Treatment)#选取治疗类型和改善情况
> counts#输出结果
Placebo Treated
None 29 13
Some 7 7
Marked 7 21
>
> 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)#绘制分组条形图
参数legend.text为图例提供了各条形的标签(仅在height为一个矩阵时有用)。
beside=FALSE(默认值),若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。
由于标签和图形重叠,影响美观和观测,所以回看第三章相关内容,改进如下:
legend("topright",legend=c("None","Some","Marked"),fill=c("red","yellow","green"))
但是效果还不是很理想。
03均值条形图
条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给barplot() 函数,来创建表示均值、中位数、标准差等的条形图。
> options(digits = 3)
> states<-data.frame(state.region,state.x77)
> means<-aggregate(states$Illiteracy,by=list(state.region),FUN=mean)
> means
Group.1 x
1 Northeast 1.00
2 South 1.74
3 North Central 0.70
4 West 1.02
>
> means<-means[order(means$x),]#将均值从小到大进行排序
> means
Group.1 x
3 North Central 0.70
1 Northeast 1.00
4 West 1.02
2 South 1.74
>
> barplot(means$x,names.arg = means$Group.1)
> title("Mean Illiteracy Rate")#添加标题
>#缺失一个标签,不知道为何?
lines(means$x,type = "b",pch=17,lty=2,col="red")#加入代码添加线条
04条形图的微调
有若干种方式可以微调条形图的外观。使用参数cex.names来减小字号。将其指定为小于1的值可以缩小标签的大小。可选的参数names.arg允许你指定一个字符向量作为条形的标签名。你同样可以使用图形参数辅助调整文本间隔。
> par(mar=c(5,8,4,2))#增加y边界的大小
> par(las=2)#旋转条形的标签
> counts<-table(Arthritis$Improved)
> barplot(counts,main = "Treatment Outcome",
+ horiz = TRUE,
+ cex.names = 0.8,#缩小字体,让标签更合适
+ names.arg = c("No Improvement","Some Improvement",
+ "Markde Improvement"))#修改标签文本
05 棘状图
> library(vcd)
> attach(Arthritis)
The following object is masked _by_ .GlobalEnv:
ID
> counts <- table(Treatment, Improved)
> spine(counts, main="Spinogram Example")
> detach(Arthritis)
>
6.2饼图
饼图可由以下函数创建:pie(x,labels)
其中x是一个非负数值向量,表示每个扇形的面积,而labels则是表示各扇形标签的字符型向量。
> par(mfrow=c(2,2))#四个图形为作为一组
> slices<-c(10,12,4,16,8)#饼图每一个片区的值,即扇形面积
> lbls<-c("US","UK","Australia","Germany","France")#国家名称,扇区的字符型向量
> #输出饼图
> pie(slices,labels = lbls,main = "Simple Pie Chart")
>
>
> pct<-round(slices/sum(slices)*100)#将面积数据转换为比例值
> lbls2<-paste(lbls," ",pct,"%",sep = "")#标签内容
> #有5种颜色的饼图
> pie(slices,labels = lbls2,col = rainbow(length(lbls2)),
+ main = "Pie Chart with Percentages")
> #生成3D饼图
> library(plotrix)
> pie3D(slices,labels=lbls,explode=0.1,
+ main="3D Pie Chat ")
> #从表格创建饼图
> 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)")
>
在R中,扇形图是通过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 = "Fan Plot")
6.3直方图
使用如下函数创建直方图:hist(x),其中的x是一个由数据值组成的数值向量。参数freq=FALSE表示根据概率密度而不是频数绘制图形。参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。
> par(mfrow=c(2,2))#定义图形位置
> hist(mtcars$mpg)#绘制简单直方图,未指定任何参数,默认图形
> #绘制信息清晰的直方图,添加标签、标题、颜色
> hist(mtcars$mpg,
+ breaks = 12,#指定为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 with 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()
6.4核密度图
绘制密度图的方法(不叠加到另一幅图上方)为: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")#添加棕色的轴须图
> library(sm)
> attach(mtcars)
> #创建分组因子。
> cyl.f<-factor(cyl,levels = c(4,6,8),
+ labels = c("4 cylinder","6 cylinder",
+ "8 cylinder"))#变量 cyl 是一个以4、6或8编码的数值型变量。
> #为了向图形提供值的标签,这里 cyl 转换为名为 cyl.f 的因子。
>
> 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(cyl.f),fill=colfill)
6.5箱线图
箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。
> #生成箱线图
> boxplot(mtcars$mpg,main="Box plot",ylab="Miles per Gallon")
> boxplot.stats(mtcars$mpg)
$stats
[1] 10.40 15.35 19.20 22.80 33.90
$n
[1] 32
$conf
[1] 17.11916 21.28084
$out
numeric(0)
01使用并列箱线图进行跨组比较
箱线图可以展示单个变量或分组变量。使用格式为:oxplot(formula,data=dataframe)
其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。
一个示例公式为yA,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式yA*B则将为类别型变量A和B所有水平的两两组合生成数值型变量y的箱线图。添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。参数horizontal=TRUE可以反转坐标轴的方向。
#为每个气缸生成每加仑行驶的英里数箱线图
> boxplot(mpg~cyl,data = mtcars,
+ main="Car Mileage Data",
+ xlab="Number of Cylinders",
+ ylab="Miles per Gallom")
> #添加notch=TRUE生成含凹槽的箱线图
> boxplot(mpg~cyl,data = mtcars,
+ notch=TRUE,
+ varwidth=TRUE,
+ col="red",
+ main="Car Mileage Data",
+ xlab="Number of Cylinders",
+ ylab="Miles Per Gallon")
Warning message:
In bxp(list(stats = c(21.4, 22.8, 26, 30.4, 33.9, 17.8, 18.65, 19.7, :
一些槽在折叶点外('box'): 可能是因为notch=FALSE
#两个交叉因子的箱线图
> #创建气缸数量因子
> 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,
+ col=c("gold","darkgreen"),
+ main="MPG Distribution by Atuo Type",
+ xlab="Atuo Type",
+ ylab="Miles Per Gallon")
从图中可以看到不同组间油耗的区别非常明显。同时也可以发现,六缸车型的每加仑汽油行驶的英里数分布较其他两类车型更为均匀。与六缸和八缸车型相比,四缸车型的每加仑汽油行驶的英里数散布最广(且正偏)。在八缸组还有一个离群点。
02小提琴图
使用vioplot包中的vioplot()函数绘制它。请在第一次使用之前安装vioplot包。
vioplot()函数的使用格式为:vioplot(x1,x2,...,names=,col=)
其中x1,x2,...表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。
> install.packages("vioplot")
> library(vioplot)
Warning message:
程辑包‘vioplot’是用R版本3.3.3 来建造的
> 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",
+ ylab = "Miles Per Gallon",
+ xlab = "Number of Cylinders")
(小提琴图真的很漂亮)
在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
6.6点图
点图提供了一种在简单水平刻度上绘制大量有标签值的方法。
你可以使用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")
> #各车型依汽缸数量分组的每加仑汽油行驶英里数点图,分组排序后的点图
> #根据每加仑汽油行驶英里数(从最低到最高)
> #对数据框 mtcars 进行排序,结果保存为数据框 x
> x<-mtcars[order(mtcars$mpg),]
> #将数值向量 cyl 转换为一个因子
> x$cyl<-factor(x$cyl)
> #添加一个字符型向量 ( color )到数
> #据框 x 中,根据 cyl 的值,它所含的值
> #为 "red" 、 "blue" 或 "darkgreen"
> 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",#数字4、6、8显示为黑色
+ color=x$color,#点和标签的颜色
+ pch=19,
+ main="Gas Mileage for Car Models\ngrouped by cylinder",
+ xlab="Mlies Per Gallon")
从图中可以看到,随着汽缸数的减少,每加仑汽油行驶的英里数有了增加。但也有例外。例如,Pontiac Firebird有8个汽缸,但较六缸的Mercury280C和Valiant的行驶英里数更多。六缸的Hornet 4 Drive与四缸的Volvo 142E的每加仑汽油行驶英里数相同。同样明显的是,Toyota Corolla的油耗最低,而Lincoln Continental和Cadillac Fleetwood是英里数较低一端的离群点。
本章小结
- 学会了使用条形图和饼图了解类别型变量的分布,以及通过堆砌条形图和分组条形图理解不同类别型输出的组间差异。
- 探索了直方图、核密度图、箱线图、轴须图以及点图可视化连续型变量分布的方式。
- 了解了密度图、并列箱线图和分组点图可视化连续型输出变量组间差异的方法。
对单个变量(数值型变量和类别型变量)的可视化方法有了一定的认识和掌握,通过各种常用图形的绘制,加深了理解单个变量的分布和意义,有利于后续多变量统计方法的学习。
重点是熟悉并掌握各类图形的应用场景、使用函数,以及相关的绘图函数应用。