R语言实战(二)

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。在学习R数据科学之前,我们首先要对R语言的基础语法有一个良好的了解,方便我们理解以后的数据科学算法。本次语法精讲分三次讲完,每次负责讲解其中一部分!本次的R语言语法精讲(二)主要介绍了 R语言的数据的输入输出以及R语言内置的绘图语法。学完本文后,您将可以具备初步的R语言数据可视化的基本能力并结合R语言语法精讲(一)做简单的数据分析项目以及报告。

本文引用:

《R语言实战—第2版》————-Robert I.Kabacoff
《统计计算与模拟》课程课件———-深圳大学林炳清老师

本文内容:

  • R常用数据结构
  • R的运算以及常用函数
  • R语言编程结构
    判断if-else
    循环for、while、repeat
    自定义函数
  • R的输入与输出(本文)
  • R基础绘图(本文)
  • 基本数据管理
  • 高级数据管理

1.R的输入与输出

1.1 导入数据

(1) 从带分隔符的文本文件导入数据

使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。

其语法如下:

mydataframe <- read.table(file, options)

其中,file是一个带分隔符的ASCII文本文件,options是控制如何处理数据的选项。

表2-2列出了常见的选项:

img

1
2
3
# 文件第一行包含表头,指定了列名,可以通过如下步骤读取该文件(注意参数header的设置)
z = read.table("./z1.txt", header=T)
z

img

(2) read.csv()读取.csv文件

函数read.csv()可以读取excel文档中后缀为.csv的文件。在函数read.csv()中,参数header的默认值是TRUE。

1
2
x = read.csv("./edf.csv")
x

img

(3) 函数read.csv()网上文件

1
2
3
4
uci = "http://archive.ics.uci.edu/ml/machine-learning-databases/"
uci = paste(uci, "echocardiogram/echocardiogram.data", sep="")
ecc= read.csv(uci)
head(ecc)

img

(4) read.xlsx()读取.xlsx文件

读取后缀为.xlsx的文件的包有很多。在这里,我们介绍的是R包openxlsx。在这个包中,我们可以使用函数read.xlsx()读取xlsx文件 (首次使用,请先安装此包install.packages(“openxlsx”))

1
2
3
require(openxlsx)
x = read.xlsx("./abc.xlsx")
x

img

1.2 导出数据

(1) 函数cat()输出到屏幕

1
2
3
4
x = "I love R!"
y = "R is very powerful!"
cat(x, y)
cat(x, "\n", y)

img

(2) 函数cat()输出到文件

1
2
cat("abc\n", file="./u.txt")
cat("de\n", file="./u.txt", append=TRUE)

第一次调用函数cat()创建了文件u,包含一行内容abc;第二次调用追加了第二行,内容是de。

(3) 函数write.table()输出到文件

函数write.table()的用法与函数read.table()非常相似,只不过它是把数据框写入文件。例如:

1
2
3
4
5
6
7
kids = c("jack", "jill")
ages = c(12, 10)
d = data.frame(kids, ages, stringsAsFactors = F)
d
write.table(d, "./kds.txt")
# 如果不需要行名和列名,可以使用参数row.names,col.names
write.table(d, "./kds2.txt", row.names=F, col.names=F)

(4) 函数write.csv()输出到文件

1
write.csv(d, "./kds.csv")

(5) 函数write.xlsx()输出到文件

1
2
require(openxlsx)
write.xlsx(d, "./kds.xslx")

2.R基础绘图

2.1 R绘图的基础设置

(1) 一个简单的小例子引入

img

1
2
3
4
5
dose  <- c(20, 30, 40, 45, 60) 
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# 创建一幅描述药物A的剂量和响应关系的图形:
plot(dose, drugA, type="b")

img

plot()是R中为对象作图的一个泛型函数 (它的输出将根据所绘制对象类型的不同而变化)。 本例中,plot(x, y, type=”b”)将x置于横轴,将y置于纵轴,绘制点集(x,y),然后使用线段将其连接。选项type=”b”表示同时绘制点和线。使用help(plot)可以查看其他选项。

(2) 图形参数:

我们可以通过修改称为图形参数的选项来自定义一幅图形的多个特征 (字体、颜色、坐标轴、标签等)。

(2.1) 符号和线条

img

1
2
# 绘制一幅图形,其线条类型为点线,宽度为默认宽度的3倍,点的符号为实心正方形,大小为默认符号大小的2倍
plot(dose, drugA, type="b", lty=3, lwd=3, pch=15, cex=2)

img

(2.2) 颜色:

R中有若干和颜色相关的参数。表3-3列出了一些常用参数:

img

在R中,可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。举例来说,col=1、col=”white”、col=”#FFFFFF”、col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色的等价方式。函数rgb()可基于红-绿-蓝三色值生成颜色,而hsv()则基于色相-饱和度-亮度值来生成颜色。

对于创建吸引人的颜色配对,RColorBrewer特别受到欢迎。注意在第一次使用它之前先进行下载(install.packages(“RColorBrewer”))。安装之后, 使用函数brewer.pal(n, name)来创建一个颜色值的向量。比如说,以下代码:

1
2
3
4
5
# 从Set1调色板中抽取了7种用十六进制表示的颜色并返回一个向量。
library(RColorBrewer)
n <- 7
mycolors <- brewer.pal(n, "Set1")
barplot(rep(1,n), col=mycolors)

img

若要得到所有可选调色板的列表,输入 brewer.pal.info;或者输入display.brewer.all()从而在一个显示输出中产生每个调色板的图形。

(2.3) 文本属性:

图形参数同样可以用来指定字号、字体和字样。表3-4阐释了用于控制文本大小的参数。字体族和字样可以通过字体选项进行控制(见表3-5)

img

img

1
2
3
4
5
6
7
8
# 创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签(名称) ,以及粗斜体、2倍于默认文本大小的标题。
par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)
# 在Windows系统中,等宽字体映射为TT Courier New,衬线字体映射为TT Times New Roman,无衬线字体则映射为TT Arial(TT代表True Type)
windowsFonts(
A=windowsFont("Arial Black"),
B=windowsFont("Bookman Old Style"),
C=windowsFont("Comic Sans MS")
)

(2.4) 图形尺寸与边界尺寸:

img

1
2
# 生成一幅4英寸宽、3英寸高、上下边界为1英寸、左边界为0.5英寸、右边界为0.2英寸的图形
par(pin=c(4,3), mai=c(1,.5, 1, .2))

(2.5) 使用图形参数控制图形外观例子:

1
2
3
4
5
6
7
8
9
10
dose  <- c(20, 30, 40, 45, 60) 
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)

opar <- par(no.readonly=TRUE)
par(mfrow=c(1,2),pin=c(2, 3),opar)
par(lwd=2, cex=1.5)
par(cex.axis=.75, font.axis=3)
plot(dose, drugA, type="b", pch=19, lty=2, col="red")
plot(dose, drugB, type="b", pch=23, lty=6, col="blue", bg="green")

img

(3) 添加文本、自定义坐标轴和图例

除了图形参数,许多高级绘图函数(例如plot、hist、boxplot)也允许自行设定坐标轴和文本标注选项。举例来说,以下代码在图形上添加了标题(main) 、副标题(sub) 、坐标轴标签(xlab、ylab)并指定了坐标轴范围(xlim、ylim)。

1
2
3
4
5
6
plot(dose, drugA, type="b",  
col="red", lty=2, pch=2, lwd=2,
main="Clinical Trials for Drug A",
sub="This is hypothetical data",
xlab="Dosage", ylab="Drug Response",
xlim=c(0, 60), ylim=c(0, 70))

img

(3.1) 标题:

使用title()函数为图形添加标题和坐标轴标签。调用格式为:

title(main=”main title”, sub=”subtitle”,

xlab=”x-axis label”, ylab=”y-axis label”)

函数title()中亦可指定其他图形参数(如文本大小、字体、旋转角度和颜色) 。

函数title()一般来说被用于添加信息到一个默认标题和坐标轴标签被ann=FALSE选项移除的图形中。

1
2
3
4
5
6
7
8
9
par(ann=FALSE)   # 不生成默认坐标轴标签
plot(dose, drugA, type="b",
col="red", lty=2, pch=2, lwd=2,
xlim=c(0, 60), ylim=c(0, 70))
# 生成红色的标题和蓝色的副标题,以及比默认大小小25%的绿色x轴、y轴标签
title(main="My Title", col.main="red",
sub="My Subtitle", col.sub="blue",
xlab="My X label", ylab="My Y label",
col.lab="green", cex.lab=0.75)

img

(3.2) 坐标轴:

可以使用函数axis()来创建自定义的坐标轴,而非使用R中的默认坐标轴。其格式为:

axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, …)

img

img

创建自定义坐标轴时,你应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE) 。参数xaxt=”n”和yaxt=”n”将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度) 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
x <- c(1:10) 
y <- x
z <- 10/x
opar <- par(no.readonly=TRUE)
par(opar)
par(mar=c(5, 4, 4, 8) + 0.1)
plot(x, y, type="b",
pch=21, col="red",
yaxt="n", lty=3, ann=FALSE)
lines(x, z, type="b", pch=22, col="blue", lty=2)

axis(2, at=x, labels=x, col.axis="red", las=2)

axis(4, at=z, labels=round(z, digits=2),
col.axis="blue", las=2, cex.axis=0.7, tck=-.01)

mtext("y=1/x", side=4, line=3, cex.lab=1, las=2, col="blue")

title("An Example of Creative Axes",
xlab="X values",
ylab="Y=X")

img

(3.3) 参考线:

函数abline()可以用来为图形添加参考线。其使用格式为:

abline(h=yvalues, v=xvalues)

函数abline()中也可以指定其他图形参数(如线条类型、颜色和宽度)

1
2
3
4
5
plot(x, y, type="b",  
pch=21, col="red",
yaxt="n", lty=3, ann=FALSE)
# 为1、3、5、7、9的位置添加了垂直的蓝色虚线
abline(v=seq(1, 10, 2), lty=2, col="blue")

img

(3.4) 图例:

当图形中包含的数据不止一组时,图例可以帮助你辨别出每个条形、扇形区域或折线各代表哪一类数据。我们可以使用函数legend()来添加图例(果然不出所料) 。其使用格式为:

legend(location, title, legend, …)

img

其他常用的图例选项包括用于指定盒子样式的bty、指定背景色的bg、指定大小的cex,以及指定文本颜色的text.col。指定horiz=TRUE将会水平放置图例,而不是垂直放置。关于图例的更多细节,请参考help(legend)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dose  <- c(20, 30, 40, 45, 60)  
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)

opar <- par(no.readonly=TRUE)
par(opar)
par(lwd=2, cex=1.5, font.lab=2)
plot(dose, drugA, type="b",
pch=15, lty=1, col="red", ylim=c(0, 60),
main="Drug A vs. Drug B",
xlab="Drug Dosage", ylab="Drug Response")

lines(dose, drugB, type="b",
pch=17, lty=2, col="blue")

abline(h=c(30), lwd=1.5, lty=2, col="gray")


legend("topleft", inset=.05, title="Drug Type", c("A","B") ,lty=c(1, 2), pch=c(15, 17), col=c("red", "blue"))

img

(3.5) 文本标注:

可以通过函数text()和mtext()将文本添加到图形上。text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。使用格式分别为:

text(location, “text to place”, pos, …)

mtext(“text to place”, side, line=n, …)

img

其他常用的选项有cex、col和font(分别用来调整字号、颜色和字体样式) 。

除了用来添加文本标注以外,text()函数也通常用来标示图形中的点。我们只需指定一系列的x、y坐标作为位置参数,同时以向量的形式指定要放置的文本。x、y和文本标签向量的长度应当相同。

1
2
3
4
5
6
7
8
9
attach(mtcars) 
plot(wt, mpg,
main="Mileage vs. Car Weight",
xlab="Weight", ylab="Mileage",
pch=18, col="blue")
text(wt, mpg,
row.names(mtcars),
cex=0.6, pos=4, col="red")
detach(mtcars)

img

(3.6) 数学标注:

函数plotmath()可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。

img

1
2
3
4
x = seq(-2, 2, 0.5)
plot(x, x^2, type="l", main=expression(paste("f(x)=",x^2)), ylab=expression(x^2), cex.axis=1.2, cex.lab=1.2, cex.main=1.2, lwd=2, xlim=c(-3, 3), ylim=c(-1, 5))
points(x, x^2+0.5, type="b", lwd=3, lty=2)
points(x, x^2-0.5, pch=10, lwd=1)

img

(4) 图形组合:

在R中使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形。

可以在par()函数中使用图形参数mfrow=c(nrows,ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。另外,可以使用mfcol=c(nrows, ncols)按列填充矩阵。

(4.1) 示例1:创建了四幅图形并将其排布在两行两列中

1
2
3
4
5
6
7
8
9
attach(mtcars) 
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")
par(opar)
detach(mtcars)

img

(4.2) 示例2:依三行一列排布三幅图形

1
2
3
4
5
6
7
8
attach(mtcars) 
opar <- par(no.readonly=TRUE)
par(mfrow=c(3,1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)

img

(4.3) 示例3:函数layout()的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。在以下代码中,一幅图被置于第1行,另两幅图则被置于第2行

1
2
3
4
5
6
attach(mtcars) 
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)

img

(4.4) 示例4:为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数。其形式为:

widths = 各列宽度值组成的一个向量

heights = 各行高度值组成的一个向量

相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm()来指定。

在以下代码中,我们再次将一幅图形置于第1行,两幅图形置于第2行。但第1行中图形的高度是第2行中图形高度的二分之一。除此之外,右下角图形的宽度是左下角图形宽度的三分之一 :

1
2
3
4
5
6
7
attach(mtcars) 
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths=c(3, 1), heights=c(1, 2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)

img

(5) 图形布局的精细控制

可能有很多时候,你想通过排布或叠加若干图形来创建单幅的、有意义的图形,这需要有对图形布局的精细控制能力。你可以使用图形参数fig=完成这个任务。 参数fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。

img

第一个fig=将散点图设定为占据横向范围0~0.8,纵向范围0~0.8。上方的箱线图横向占据0~0.8,纵向0.55~1。右侧的箱线图横向占据0.65~1,纵向0~0.8。fig=默认会新建一幅图形,所以在添加一幅图到一幅现有图形上时,请设定参数new=TRUE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在散点图上添加两幅箱线图,创建了单幅的增强型图形
opar <- par(no.readonly=TRUE)
par(fig=c(0, 0.8, 0, 0.8))
plot(mtcars$wt, mtcars$mpg,
xlab="Miles Per Gallon",
ylab="Car Weight")
par(fig=c(0, 0.8, 0.55, 1), new=TRUE)
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE)

par(fig=c(0.65, 1, 0, 0.8), new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)

par(opar)

img

2.2 R绘图的基本图形

(1) 条形图

条形图通过垂直的或水平的条形展示了类别型变量的分布(频数) 。函数barplot()的最简单用法是:

barplot(height) ,其中的height是一个向量或一个矩阵。

(1.1) 简单的条形图

1
2
3
4
5
6
7
8
9
10
11
12
13
library(vcd) 
# 变量Improved记录了对每位接受了安慰剂或药物治疗的病人的治疗结果
counts <- table(Arthritis$Improved)
counts
# 简单条形图
barplot(counts,
main="Simple Bar Plot",
xlab="Improvement", ylab="Frequency")
# 水平条形图
barplot(counts,
main="Horizontal Bar Plot",
xlab="Frequency", ylab="Improvement",
horiz=TRUE)

img

img

(1.2) 堆砌条形图和分组条形图

如果height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。

若beside=FALSE(默认值) ,则矩阵中的每一列都将生成图中的一个条形,各列中的值将给出堆砌的“子条”的高度。

若beside=TRUE,则矩阵中的每一列都表示一个分组,各列中的值将并列而不是堆砌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

img

img

(1.3) 均值条形图

条形图并不一定要基于计数数据或频率数据。你可以使用数据整合函数并将结果传递给barplot()函数,来创建表示均值、中位数、标准差等的条形图。

1
2
3
4
5
6
7
8
states <- data.frame(state.region, state.x77) 
means <- aggregate(states$Illiteracy, by=list(state.region), FUN=mean)
means
# 将均值从小到大排序
means <- means[order(means$x),]
means
barplot(means$x, names.arg=means$Group.1)
title("Mean Illiteracy Rate")

img

img

(1.4) 荆棘图

棘状图对堆砌条形图进行了重缩放,这样每个条形的高度均为1,每一段的高度即表示比例。棘状图可由vcd包中的函数spine()绘制。

1
2
3
4
5
library(vcd) 
attach(Arthritis)
counts <- table(Treatment, Improved)
spine(counts, main="Spinogram Example")
detach(Arthritis)

img

(2) 饼图

饼图可由以下函数创建:

pie(x, labels)

其中x是一个非负数值向量, 表示每个扇形的面积, 而labels则是表示各扇形标签的字符型向量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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="")
pie(slices, labels=lbls2, col=rainbow(length(lbls2)),
main="Pie Chart with Percentages")
library(plotrix)
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)")

img

扇形图提供了一种同时展示相对数量和相互差异的方法。在R中,扇形图是通过plotrix包中的fan.plot()函数实现的。

1
2
3
4
library(plotrix) 
slices <- c(10, 12,4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germany", "France")
fan.plot(slices, labels = lbls, main="Fan Plot")

img

(3) 直方图

直方图通过在x轴上将值域分割为一定数量的组,在y轴上显示相应值的频数,展示了连续型变量的分布。可以使用如下函数创建直方图:

hist(x)

其中的x是一个由数据值组成的数值向量。参数freq=FALSE表示根据概率密度而不是频数绘制图形。参数breaks用于控制组的数量。在定义直方图中的单元时,默认将生成等距切分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 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()

img

(4) 核密度图

核密度估计是用于估计随机变量概率密度函数的一种非参数方法。从总体上讲,核密度图不失为一种用来观察连续型变量分布的有效方法。绘制密度图的方法(不叠加到另一幅图上方)为:

plot(density(x)) 其中的x是一个数值型向量。

由于plot()函数会创建一幅新的图形,所以要向一幅已经存在的图形上叠加一条密度曲线,可以使用lines()函数。

1
2
3
4
5
6
7
8
9
10
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()函数根据顶点的x和y坐标(本例中由density()函数提供)绘制了多边形。
polygon(d, col="red", border="blue")
# 添加棕色的轴须图
rug(mtcars$mpg, col="brown")

img

使用sm包中的sm.density.compare()函数可向图形叠加两组或更多的核密度图。使用格式为:

sm.density.compare(x, factor) 其中的x是一个数值型向量,factor是一个分组变量。请在第一次使用sm包之前安装它。

1
2
3
4
5
6
7
8
9
10
11
library(sm)  
attach(mtcars)

cyl.f <- factor(cyl, levels= c(4,6,8),
labels = c("4 cylinder", "6 cylinder",
"8 cylinder"))

sm.density.compare(mpg, cyl, xlab="Miles Per Gallon")
title(main="MPG Distribution by Car Cylinders")

detach(mtcars)

img

(5) 箱线图

箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。

1
boxplot(mtcars$mpg, main="Box plot", ylab="Miles per Gallon")

img

我们使用并列箱线图重新研究了四缸、六缸、八缸发动机对每加仑汽油行驶的英里数的影响。

1
2
3
4
boxplot(mpg ~ cyl, data=mtcars, 
main="Car Mileage Data",
xlab="Number of Cylinders",
ylab="Miles Per Gallon")

img

最后,你可以为多个分组因子绘制箱线图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建汽缸数量的因子 
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", ylab="Miles Per Gallon")

img

(6) 小提琴图

小提琴图是箱线图与核密度图的结合。 你可以使用vioplot包中的vioplot()函数绘制它。 请在第一次使用之前安装vioplot包。

vioplot()函数的使用格式为:

vioplot(x1, x2, … , names=, col=)

其中x1, x2, …表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。

1
2
3
4
5
6
7
8
9
10
11
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", ylab="Miles Per Gallon",
xlab="Number of Cylinders")

img

(7) 点图

点图提供了一种在简单水平刻度上绘制大量有标签值的方法。你可以使用dotchart()函数创建点图,格式为:

dotchart(x, labels=)

其中的x是一个数值向量,而labels则是由每个点的标签组成的向量。你可以通过添加参数groups来选定一个因子,用以指定x中元素的分组方式。如果这样做,则参数gcolor可以控制不同组标签的颜色,cex可以控制标签的大小。

1
2
3
dotchart(mtcars$mpg, labels=row.names(mtcars), cex=.7, 
main="Gas Mileage for Car Models",
xlab="Miles Per Gallon")

img

分组、排序、着色后的点图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 Mileage for Car Models\ngrouped by cylinder",
xlab = "Miles Per Gallon")

img

结语

本次的R语言语法精讲(二)主要介绍了 R语言的数据的输入输出以及R语言内置的绘图语法。学完本文后,您将可以具备初步的R语言数据可视化的基本能力并结合R语言语法精讲(一)做简单的数据分析项目以及报告。

本文转载自知乎:https://zhuanlan.zhihu.com/p/180425068

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020 chenk
  • 由 帅气的CK本尊 强力驱动
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信