R语⾔基本画图——最常⽤绘图函数速查
R语⾔描述性分析绘图篇
导读
本⽂是描述性分析画图篇,对于记性不⼤好的我,每次画图的时候都会忘掉⼀些参数怎么设置,所以⼀直想有⼀份R画图⼤全,包含所有绘图函数的参数解释和详细例⼦。等是等不到了,只能⾃⼰动⼿整理⼀份!翻了⼀遍R函数⽂档,历时n天终于整理好了。。啾咪,这篇⽂章超级⽅便速查R语⾔画各种图的⽤法,包括箱线图散点图柱状图相关图等等所有重要图表的⽤法等,真的超级详细了。。
⼀、画图前需要明确的事
数据报告要包含研究⽬的、描述性分析、特征⼯程、建模分析、模型检验、模型对⽐的过程,最后需要加上最重要的结论和建议。其中数据处理的第⼀步就是描述性分析。关于描述性分析具体怎么写以及通过统计量进⾏描述的内容,我在前⼀篇⽂章已经⼤致梳理过,详见。这次就重点介绍如何利⽤统计图表来对变量进⾏描述性分析。
描述性分析通常要解决的问题⽆⾮是两个,⼀是要描述单个变量的特征还是⼏个变量之间的关系?⼆是变量是定性变量还是定量变量?明确这两点后图表就易于确定了。
下⾯依旧主要⽤上⼀篇⽂章的数据集,来⾃狗熊会(:CluBear)的⼆⼿市场上在售的1289条的汽车的10项指标数据,⾃变量包括汽车描述,排量,性能,级别,车门,车座,马⼒,发动机和前制动类型等10个变量定因变量为汽车的价格,处理后增加了年份变量,探究汽车价格的关键影响指标。
变量类型变量名详细说明取值范围备注
因变量在售价格单位:万元  1.3~280.0
⾃变量描述汽车品牌与年份及关键字⽂字信息
排量单位:升  1.3~6.2
性能定性变量,2个⽔平⼿动,⾃动⼿动约占28%,⾃动72%
级别定性变量,5个⽔平⼩型,紧凑型,中型,中⼤型,⼤型左边按照从⼩到⼤排序
车门整数变量2,3,4,5存在部分数据偏差
汽车价钱车座整数变量4,5,7,8
马⼒连续变量85~575
发动机定性变量,7个⽔平L3,L4,V5,L6,V8,H4,L5代表不同的⽓缸排列⽅式前制动类型定性变量,2个⽔平盘式,通风盘式制动⽅式,通风盘式造价较⾼年份整数变量2004-2017
R语⾔⾃带的graphics就有很多绘图函数,如果更⾼级的作图还可以利⽤ggplot2包,这个包具体后⾯再说,今天先⽤基础函数来写画图⼆、单变量绘图
1. 直⽅图
直⽅图通过将数值型的变量分为⼏组,显⽰对应组内的频数或者频率来刻画变量的分布情况。所以直⽅图通常⽤来刻画连续型变量的分布情况,并且函数可以⽤由hist(x)⽣成
hist(x, breaks ="Sturges",
freq = NULL, probability = !freq,
include.lowest = TRUE, right = TRUE,
density = NULL, angle =45, col = NULL, border = NULL,
main = paste("Histogram of", xname),
xlim =range(breaks), ylim = NULL,
xlab = xname, ylab,
axes = TRUE, plot = TRUE, labels = FALSE,
nclass = NULL, warn.unused = TRUE,...)
所有的函数⾥⾯都会有很多参数可以控制调节,类似颜⾊字体x轴y轴范围等参数都是相通的,所以这边列出hist函数⾥⾯最关键的⼏个参数:
freq:TRUE表⽰y轴为频数,FALSE时表⽰显⽰频率,当且仅当间隔是等距的(且未指定概率)时,默认值为TRUE,所以平时还是设定⼀下freq的值⽐较好
breaks:控制划分的间隔 ,可以指定以哪些节点作为断点划分区间,可以是给出直⽅图单元格之间的断点,或给出分组组数,⽐如breaks=12,指定分12组,⽐如breaks=seq(0,10,by=1)是指定间隔为0、1、2 (10)
马上⽤我们⼆⼿车数据的价格举例说明如何绘制直⽅图:
#par函数可以将⼏张图放在⼀张纸上,下⾯表⽰⼀⾏两列
par(mfrow=c(1,2))
hist(价格,
breaks = c(0,10,20,30,40,50,60,70,80,100,300),
xlim=c(0,100),
freq=TRUE,
main='价格直⽅图',
xlab ='汽车价格',
ylab ='频数',
皮卡汽车排名
col ='lightblue')
hist(log(价格),
main='对数价格直⽅图',
xlab ='对数价格',
ylab ='频数',
col ='lightblue')
直⽅图可以很好地看出汽车价格的整体分布是右偏的,⼤部分集中在低价分段,这类明显符合长尾分布的变量可以考虑取对数后观察是否符合正态分布,后续的建模也可以⽤对数价格去代替价格
2. 核密度图
核密度估计是⽤来估计变量的概率密度的⼀种办法,对应就是核密度图,听着很⾼⼤上,其实就是把直⽅图的组数增加到⽆穷⼤以后得到的图,可以相对准确地刻画分布,很多时候核密度图和直⽅图⽆需同时展⽰,根据实际情况挑选,两者表达的是⼀个意思。
density(x, bw ="nrd0", adjust =1,
kernel = c("gaussian","epanechnikov","rectangular",
"triangular","biweight",
"cosine","optcosine"),
weights = NULL, window = kernel, width,
give.Rkern = FALSE,
n =512,from, to, cut =3, na.rm = FALSE,...)
kernel:表⽰⽤于估计的核函数,⼀般选择⾼斯函数
#核密度图
#核密度图
par(mfrow=c(1,2))
hist(log(价格),
main='对数价格直⽅图',
xlab ='对数价格',
ylab ='频数',
col ='lightblue')
plot(density(log(价格)),
main='对数价格核密度图',
)
⽐较直⽅图和密度图可以看到整体趋势是⼀样的,密度图相当于对直⽅图做很细的划分得到的,整体上看对数价格的密度函数和正态分布还是很相似的
3. 饼图
饼图常⽤来⽐较定性变量中不同类型的占⽐,⾯积越⼤对应⽐例就越⾼,但是从某种意义上不推荐使⽤饼图,因为⼈们对于⾯积的感知是⽐较迟钝的,有时也可以考虑⽤环形图或者是条形图来代替饼图的功能。plotrix包中还有画3d饼图的函数,但是这种饼图就⽐较花⾥胡哨 ,没有必要去使⽤。⼀个简单的⼆维饼图为pie函数
pie(x, labels = names(x), edges =200, radius =0.8,
clockwise = FALSE, init.angle =if(clockwise)90else0,
佳乐density = NULL, angle =45, col = NULL, border = NULL,
lty = NULL, main = NULL,...)
⼀般我们直接调⽤函数就可以了,由于x表⽰每个扇形的⾯积,所以对于定性变量我们需要利⽤table函数先汇总再画图
par(mfrow=c(1,2))
pie(table(级别),main='车型占⽐饼图')
#利⽤RColorbrewer包改颜⾊
pie(table(级别),main='车型占⽐饼图',col=brewer.pal(5,'Pastel1'))
三、多变量绘图
悦动质量
刚才说的都是单个变量如何刻画其分布,但是我们经常需要关注双变量间关系(⼆元关系)和多变量间关系(多元关系),⽐如以下问题我们就需要⼀些新的图形来帮助我们
汽车价格与级别的关系是怎样的?
如何在⼀个图形中展⽰汽车价格、排量和性能三者之间的关系?
如何在单幅图中展⽰⼀堆变量的相关性?它⼜如何帮助你理解数据的结构呢?
1. 条形图
条形图⾮常适⽤于描述定性变量的分布情况,它常常与table函数⼀起⽤,由于⼈眼对柱⼦的⾼度⽐对⾯积敏感,所以对单个变量,条形图有时就可以代替饼状图,也可以对两个变量画分组的条形图,更好地观察变量之间的联系,具体函数参数如下
barplot(height, width =1, space = NULL,
names.arg = NULL, = NULL, beside = FALSE,
horiz = FALSE, density = NULL, angle =45,
col = NULL, border = par("fg"),
汽车多少公里换机油main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL, xpd = TRUE, log ="",
axes = TRUE, axisnames = TRUE,
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
inside = TRUE, plot = TRUE, axis.lty =0, offset =0,
add = FALSE, ann = !add && par("ann"), args.legend = NULL,...)
height:⼀个向量或值矩阵,如果height是向量,则绘图由⼀系列柱⼦组成,这些矩形柱的⾼度由向量中的值指定。 如果height是⼀个矩阵,则该图的每个条形图都对应于⼀列⾼度,该列中的值给出了构成该条形图的堆叠⼦条形图的⾼度。
width:柱⼦的宽度
space:柱⼦之间的宽度
beside:控制是堆砌条形图还是分组条形图
horiz:控制柱⼦⽅向是竖直还是⽔平,默认垂直
names.arg:每个柱⼦的名称。 如果省略此参数,则⾃动从height的names属性中获取名称
legend:图例
先画对于单个定性变量的条形图,需要利⽤table函数将其转换为整合的形式再画图,不能直接把数据输⼊进去
counts<-table(级别)
counts
>级别
⼩型紧凑型中型中⼤型⼤型
1606693191334
par(mfrow=c(1,2))
barplot(counts,
main ='竖直条形图',
#减⼩x轴标签的字体
cex.names=0.7,
legend=rownames(counts),
col=brewer.pal(8,'Blues')[c(2,4,5,7,8)]
)
barplot(counts,
main ='⽔平条形图',
cex.names=0.7,
#使⽤las旋转标签⽅向
las=2,
奇瑞销量
horiz=TRUE,
col=brewer.pal(8,'Blues')[c(2,4,5,7,8)]
)
⼀个简单的条形图,我们就可以从图上看出紧凑型⼆⼿车最多,其次是中⼩型的车,⼤型车的数量较少,说明紧凑型是市场竞争⽐较激烈的分段。
如果我们的数据是⼀个矩阵⽽不是⼀个向量,则barplot将画⼀幅堆砌条形图或分组条形图。如果 beside=FALSE (默认值),则矩阵中的每⼀列都将⽣成图中的⼀个条形,各列中的值对应堆砌的“⼦条”的⾼度。如果 beside=TRUE ,则矩阵中的每⼀列都表⽰⼀个分组,各列中的值将并列摆放,⽐如以下的例⼦