R是一门著名的可用于数据和统计分析的程序语言,本文翻译自R软件官方文档教程《An Introduction to R》,仅供学习和参考。
12 图形工具
可视化也是R语言的优势之一。通过简单的R语言编程,我们可以使用绘制和显示各式各样的统计图和数据图表。
图形工具可以在交互模式或批处理模式下使用,但在大多数情况下,交互模式效率更高。交互模式的使用也比较简单,因为在启动时R会启动一个图形设备驱动程序,该驱动程序打开一个用于显示交互式图形的特殊图形窗口。虽然这是自动完成的,但知道所使用的命令是UNIX下的X11()
, windows下的windows()
和macOS下的quartz()
可能会很有用。不过,新的图形设备也总是可以通过dev.new()
打开。
一旦设备驱动程序运行,R绘图语句就可以用于生成各种图形。绘图语句一般包含以下三个基本类:
- 高级绘图函数:在图形设备上创建新的绘图,可能带有轴、标签、标题等。
- 低级绘图函数:为现有的图像添加更多的信息,例如额外的点、线和标签。
- 交互式图形函数:允许您使用鼠标等输入设备,以交互式的方式向现有绘图添加信息或从中提取信息。
此外,R还维护了一个图形参数列表,你可以对其进行设置来私人定制你的图像。
本手册只描述所谓的“基础”图形的绘制。在grid
包中有一个独立的图形子系统与能够与这些基础图形共存——它更强大,但也更难使用。有一个值得推荐的包lattice
(https://CRAN.R-project.org/package=lattice),它建立在grid
之上,并提供了类似于S中的Trellis系统中的多面板图的生成方法。
12.1 高级绘图函数
高级绘图函数的设计目的就是生成给定数据的一幅完整绘图。在适当的情况下,它们会自动生成轴、标签和标题(除非您另有要求)。高级绘图函数总是直接开始一个新的绘图,必要时擦除当前已有的绘图。
12.1.1 plot()函数
R语言中最常用的绘图函数之一是plot()
函数。这是一个泛型函数:它生成的图像的类型取决于第一个参数的类型。
plot(x,y)
plot(xy)
如果 x
和 y
都是向量,plot(x, y)
就能生成 y
相对于 x
的散点图。如果只提供一个包含两列数据的列表或矩阵,也可以产生相同的效果。
plot(x)
如果 x
是一个时间序列,就可以生成一个时间序列图。如果 x
只是一个数值向量,它就会生成一个向量中的值相对于它们在向量中的索引的散点图。如果 x
是一个复向量,它就会生成向量元素的虚部和实部的散点图。
plot(f)
plot(f,y)
其中,f
是一个因子对象,y
是一个数值向量。第一种形式生成 f
的柱状图。第二种形式为 f
的每一水平生成 y
的箱线图。
plot(df)
plot(~expr)
plot(y~expr)
其中,df
是一个数据框,y
可以是任何对象,expr
是一个用+
分隔的对象名称列表(例如,a + b + c
)。前两种形式产生数据框(第一种形式)或许多命名对象(第二种形式)中变量的分布图。第三种形式是根据expr
中指定的每个对象绘制y
。
12.1.2 展示多变量数据
R提供了两个非常有用的函数来展示多变量数据。如果X
是数字矩阵或数据框,则命令
> X <- data.frame(x=c(1,2,3),y=c(3,5,4),z=c(2,9,5))
> pairs(X)
将生成X
的列变量的成对散点图矩阵,即X
的每一列都与X
的每一列相对应,得到的n(n−1)个图排列在一个矩阵中,在矩阵的行和列上,图的大小是恒定的。
当涉及到三至四个变量时,使用coplot()
可能更有启发性。如果a
和b
都是数值向量,c
是数值向量或因子对象(长度相同),则命令
> x <- 1:20
> c <- rep(1:5,times=4)
> y <- x*c
> coplot(y ~ x | c)
将相对于c
值,生成a
与b
的若干散点图。如果c
是一个因子,这仅仅意味着对于c
的每个水平,对a
与b
进行绘图。当c
是数值向量时,它将被划分为若干个条件区间,对于每个区间内的c
值,对a
与b
进行绘图。区间的间隔的数量和位置可以通过given.values
参数来手动设置。可以用co.intervals()
函数生成一个向量的若干区间。绘图顺序为自左下开始朝右走S形。您还可以在命令中使用两个给定的变量,例如
> x <- 1:20
> c <- rep(1:5,times=4)
> d <- rep(1:4,times=5)
> y <- x*c + d
> coplot(y ~ x | c+d)
它对c
和d
的每个联合条件区间产生a
对b
的散点图。
coplot()
和pairs()
函数都接受一个参数panel
,该参数可用于自定义每个面板中显示的绘图类型。默认值是points
函数名来生成散点图,但通过提供其他一些低级图形函数的名称,您可以生成任何类型的图。一个对coplot()
函数有用的面板函数示例是panel.smooth
。
coplot(y ~ x | c+d,panel = panel.smooth)
12.1.3 显示图形
其他的高级图形函数也能产生不同类型的绘图。一些例子是:
qqnorm(x)
qqline(x)
qqplot(x, y)
分布对比图。第一种形式将数值向量x
的分位数与正态分布的分位数绘制在同一张图中进行比较。第二种形式这样的图添加一条直线。第三种形式绘制了x
的分位数与y
的分位数,以比较它们的分布匹配程度。
hist(x)
hist(x, nclass=n)
hist(x, breaks=b, ...)
生成数值向量x
的直方图。通常会产生很多的簇,但可以使用nclass=
参数进行设置。或者,可以用breat=
参数精确地指定断点。
如果给出了probability=TRUE
参数,直方图的纵坐标就表示频率除以区间宽度,而不是频数。
dotchart(x, ...)
生成x
的散点图。在散点图中,y
轴给出x
中数据的数据标签,x
轴则是数据的值。这种图非常容易从视觉上看出在某个特定范围内的数据元素。
image(x, y, z, ...)
contour(x, y, z, ...)
persp(x, y, z, ...)
绘制三元变量图。image
产生一个长方形的网格,用不同的颜色表示z
的值,contour
以等高线来展示z
的值,persp
产生3维表面图。此处的z
应该是矩阵。
12.1.4 高级图形函数的参数
有许多参数可以传递给高级图形函数,如下所示:
add=TRUE
强制将该函数的效果转化为低级图形函数——将新绘制的图形叠加到现有图中。这只对某些函数有效。
axes=FALSE
抑制坐标轴的生成。当你想自定义坐标轴的样式时,这个参数很有效。默认为TRUE
,即生成坐标轴。
log="x"
log="y"
log="xy"
将x轴、y轴或两者都设置为对数形式。对大多数函数生效。
type=
控制生成图的类型。"p"
代表点;"l"
代表线;"b"
代表点线都绘制但不覆盖;"o"
代表点线都绘制而且线覆盖点;"h"
代表绘制从点到x
轴的垂直线;"s"
代表垂直线顶部匹配数据点的步阶图;"S"
代表垂直线底部匹配数据点的步阶图;"n"
代表不显示图形,但坐标轴还是会显示,这有利于后面的低级图形函数的使用。
xlab=string
ylab=string
设定x轴和y轴的标签。可以用这些参数修改默认标签。默认标签常常是用于高级绘图函数中的对象的名字。
main=string
图形标题,以大字体置于图形的顶部。
sub=string
子标题,以小字体放在x轴底部。
12.2 低级绘图函数
有时候高级绘图函数并不能完美绘制出你想要的图形。在这种情况下,低级绘图函数可以来增加内容、补充细节(例如点、线、文字等)。
一些有用的低级绘图函数有:
points(x, y)
lines(x, y)
向当前的图形中增加点、线。
text(x, y, labels, ...)
在(x,y)
标志的位置上绘制文字labels
。通常,labels
是一个整数向量或字符串向量。labels[i]
将在x[i],y[i]
处绘制。
通常,text()
会这样使用:
> x <- c(1,3,4,5)
> y <- c(2,3,1,2)
> names <- c("A","B","C","D")
> plot(x, y, type="n")
> text(x, y, names)
abline(a, b)
abline(h=y)
abline(v=x)
abline(lm.obj)
在当前绘图中添加直线。可以是一条斜率为b
、截距为a
的直线。h=y
可以用于指明横线的纵坐标。v=x
可以用于指明竖线的横坐标。此外,还可以传入长度为2的拟合结果对象lm.obj
。
polygon(x, y, ...)
绘制由(x,y)中的有序顶点定义的多边形,并(可选)使用填充线对其进行着色,或者在图形设备允许填充图形的情况下对其进行填充。
legend(x, y, legend, ...)
在指定位置将图例添加到当前绘图中。打印字符、线条样式、颜色等均通过字符串向量legend
中的标签进行标识。还必须至少给出一个其他参数v
(与图例长度相同的向量),以及绘图单位的相应值,如下所示:
legend( , fill=v)
填充框的颜色
legend( , col=v)
绘制点或线的颜色
legend( , lty=v)
线条样式
legend( , lwd=v)
线条宽度
legend( , pch=v)
图例字符(字符串向量)
title(main, sub)
以大号字体在当前绘图的顶部添加主标题main
,并(可选)以小号字体在底部添加子标题sub
axis(side, ...)
在第一个参数side
指定的一侧(1到4,从底部开始顺时针计数)将坐标轴添加到当前绘图中。其他参数控制轴在绘图内测或外侧的位置,以及刻度位置和标签等。在使用axes=FALSE
参数调用plot()
后添加自定义轴很有用。
低级绘图函数通常需要一些定位信息(例如,x
和y
坐标)来确定将新绘图元素放置在何处。坐标是根据用户坐标给出的,用户坐标由先前的高级绘图函数定义,并根据提供的数据进行选择。
在需要x
和y
参数的情况下,提供一个参数也足够了,该参数是一个包含名为x
和y
的元素的列表。类似地,具有两列的矩阵也是有效的输入。通过这种方式,可以使用locator()
(见下文)等函数以交互方式指定绘图上的位置。
12.2.1 数学符号注释
在某些情况下,将数学符号和公式添加到绘图中是很有用的。这可以在R中通过在文本、多行文字、轴或标题中的任何一个中指定表达式而不是字符串来实现。例如,以下代码绘制了二项式概率函数的公式:
> text(x, y, expression(paste(bgroup("(", atop(n, x), ")"), p^x, q^{n-x})))
更多信息,包括可用的完整数学符号列表,可以使用以下命令从R中获得:
> help(plotmath)
> example(plotmath)
> demo(plotmath)
12.2.2 Hershey矢量字体
使用text()
和contour
函数时,可以使用Hershey矢量字体来渲染文本。使用Hershey字体有三个好处:
-
Hershey字体可以产生更好的输出,尤其是在电脑屏幕上旋转文本或缩小文本。
-
Hershey字体提供了标准字体中可能没有的某些符号。特别是星座符号、地图符号和天文符号。
-
Hershey字体提供西里尔字母和日语(假名和汉字)字符。
更多信息,包括Hershey字符表,可以使用以下命令从R中获得:
> help(Hershey)
> demo(Hershey)
> help(Japanese)
> demo(Japanese)
12.3 与图形交互
R还提供了允许用户使用鼠标提取信息或向绘图添加信息的功能。其中最简单的是locator()
函数:
locator(n,type)
等待用户使用鼠标左键在当前绘图上选择位置。
这种情况一直持续到选择了n
个(默认512个)点,或者按下了另一个鼠标按钮。类型参数允许在选定的点进行打印,并且具有与高级图形命令相同的效果;默认情况是不打印。
locator()
返回作为包含两个分量x和y的列表,其中包含选择的点的位置。
locator()
通常在没有参数的情况下调用。当很难提前计算图形应放置的位置时,它对于交互式地选择图例或标签等图形元素的位置特别有用。例如,要将一些信息性文本放置在某一个特殊数据点附近:
> text(locator(1), "特殊点", adj=0)
这可能会很有用。(如果当前设备(如postscript
)不支持交互式指向,则会忽略locator()
。)
identify(x, y, labels)
允许用户通过在附近绘制相应的标签组件(或者如果标签不存在则为该点的索引号)来突出显示由 x 和 y 定义的任何点(使用鼠标左键) .按下另一个按钮时返回所选点的索引。
有时我们想要识别图上的特定点,而不是它们的位置。例如,我们可能希望用户从图形显示中选择一些感兴趣的观察结果,然后以某种方式操纵该观察结果。给定两个数值向量 x 和 y 中的多个 (x,y) 坐标,我们可以使用 identify()
函数,如下所示:
> plot(x, y)
> identify(x, y)
identify()
函数本身不执行绘图,只是允许用户移动鼠标指针并在某个点附近单击鼠标左键。如果鼠标指针附近有一个点,它将用附近绘制的索引号(即它在 x/y 向量中的位置)进行标记。或者,您可以使用一些信息字符串(例如案例名称)作为高亮显示,方法是使用 identify()
的 labels
参数,也可以使用plot = FALSE
参数禁用标记。当进程终止时(见上文),identify()
返回所选点的索引;您可以使用这些索引从原始向量 x 和 y 中提取选定的点。
12.4 使用图形参数
在创建图形时,特别是出于演示或发布目的,R 的默认绘图并不总是产生完全符合要求的结果。但是,您几乎可以使用图形参数自定义图形的每个方面。 R 维护着一个包含大量图形参数的列表,这些参数控制诸如线型、颜色、图形排列和文本对齐等许多其他内容。每个图形参数都有一个名称(例如控制颜色的col
)和一个值(例如颜色编号)。
R为每个活动设备维护一个单独的图形参数列表,并且每个设备在初始化时都有一组默认参数。图形参数可以通过两种方式设置:永久性的,影响访问当前设备的所有图形功能;或暂时的,仅影响单个图形函数调用。
12.4.1 永久改变: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)
> --绘图--
> par(oldpar)
12.4.2 临时更改:图形函数的参数
图形参数也可以作为命名参数传递给(几乎)任何图形函数。
这与将参数传递给 par()
函数具有相同的效果,只是更改仅在函数调用期间持续。例如:
> plot(x, y, pch="+")
使用加号作为绘图字符生成散点图,而不更改未来绘图的默认绘图字符。
不幸的是,这并没有完全一致地实现,有时需要使用 par()
设置和重置图形参数
12.5 图形参数列表
以下部分详细介绍了许多常用的图形参数。 par()
函数的 R 帮助文档提供了更简洁的摘要;这是作为更详细的替代方案提供的。
图形参数将以如下形式呈现:
name=value
参数效果的描述。 name
是参数的名称,即在调用 par()
或图形函数时使用的参数名称。 value
是您在设置参数时可能使用的典型值。
请注意,axes
不是图形参数,而是一些绘图方法的参数。对应的图形参数请参考 xaxt
和 yaxt
。
12.5.1 图形元素
R 中的图象由点、线、文本和多边形(填充区域)组成。存在控制这些图形元素绘制方式的图形参数,如下所示:
pch="+"
设置用于绘制点的字符(point char)。默认值因图形驱动程序而异,但通常为“o”
。除非您使用“.”
设置在中心处绘制,否则标绘点往往会出现在适当位置的上方或下方。
pch=4
当 pch
以 0 到 25 之间的整数给出时,会产生一个专门的绘图符号。要查看符号是什么,请使用命令
> legend(locator(1), as.character(0:25), pch = 0:25)
那些从 21 到 25 的符号可能看起来与前面的符号重复,但可以在中着色不同的方式:请查看关于points
的帮助及其示例。
此外,pch
可以是字符或 32:255 范围内的数字,表示当前字体中的字符。
lty=2
设置线型(line types)。并非所有图形设备都支持替代线条样式(并且在支持的设备上有所不同),但线型 1 始终是实线,线型 0 始终不可见,线型 2 及以后的线型是点线或虚线,或某种组合两者的样式。
lwd=2
设置线宽(line width)。所需的线宽,是“标准”线宽的倍数。会影响轴线以及用 lines()
等绘制的线。并非所有设备都支持此功能,并且某些设备对可以使用的宽度有限制。
col=2
设置用于点、线、文本、填充区域和图像的颜色。来自当前调色板的数字(参见 ?palette
)或命名颜色。
col.axis
col.lab
col.main
col.sub
分别用于设置轴注释、x 和 y 标签、主标题和副标题的颜色
font=2
一个整数,用于设置文本的字体。如果可能,设备驱动程序会安排 1 对应纯文本,2 对应粗体,3 对应斜体,4 对应粗体斜体,5 对应符号字体(包括希腊字母)。
font.axis
font.lab
font.main
font.sub
分别用于设置轴注释、x 和 y 标签、主标题和副标题的字体。
adj=-0.1
用于设置文本相对于绘图位置的对齐。 0 表示左对齐,1 表示右对齐,0.5 表示以绘图位置为中心水平居中。实际值是文本出现在绘图位置左侧的比例,因此值为 -0.1 会在文本和绘图位置之间留下文本宽度的 10% 的间隙。
cex=1.5
用预设值字符扩展(char expansion)。该值是相对于默认文本大小的文本字符(包括绘图字符)的所需大小。
cex.axis
cex.lab
cex.main
cex.sub
分别用于轴注释、x 和 y 标签、主标题和副标题的字符扩展。
12.5.2 坐标轴和刻度线
许多 R 的高级绘图都有轴,您可以使用低级绘图函数axis()
自己构造轴。坐标轴具有三个主要组成部分:轴线(由lty
图形参数控制的线型)、刻度线(标记沿轴线的单位划分)和刻度标签(标记单位)。这些组件可以用以下图形参数来进行自定义。
lab=c(5, 7, 12)
前两个数字分别是 x 和 y 轴上所需的刻度间隔数。第三个数字是轴标签所需的长度,以字符为单位(包括小数点)。为此参数选择太小的值可能会导致所有刻度标签被四舍五入为相同的数字!
las=1
轴标签的方向。 0 表示始终平行于轴,1 表示始终水平,2 表示始终垂直于轴。
mgp=c(3, 1, 0)
轴分量的位置。第一个分量是轴标签到轴位置的距离,以文本行数表示。第二个分量是到刻度标签的距离,最后一个分量是轴位置到轴线的距离(通常为零)。正数表示在绘图区域外测量,负数表示在内部测量。
tck=0.01
刻度线的长度,作为绘图区域大小的一部分。当 tck
较小(小于 0.5)时,x 轴和 y 轴上的刻度线被强制设置为相同大小。值为 1 给出网格线。负值给出绘图区域外的刻度线。使用tck=0.01
和 mgp=c(1,-1.5,0)
产生内部刻度线。
xaxs="r"
yaxs="i"
分别用于设置 x 和 y 轴的轴样式。对于样式“i”
(内部)和“r”
(默认),刻度线始终落在数据范围内,但是样式“r”
在边缘留下少量空间。
12.5.3 图边距
R 中的单个绘图称为figure
(图形),包含一个由边距包围的绘图区域(可能包含轴标签、标题等)并且(通常)由轴本身界定。
控制图形布局的图形参数包括:
mai=c(1, 0.5, 0.5, 0)
分别设置底部、左侧、顶部和右侧页边距的宽度,以英寸为单位。
mar=c(4, 2, 2, 1)
与mai
类似,只是度量单位是文本行。
由于设置了一个另一个也会改变,mar
和 mai
是等价的。此参数的默认值通常过大;很少需要右边距,如果没有使用标题,上边距也不需要。底部和左边距必须足够大以容纳坐标轴和刻度标签。此外,默认值与设备表面的大小无关:例如,使用带有 height=4
参数的 postscript()
驱动程序将导致绘图的边距约为 50%,除非明确设置了 mar
或 mai
。当使用多个图形时(见下文),页边距会减少,但是当许多图形共享同一页时,这可能还不够。
12.5.4 多图形环境
R 允许您在单个页面上创建一个 n 乘 m 的图形数组。每个图形都有自己的边距,图形数组可以选择用外边距包围,如下图所示。
多图相关的图形参数如下:
mfcol=c(3, 2)
mfrow=c(2, 4)
设置多图形数组的大小。第一个值是行数;第二个是列数。这两个参数之间的唯一区别是设置 mfcol
会导致数字按列填充; mfrow
按行填充。
图中的布局可以通过设置 mfrow=c(3,2)
创建;该图显示了绘制了四个绘图后的页面。
设置其中任何一个都可以减少符号和文本的基本大小(由 par("cex")
和设备的点大小控制)。在恰好有两行和两列的布局中,基本大小会减少 0.83 倍:如果有三行或三列或更多行或列,则减少因子为 0.66。
mfg=c(2, 2, 3, 2)
设置当前图形在多图形环境中的位置。前两个数字是当前要绘制的图形所在的行和列;最后两个是多图形数组中的行数和列数。设置此参数以在不同的数组位置之间跳转。您甚至可以为最后两个数字使用任意值,不必是真实值。
fig=c(4, 9, 1, 4)/10
设置当前图形在页面上的位置。值分别是左、右、下和上边缘的相对位置(百分比形式)。示例值将用于页面右下角的图形。设置此参数以在页面内任意定位图形。如果要将图形添加到当前页面,也请使用 new=TRUE
(与 S 不同)。
oma=c(2, 0, 3, 0)
omi=c(0, 0, 0.8, 0)
设置外边距的大小。与 mar
和 mai
一样,第一个以文本行为单位,第二个以英寸为单位,从下边距开始并顺时针工作。
外边距对于分页标题等特别有用。可以使用带参数 outer=TRUE
的 mtext()
函数将文本添加到外边距。但是,默认情况下没有外边距,因此您必须使用 oma
或 omi
显式创建它们。
split.screen()
和 layout()
函数以及 grid
和 lattice
(https://CRAN.R-project.org/package=lattice) 包可以生成多个图形的更复杂排列。
12.6 设备驱动程序
R 可以在几乎任何类型的显示或打印设备上生成图形(不同质量级别)。然而,在这开始之前,R 需要被告知它正在处理什么类型的设备。这是通过启动设备驱动程序来完成的。设备驱动程序的目的是将 R 中的图形指令(例如“画一条线”)转换为特定设备可以理解的形式。
设备驱动程序通过调用设备驱动程序函数启动。每个设备驱动程序都有一个这样的功能:键入 help(Devices)
以获得所有设备驱动程序的列表。例如,发出命令
> postscript()
导致所有以后的图形输出以 PostScript 格式发送到打印机。一些常用的设备驱动程序是:
X11()
用于类似 Unix 的 X11 窗口系统
windows()
用于 Windows
quartz()
用于 macOS
postscript()
用于在 PostScript 打印机上打印,或创建 PostScript 图形文件。
pdf()
生成 PDF 文件,也可以将其包含到 PDF 文件中。
png()
生成位图 PNG 文件。 (并非总是可用:请参阅其帮助页面。)
jpeg()
生成位图 JPEG 文件,最适合用于图像绘图。 (并非总是可用:请参阅它的帮助页面。)
当您使用完一个设备后,一定要通过发出命令
dev.off()
来终止设备驱动程序。这可以确保设备干净利落地完成;例如,在硬拷贝设备的情况下,这可确保每一页都已完成并已发送到打印机。 (这将在会话正常结束时自动发生。)
12.6.1 排版文档的 PostScript 图
通过将file
参数传递给 postscript()
设备驱动程序函数,您可以将 PostScript 格式的图形存储在您选择的文件中。除非给出 horizontal=FALSE
参数,否则绘图将处于横向方向,并且您可以使用 width
和 height
参数控制图形的大小(绘图将适当缩放以适合这些尺寸。)例如,命令
> postscript("file.ps", horizontal=FALSE, height=5, pointsize=10)
将生成一个包含 PostScript 代码的文件,用于五英寸高的图形,可能用于包含在文档中。需要注意的是,如果命令中命名的文件已经存在,它将被覆盖。即使文件只是在同一 R 会话中更早创建的,情况也是如此。
PostScript 输出常常被当做子图合并到另一个文档中。这在生成封装的 PostScript (EPS) 时效果最好:R 始终生成一致的输出,但仅在提供 onefile=FALSE
参数时才将输出标记为EPS。这种不寻常的表示法源于 S 兼容性:它实际上意味着输出将是单页(这是 EPSF 规范的一部分)。因此,要制作一个用于被包含的图像,请使用
> postscript("plot1.eps", horizontal=FALSE, onefile=FALSE,height=8, width=6, pointsize=10)
12.6.2 多个图形设备
在 R 的高级使用中,同时使用多个图形设备通常很有用。
当然,在任何时候只有一个图形设备可以接受图形命令,这就是所谓的当前设备。当多个设备打开时,它们形成一个编号序列,而名称可以对应相应的设备。
用于多设备操作的主要命令及其含义如下:
X11()
[UNIX]
windows()
win.printer()
win.metafile()
[Windows]
quartz()
[macOS]
postscript()
pdf()
png()
jpeg()
tiff()
bitmap()
对设备驱动程序函数的每次新调用都会打开一个新的图形设备,从而扩展设备列表。此设备成为当前设备,图形输出将发送到该设备
dev.list()
返回所有活动设备的编号和名称。列表中位置 1 的设备始终是完全不接受图形命令的空设备。
dev.next()
dev.prev()
分别返回当前设备的下一个和上一个图形设备的编号和名称。
dev.set(which=k)
可用于将当前图形设备更改为设备列表中位置 k 处的设备。返回设备的编号和标签。
dev.off(k)
在设备列表的 k 点终止图形设备。对于某些设备,如 postscript 设备,这将立即打印文件或正确完成文件以供以后打印,具体取决于设备的启动方式。
dev.copy(device, ..., which=k)
dev.print(device, ..., which=k)
制作设备 k 的副本。这里的 device 是一个设备函数,例如 postscript()
,如果带有额外的参数,可由...
指定。 dev.print
类似,但复制的设备会立即关闭,因此会立即执行打印硬拷贝等结束操作。
graphics.off()
终止列表中的所有图形设备,空设备除外。
12.7 动态图形
R 没有动态或交互式图形的内置功能,例如旋转点云或“刷”(交互式突出显示)点。然而,Swayne、Cook 和 Buja 的系统 GGobi 中提供了广泛的动态图形工具,可从 http://ggobi.org/ 获得,或通过包 rggobi
(https://CRAN.R-project. org/package=rggobi),在 http://ggobi.org/rggobi.html 中有描述。
此外,包 rgl
(https://CRAN.R-project.org/package=rgl) 提供了与 3D 图(例如曲面)交互的方法。