banner
大数据平台>大数据技术与应用>用R语言统计图形

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

作者: afenxi来源: afenxi时间:2016-12-29 16:16:03

图形工具是 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) 如果 x 和 y 是向量,plot(x, y) 将产生 y 对 x 的散点图。 单参数(第二种形式)可以实现同样的结果。对于单参数要么是一个包含 两个分量x 和 y 的列表要么是一个双列的矩阵。 plot(x) 如果 x 是一个时间序列,这将产生一个时间序列图。如果 x 是一个数值向量,它将产生一个向量值对该向量索引 的图。如果 x 是一个复向量, 它将会产生一个向量元素的虚部对实部的 图。 plot(f) plot(f, y) f 实一个因子对象,y 是一个数值向量。第一种形式产生 f 的直方图;第二种形式产生 y 在 f 的各种水平下的盒状图。 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 处理三个或者四个变量的产生的图可能会更清晰。 如果 a 和 b 是数值向量,c 是数值向量或者因子对象(长度都一致),那么 下面的命令

> coplot(a ~ b | c)

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

> coplot(a ~ b | c + d)

它将会产生在任何在 c 和 d 联合区间内的 a 对 b 的散点图。

函数 coplot() 和 pairs() 都有一个参数 panel=。这个参数可以用来设置各个面板中的图形样式。 默认值 points() 用来产生散点图,但是通过将低级命令 用于两个向量 x 和 y 并赋值给参数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=FALSE 的 plot() 函数后增加定制的坐标轴非常有用。

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

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

交互使用图形环境

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

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

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

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

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

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

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

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

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

使用图形参数

当创建图形时,特别是用于做陈述或者出版, 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 方法的参数:参见 xaxt 和 yaxt。

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

原创文章,作者:古思特

banner
看过还想看
可能还想看
最新文章
Yonghong Z-Suite一站式大数据分析平台 —— 以卓越的数据技术为客户创造价值,实现客户成功。