关于r:R语言之基础绘图

30次阅读

共计 6387 个字符,预计需要花费 16 分钟才能阅读完成。

文章和代码曾经归档至【Github 仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 R 语言 也可获取。

R 的根底绘图零碎由 Ross Ihaka 编写,性能十分弱小,次要由 graphics 包和 grDevices 包组成,它们在启动 R 时会主动加载。根底绘图零碎中有两类函数,一类是高水平作图函数,另一类是低水平作图函数。

所谓高水平作图函数是用于间接产生图形的函数,包含 plot()、hist()、boxplot()和 pairs()等。低水平作图函数是用于在高水平作图函数所绘图形的根底上增加新的图形或元素的函数,包含 points()、lines()、text()、title()、legend()和 axis()等。

1. 函数 plot()

函数 plot() 是一个泛型函数,对于不同类型的数据,它能够绘制出不同的图形。例如,对于数值型数据,它能够绘制出散点图;对于分类数据,它能够绘制出箱线图;对于一些统计模型,它能够绘制出相应的图形,比方对于生存剖析,它能够绘制出生存曲线。因而,函数 plot() 的应用频率十分高,倡议能够关上它的帮忙文档查看其各种罕用参数的用法。

上面创立一个示例数据,示意某病病人对 2 种药物(drugA 和 drugB)、5 个剂量(dose)程度上的响应状况。

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)
plot(dose, drugA, type = "b")

下面的命令创立了两幅图,函数 plot() 里的参数 type 默认为“p”(代表点),所以失去的第一张图是散点图。在第二行命令里,参数 type 改为了“b”(代表点和线),所以失去的第二张图是点线图。

函数 plot() 用于新建一幅图形,咱们还能够用低水平作图函数,例如 lines()、legend()等,在一幅现有图形上增加新的图形元素。例如:

# 为了比拟两种药物不同剂量下的响应状况,咱们在一幅图上展现两个点线图,并用不同类型的线(lty)和不同特色的点(pch)加以辨别。plot(dose, drugA, type = "b", lty = 1, pch = 15)
lines(dose, drugB, type = "b", lty = 2, pch = 17)
# 为了加强可读性,还增加了图例(legend)。# 须要留神的是,函数 legend()外面点和线的属性必须与后面函数 plot()和 lines( )中设置的属性统一。legend("topleft", title = "Drug Type",
       legend = c("A", "B"), 
       lty = c(1, 2), 
       pch = c(15, 17))

2. 直方图和密度曲线图

直方图(histogram)是用于展现连续型变量散布的最罕用的工具,它实质上是对密度函数的一种预计。直方图和密度曲线图个别用于摸索散布,很少用于报告后果。函数 hist()可用于绘制直方图

数据集 anorexia 位于 MASS 包中,来自一项对于年老女性厌食症患者体重变动的钻研。该数据集蕴含 72 例察看对象、3 个变量,其中变量 Treat(医治形式)是一个蕴含 3 个程度的因子,变量 Prewt 和 Postwt 均为数值型,别离示意医治前后的体重(单位:lb)。上面绘制变量 Prewt 的直方图,代码如下:

library(MASS)
data(anorexia)
str(anorexia)

attach(anorexia)
hist(Prewt)

上图给出了变量 Prewt 的频数散布,因为函数 hist()中没有设置任何参数,图中应用了默认的组距、坐标轴标签和题目等。须要留神的是,直方图的形态受到组距的影响,有时咱们须要尝试设定参数 breaks 的不同的值以失去适合的图形。函数 hist()的输入后果中蕴含一些计算返回值,这些值可用于进一步地作图或者剖析,例如为区间划分端点、频数(或密度)、区间中点等。

密度曲线为数据的散布提供了一种更为平滑的形容,绘制密度曲线的办法为:

plot(density(Prewt))

从上图能够看出,变量 Prewt 的散布是单峰的,根本是对称的。咱们还能够在一幅直方图上增加一条密度曲线和轴须图。此时,须要在函数 hist()外面设定参数 freq 为 FALSE,即把纵坐标换成频率,否则将会简直看不到密度曲线。参数 las(或者 labels)设为 1 是为了将纵轴的刻度标签横向显示。

library("showtext") # R 数据分析镜像的中文反对不太好,须要借助 showtext 包
showtext_auto() # 主动反对中文
# 应用红色填充了条形,增加了信息量更大的坐标轴标签和题目,还通过设置参数 las 为 1 把纵轴的刻度标签换成了横向显示。hist(Prewt, freq = FALSE, col = "red",
     xlab = "体重(lbs)", 
     main = "医治前体重散布直方图",
     las = 1)
# 而后应用函数 lines( )在直方图上叠加了一条蓝色的、两倍于默认线条宽度的密度曲线。lines(density(Prewt), col = "blue", lwd = 2)
# 最初应用函数 rug( )在横轴上增加了轴须图,以展现数据分布的密集趋势。rug(Prewt)
detach(anorexia)

3. 条形图

条形图(bar chart)在医学科技论文中常常用到,它通过垂直的或程度的矩形展现分类变量的频数散布。函数 barplot() 可用于绘制条形图

上面以 vcd 包里的 Arthritis 数据集为例介绍函数 barplot()的用法。该数据集来自一项对于医治类风湿性关节炎新办法的成组对照双盲临床试验钻研。其中的反应变量 Improved 记录了每位承受药物医治(Treated,41 例)或安慰剂(Placebo,43 例)的患者的医治成果,分为 3 个级别(None、Some、Marked)。

library(vcd)
data(Arthritis)
attach(Arthritis)
counts <- table(Improved)
counts
# Improved
#   None   Some Marked 
#     42     14     28

函数 table()用于生成分类变量的频数统计表。从下面的输入能够看到,有 28 位患者有了明显改善、14 人有局部改善,而有 42 人没有改善。条形图能够用于展现这个频数散布,如下图所示:

barplot(counts, xlab = "Improvement", ylab = "Freqency", las = 1)

函数 barplot()还能够用于展现二维列联表的数据。下图绘制了一幅分组条形图,并增加了色彩和图例,代码如下:

counts <- table(Improved, Treatment)
barplot(counts, 
        col = c("red", "yellow", "green"),
        xlab = "Improvement", 
        ylab = "Freqency", 
        beside = TRUE, las = 1)
legend("top", legend = rownames(counts), 
       fill = c("red", "yellow", "green"))

条形图有时候也能够用于展现不同分类下的均值、中位数、标准差、置信区间等。用根本包里的函数能够实现这个性能,然而须要很多个步骤。而 epiDisplay 包里的函数 aggregate.plot()能够简化这个过程。

上面的代码以数据集 anorexia 为例绘制了不同医治形式下医治后体重的均值条形图,后果如下图所示。

library(epiDisplay)
aggregate.plot(anorexia$Postwt, by = list(anorexia$Treat), 
               error = "sd", legend = FALSE, 
               bar.col = c("red", "yellow", "green"),
               ylim = c(0,100), las = 1,
               main = "")

下面的误差棒示意的是标准差,咱们能够通过扭转函数 aggregate.plot()外面的参数 error 设置显示规范误或置信区间。

4. 饼图

饼图(pie chart)可用于展现分类数据的占比状况。例如,上面的代码绘制的饼图展现了某医院一周内急诊入院的疾病类型散布。

percent <- c(5.8, 27.0, 0.5, 20.8, 12.8, 33.1)
disease <- c("上感", "中风", "内伤", "昏厥", "食物中毒", "其余")
lbs <- paste0(disease, percent, "%")
pie(percent, labels = lbs, col = rainbow(6))

少数统计学家不倡议应用饼图,他们更举荐用条形图或点图代替饼图,因为人们对长度的判断比对面积的判断更准确。因而,根本包的函数 pie()绘制饼图的选项无限。

不过,一些捐献包扩大了 R 绘制饼图的性能,例如 plotrix 包。该包提供的函数 pie3D()能够绘制三维饼图,另一个函数 fan.plot()能够绘制性能与饼图类似的扇形图,感兴趣的读者能够装置该包并查看其帮忙文档。

5. 箱线图和小提琴图

箱线图(box plot)又称箱须图(box-whisker plot),罕用于展现数据的大抵散布特色,也用于摸索异样值和离群点。函数 boxplot()可用于绘制箱线图。

上面用箱线图展现数据集 anorexia 里体重前后变动的散布。

anorexia$wt.change <- anorexia$Postwt - anorexia$Prewt
boxplot(anorexia$wt.change, ylab = "Weight change (lbs)", las = 1)

为了让读者更好地了解箱线图各局部的含意,在下图中增加了手工标注。如果数据是对称散布,中位数(Median)应该位于上四分位数(Upper quartile)和下四分位数(Lower quartile)的两头,即箱线图的方盒对于中位线对称。在上边缘(Upper hinge)和下边缘(Lower hinge)以外的值通常被认为是异样值。

fivenum(anorexia$wt.change)

anorexia$wt.change <- anorexia$Postwt - anorexia$Prewt
b <- boxplot(anorexia$wt.change, ylab = "Weight change (lbs)", las = 1)
# text(x= 1, y=1:5, labels= c("some","more","red text"))
text(1.2, 21.5, "Upper hinge")
text(1.13, 15.5, "←—— Whisker")
text(1.31, 9.2, "Upper quantile")
text(1.26, 1.65, "Median")
text(1.31, -2.45, "Upper quantile")
text(1.13, -7, "←—— Whisker")
text(1.2, -12.2, "Upper hinge")

平行排列的箱线图能够用于比拟在某个分类变量各个类别下某指标的散布。例如,要比拟不同医治形式下体重变动的状况,能够应用上面的命令:

boxplot(wt.change ~ Treat, data = anorexia,
        ylab = "Weight change (lbs)", las = 1)

函数 boxplot()的第一个参数输出的是一个公式。R 里公式个别用符号 ~ 连贯变量,~ 右边能够看作因变量,~ 左边能够看作自变量。从下图(a)能够看出,“FT”(family treatment)组体重的扭转量高于其余两组。然而,差别的显著性须要进一步的显著性测验能力确定。

小提琴图(violin plot)能够看作是箱线图和密度图的联合。vioplot 包里的函数 vioplot()可用于绘制小提琴图,应用前请先装置并加载该包。例如,上图能够换成小提琴图展现

options(warn=-1) # 清新显示
library(vioplot)
vioplot(wt.change ~ Treat, data = anorexia, 
        ylab = "Weight change (lbs)",
        col = "gold", las = 1)

6. 克利夫兰点图

克利夫兰点图(Cleveland dot plot)实质上也是散点图,它通过点的地位展现数据的大小,是一种在简略程度刻度上绘制大量有标签的值的办法,其性能与条形图相似,但强调数据的排序以及相互之间的差距。

函数 dotchart()可用于绘制克利夫兰点图。datasets 包里的数据集 VADeaths 是 1940 年美国弗吉尼亚州城市和农村不同年龄段人群的死亡率(以 ‰ 示意)状况。

VADeaths
dotchart(VADeaths)
dotchart(t(VADeaths),pch = 19)

从上图能够看出,死亡率随着年龄的升高而升高;在同一年龄段,农村地区的死亡率均高于城市地区;在同一年龄段同一地区,男性的死亡率均高于女性。

7. 导出图形

如果想要把图形保留下来,能够通过图形用户界面和代码两种形式。在 RStudio 右下方的“Plots”下,单击“Export”,抉择“Save as Image”或“Save as PDF”,能够把图形保留在指定的文件夹下。咱们还能够抉择“Copy to Clipboard”把图形间接复制到 Word 或 PowerPoint 文档。须要留神的是,这种形式保留的图形与 RStudio 图形窗口的尺寸无关,即不同大小的窗口得出的图形会有差别(在 ModelWhale 中,能够右键单击图片,间接另存为)。

如果想把图形保留下来用于报告或论文中,笔者倡议应用代码的形式,将绘图语句搁置在开启指标图形设施的语句和敞开指标图形设施的语句之间即可。例如,上面的代码会把图形保留到当前工作目录中并命名“mygraph.pdf”:

pdf("mygraph.pdf")
boxplot(wt.change ~ Treat, 
        data = anorexia, 
        ylab = "Weight change (lbs)",
        las = 1)
dev.off() # work 下能够看到该 pdf

除了函数 pdf(),咱们还能够应用函数 png()、jpeg()、tiff()和 postscript()等将图形保留为其余格局。

bmp、png 和 jpeg 格局的图形文件都是非矢量格局,容易受到分辨率的影响,但它们占用的空间很小,适宜使用于 Word 和 PowerPoint 文档中;ps 格局的图形文件是矢量格式文件,它与分辨率无关,适宜使用于排版印刷;而 tiff(或 tif)格局的图形文件能够反对很多色调零碎,而且独立于操作系统,在各类出版物中使用得最为宽泛。例如:

tiff(filename = "mygraph.tiff",
     width = 15, height = 12, units = "cm", res = 300)
boxplot(wt.change ~ Treat, data = anorexia, ylab = "Weight change (lbs)")
dev.off() # work 下能够看到该 tiff

上述命令生成了一个名为“mygraph.tiff”的图形文件,参数 width 和 height 别离用于设置图形的宽度和高度,参数 units 用于设置宽度和高度的单位,参数 res 用于设置分辨率,这里设为了 大多数出版物要求的最低值 300

小结

其余一些专门的图形,例如散点图矩阵、相干图、正态 QQ 图、生存曲线、聚类图、碎石图、ROC 曲线和 Meta 剖析森林图等。在 R 的利用中,可视化是一个十分沉闷的畛域,新的包层出不穷。网站 The R Graph Gallery 收集了各种新鲜的图形以及相应的示例代码,值得对可视化感兴趣的读者关注。

正文完
 0