图形工具是 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=
stringylab=
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()
的值来恢复初试值。 当图形绘制结束后,你可以重新 载入这些保存的初试值。
> 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 中得到
并且可以通过 R 的包 xgobi 直接访问。 XGobi 可以在 UNIX 或者 Windows 的 X 桌面系统中运行, R 都有相关的接口。
XGobi 的一个衍生版本 GGobi 现在正在开发,可以参见: http://www.ggobi.org
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。