1. 数据分析网首页
  2. 软件工具
  3. R语言

用R语言进行数据分析:统计图形

图形工具是 R 环境里面一个非常重要和多用途的组成部分。 我们可以用这些图形工具显示 各种各样的统计图并且创建一些 全新的图。

图形工具既可交互式使用,也可以批处理使用。在许多情况下, 交互式使用是最有效的。 打开 R 时,它会启动一个图形设备驱动 (device driver)。该驱动会打开特定的图形窗口(graphics window)以显示 交互式的图片。尽管这些都是自动实现的,了解 用于 UNIX 系统的 X11() 命令和 Windows 系统的 windows() 命令是非常有用的。

一旦设备驱动启动,R 绘图命令可以用来 产生统计图或者设计全新的 图形显示。

绘图命令可以分成了三个基本的类:

  • 高级绘图命令在图形设备上产生一个新的图区, 它可能包括坐标轴,标签,标题等等。
  • 低级画图命令会在一个已经存在的图上加上更多 的图形元素,如额外的点,线和标签。
  • 交互式图形命令允许你交互式地 用定点设备(如鼠标) 在一个已经存在的图上添加图形信息或者提取图形信息。

此外,R 有一系列图形参数。这些图形参数 可以修改从而定制你的图形环境。

这些信息仅仅描述了`基本’图形绘制命令。在包 grid 里面有一个 独立的图形子系统与基本图形包同时存在。它的功能非常的强大当然也 非常地难用。有一个基于 grid 的推荐包 lattice 提供了产生多重面板图(multi-panel plot)的工具。这有点 类似 S 里面Trellis 系统。

高级绘图命令

高级图形显示函数是用来产生输入数据的完整图片。 其中适当的 坐标轴,标签和标题会自动产生(除非你有其他要求)。 高级图形显示命令会开始一个新的图区, 必要时会清空当前的图区。

plot() 函数

在 R 里面最常用的一个图形函数是 plot()。这是一个泛型函数:产生的图形 依赖于第一个参数的类型或者

plot(x, y)
plot(xy)
如果 xy 是向量,plot(x, y) 将产生 yx 的散点图。 单参数(第二种形式)可以实现同样的结果。对于单参数要么是一个包含 两个分量xy 的列表要么是一个双列的矩阵。
plot(x)
如果 x 是一个时间序列,这将产生一个时间序列图。如果 x 是一个数值向量,它将产生一个向量值对该向量索引 的图。如果 x 是一个复向量, 它将会产生一个向量元素的虚部对实部的 图。
plot(f)
plot(f, y)
f 实一个因子对象,y 是一个数值向量。第一种形式产生 f 的直方图;第二种形式产生 yf 的各种水平下的盒状图。
plot(df)
plot(~ expr)
plot(y ~ expr)
df 是一个数据框,y 是任何对象,expr 是一个对象名 被 `+‘ 分割的表列(如,a + b + c)。前两种将产生 数据框中变量的分布图(第一种形式)和 一系列对象的分布图(第二种形式)。第三种形式 将得到 y 相对 expr 中各个对象画的图。

显示多元数据

R 为描绘多元数据提供了两个非常有用的函数。 如果 X 是一个数值矩阵或者数据框,命令

     > pairs(X)

将产生 X 的列之间两两相对的成对散点图阵列(pairwise scatterplot matrix)。 也就是说,X的每一列相对 X 的所有其他列而产生 n(n-1) 个 图,并且把这些图以阵列个形式显示在图区。这个 图形阵列的行列图形尺度一致。

coplot 处理三个或者四个变量的产生的图可能会更清晰。 如果 ab 是数值向量,c 是数值向量或者因子对象(长度都一致),那么 下面的命令

     > coplot(a ~ b | c)

将产生一系列在给定的 c 值下ab 的散点图。 c 是因子对象,这就简单的表示 ac 各个水平下对 b 画的散点图。当 c 是数值向量,它将会被分割成一系列条件区间 (conditioning intervals),对于任一区间,区间内 c 对应的ab 值将绘制 ab的散点图。 区间的数值和位置由 coplot() 的参数 given.values= 控制——函数 co.intervals() 用于选择区间。 你还可以使用两个给定的变量,如下面的 命令

     > coplot(a ~ b | c + d)

它将会产生在任何在 cd 联合区间内的 ab 的散点图。

函数 coplot()pairs() 都有一个参数 panel=。这个参数可以用来设置各个面板中的图形样式。 默认值 points() 用来产生散点图,但是通过将低级命令 用于两个向量 xy 并赋值给参数panel=,你可以产生 任何你所期望的图。 一个用于coplot的 panel 函数的例子 是命令 panel.smooth()

图形显示

其他高级绘图函数可以产生多种类型的图。 一些例子:

qqnorm(x)
qqline(x)
qqplot(x, y)
分位比较图。第一种形式显示数值向量 x 相对期望的正态有序分值(Normal order scores)的比较图(正态分值图); 第二种形式是在这个图上加一条理论上的分位对分位的直线。 第三种形式产生 x 的分位对 y 的分位的图以 比较二者的分布是否一致。
hist(x)
hist(x, nclass=n)
hist(x, breaks=b, ...)
产生数值向量 x 的柱状分布图。程序会自动选择适合的 分类数目,但是可以通过设定参数 nclass= 来改变分类数。还有一种方法是,通过 参数 breaks= 精确设置断点(breakpoint)。如果给定参数 probability=TRUE,柱高度表示 频率而不是频数。
dotchart(x, ...)
产生数据 x 的点图。在一个点图里面, y-轴给定 x 里面数据的标签, x-轴给出它们的值。这种图非常容易从视觉上 看出在某个特定范围内的数据元素。
image(x, y, z, ...)
contour(x, y, z, ...)
persp(x, y, z, ...)
画三变量图。image 产生一个长方形的网格,用 不同的颜色表示 z 的值,contour 以等高线(contour line)来表示 z 的值, persp 产生 3D 表面。

高级图形命令的参数

传递给高级绘图函数的命令有许多, 如:

add=TRUE
强制函数以低级绘图函数的形式运行, 在当前的图上加载新的图形元素(仅适合于部分函数)。
axes=FALSE
禁止产生坐标轴—对你要想用函数 axis() 绘制个性化坐标轴非常有用。默认值是 axes=TRUE,表示 允许坐标轴。
log="x"
log="y"
log="xy"
让 x 轴,y 轴或者两者都成为对数坐标轴。这对 很多图都有效,但不是全部。
type=
参数 type= 控制输出图形(特别是线条)的 类型:
type="p"
只显示点(默认)
type="l"
Plot lines
type="b"
(同时)显示点和线
type="o"
将点覆盖在线上
type="h"
绘制从点到零轴(x 轴)的垂直线(高密度)
type="s"
type="S"
步阶图。第一种形式,顶部垂直线匹配数据点; 第二种形式,底部匹配。
type="n"
图形不显示。但是坐标轴仍然显示(默认),并且 坐标依然以数据设定。这个非常适合 随后用低级绘图函数画图。
xlab=string
ylab=string
设定 x 和 y 轴的标签。可以用这些参数修改 默认标签。默认标签常常是用于高级绘图函数中的 对象的名字。
main=string
图形标题,以大字体置于图形的顶部。
sub=string
子标题,以小字体放在 x-轴底部。

低级图形函数

有些时候,高级图形函数不能精确产生你想要的图。 此时,低级图形命令 可以在当前图上精确增加一些额外信息 (如点,线或者文字)。

一些非常有用的低级图形命令是:

points(x, y)
lines(x, y)
在当前图上增加点或者连接线。plot() 的参数 type= 可用于这些函数( points() 的默认值是 "p"lines()"l"。)
text(x, y, labels, ...)
在图上给定的 x, y 位置添加文字。 labels 经常是整数或者字符向量,此时, labels[i] 放在 (x[i], y[i]) 处。默认值是 1:length(x)注意:这个命名常常用于下面的命令
          > plot(x, y, type="n"); text(x, y, names)

图形参数 type="n" 不让点显示,但设置 坐标轴。函数 text() 提供了一个特别的字符向量,因为 相应点的位置上的符标由字符向量 names 设定。

abline(a, b)
abline(h=y)
abline(v=x)
abline(lm.obj)
在当前图上增加一个斜率为 b 截距为 a 的直线。 h=y 可用于指定贯穿整个图的 水平线高度的 y-坐标。 v=x 相似地用于指定垂直线的 x-坐标。 同样,lm.obj 可能是一个有长度为2的 coefficients 分量 (如模型拟合的结果)的列表。该分量 中依次含有截距和斜率。
polygon(x, y, ...)
绘制由 (x, y) 作为顶点定义的多边形。 并且可以用剖面线处理(可选),或者 在图形设备允许的情况下填充其他东西。
legend(x, y, legend, ...)
在当前图的特定位置增加图例(legend)。标识字符, 线条格式,颜色等都是被 字符向量 legend 中的标签所注释。另外一个 含有画图单位对应值的参数 v (一个和 legend 长度一致的向量)是必须给定的:
legend( , fill=v)
填充盒子的颜色
legend( , col=v)
点或者线条的颜色
legend( , lty=v)
线条样式
legend( , lwd=v)
线条宽度
legend( , pch=v)
标识字符 (字符向量)
title(main, sub)
main 定义的标题以大字体的形式放在当前图的顶部, 同时可以将 sub 定义的小标题以小字体的形式放在下部(可选)。
axis(side, ...)
在第一个参数(1 到 4,从底部顺时钟方式数)定义的某一侧增加 一个坐标轴。另一个参数控制 坐标轴相对图区的位置,刻度位置 和标签。这对调用参数设置为 axes=FALSEplot() 函数后增加定制的坐标轴非常有用。

低级图形函数常常需要一些位置信息 (如,x 和 y 坐标) 来决定 新的图形的放置。坐标是由用户坐标设置。 而用户坐标根据先前高级图形命令定义以及由用户提供的数据决定。

其中 xy 参数是必须的。如果提供 一个同时含有参数 xy 的列表对象作为 参数也是允许的充分的。 相似的,一个双列的矩阵同样是合法的输入。 在这种情况下,函数 locator()(见后面的内容) 可以交互式地在一个图上设定位置。

交互使用图形环境

R 同时提供了允许用户直接用鼠标在一个图上提取和提交信息的函数。 其中最为简单的是函数 locator()

locator(n, type)
等待用户用鼠标左键点击当前图上的特定位置。 这个过程直到由 n (默认 512)个点 被选择,或者另外一个鼠标键被点击了。参数 type 允许在被选择的点上画图并且有 高级画图命令一样的效果;默认情况下不能画图。 locator() 以双分量 xy 的列表 形式返回所选中点的位置信息。

locator() 常常没有参数。当我们很难设定一些图形元素 (如图例和标签)在图上的放置位置时,交互式选定 位置信息可能是一种非常好的办法。 例如,在特异点(outlying point)的旁边 标注一些提示信息,我们可以用下面的命令

     > text(locator(1), "Outlier", adj=0)

(如果当前设备(如 postscript)不支持 交互式使用,则 locator() 会被自动忽略。)

identify(x, y, labels)
允许用户将 labels 定义的标签 (在labels为空时,默认为点的索引值)放置在 xy (利用鼠标左键)决定的点旁边。 当鼠标右键被点击时, 返回选择的点的索引。

有时候我们想标定一个图上的一些特定点,而不是 它们的位置。例如,我们可能期望用户能在图形显示上选择一些 有意思的点,然后以某种方式处理。 假定有两个数值向量 xy 构成的一系列 坐标 (x, y), 我们可以如下使用 函数 identify()

     > plot(x, y)
     > identify(x, y)

函数 identify() 自己不会标识,但允许用户 简单的移动鼠标指针和在一个点附近点击鼠标左键。 如果有一个点在鼠标指针附近,那么它将会把自己的索引值 (也就是在x/y 向量中的位置)标记在点的旁边。 还有一种方案是,你可以通过 identify() 的参数 labels 设置 其他的文字信息(如样本名字等),并且可以通过参数 plot = FALSE 禁止 标记重叠在一起。在这个过程结束时(见上面), identify() 返回所选点的索引值; 你可以利用这些索引值提取 原始向量 xy 中的点信息。

使用图形参数

当创建图形时,特别是用于做陈述或者出版, R 的默认设置往往不能符合要求。 但是你可以利用图形参数几乎可以定制任何你 想显示的方式。R 拥有一个数目很大的图形参数列表。 该列表包括控制线条样式, 颜色,图形排列和文字对齐等方面的参数。 每一个图形参数都有名字(如`col‘,控制 颜色)和值 (如颜色值)。

每一个活动的设备都有一套独立的图形参数列表, 和启动时各参数的默认值。 图形参数可以用两种方式设定: 要么是永久性的,影响所有访问当前设备的图形函数; 要么是临时性的,仅仅影响特定的图形函数。

Permanent changes: par() 函数

函数 par() 用于访问和修改当前图形设备的 参数列表。

par()
没有参数,将返回所有图形参数的列表和当前 设备的设定值。
par(c("col", "lty"))
设定一个字符串向量的参数,仅仅返回指定的 参数(同样是一个列表)。
par(col=4, lty=2)
给定参数(或者是一个列表参数),设置指定图形参数的值, 以列表的形式返回 参数的初试值。

通过函数 par() 设定图形参数会永久地改变 参数值,因为以后所有在当前设备中 调用的图形函数都会受这些设置值影响。 你可以用这种办法设定图形参数的 “默认”值。这些默认值将会被 所有图形函数调用,除非你设定了其他值。

注意,调用 par() 常常会影响图形参数的全局值, 这种情况甚至出现在函数内部调用 par()。 这种行为不是我们想要的-我们通常只是想 设定一些图形参数,绘制一些图片,然后恢复原始值以免影响到 其他用户的 R 会话。你可以 通过保存 par() 的值来恢复初试值。 当图形绘制结束后,你可以重新 载入这些保存的初试值1

     > oldpar <- par(col=4, lty=2)
       ... 图形命令 ...
     > par(oldpar)

为保存和恢复所有设定的图形参数,可以使用

     > oldpar <- par(no.readonly=TRUE)
       ... plotting commands ...
     > par(oldpar)

临时性地改变:图形函数的参数

图形参数可以以命名参数的形式传递到(几乎)所有图形函数。 这和函数 par() 设定的参数有同样的影响, 除非参数的改变仅仅影响 当前函数调用这个过程而不影响其他函数调用。例如:

     > plot(x, y, pch="+")

这将产生一个以加号为标符的散点图。这个命令不会影响 后面的图形命令的默认图标。

不过,这不是总是有效的,有些时候还是 需要通过 par() 设定和 重新设定图形参数。

图形参数列表

下面的内容将会具体描述一些常用的图形参数。 R 帮助文档中关于 par() 函数的内容 会给出更简练的概述;这里会给出一个有点 具体的描述。

图形参数将会以下面的形式给出:

name=value
对参数影响的描述。name 是参数名, 它可以用于 par() 或一个图形函数中。 value 是你想给这个参数 设定的值。

注意 axes 不是图形参数而是 一些 plot 方法的参数:参见 xaxtyaxt

R 目前还没有提供内置的函数处理动态图形, 如旋转散点云,“粉刷”(brush)(交互式强调)图形等。 但是,强大的动态图形函数可以从 Swayne, Cook 和 Buja 设计的系统 XGobi 中得到

http://www.research.att.com/areas/stat/xgobi/

并且可以通过 R 的包 xgobi 直接访问。 XGobi 可以在 UNIX 或者 Windows 的 X 桌面系统中运行, R 都有相关的接口。

XGobi 的一个衍生版本 GGobi 现在正在开发,可以参见: http://www.ggobi.org

本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

联系我们

如有建议:>>给我留言

QR code