在Windows下用window()命令可以打开图形窗口。
12.1 高级绘图命令
高级绘图函数,由函数参数提供数据生成一幅完整的图形。其中适当的坐标轴,标签和标题都自动生成了(除非你另外指定了)。高级绘图命令每次都生成一幅新的图形,清除当前的图形(如果需要的话)。
1 plot()函数
这是一个通用函数:生成图形的类型取决于第一个参数的类型或类别(class)。
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中每个对象的图。
2 显示多元数据
如果X是一个数值矩阵或数据帧,下面的命令
> pairs(X)
生成一个配对的散点图矩阵,矩阵由X中的每列的列变量对其他各列列变量的散点图组成,得到的矩阵中每个散点图行、列长度都是固定的。
当问题涉及到三、四个变量时,使用coplot更好些。如果a和b是数值向量,c是数值向量或因子对象(全都是相同长度的),下面的命令
> coplot(a ~ b | c)
对应c的某些给定值生成数个a对b的散点图。当c是一个因子时,这个命令也就是对c的每个水平生成a对b的散点图。当c是数值向量的时候,这个数值向量被分为一系列的条件区间(conditioning intervals),对应c的每个区间生成一个a对b的散点图。区间的数量和位置可以通过coplot()的参数given.values来控制,函数co.intervals()也可以用来选择区间。我们也可以使用两个给定变量通过命令
>coplot(a ~ b | c+d)
对c和d的每个联合条件区间生成a对b的散点图。
函数coplot()和pairs()都可以使用参数panel=,这个参数可以用来定制我们得到的图形类型。默认的是points()函数,生成一个散点图,不过通过在参数panel=中提供某些其它的低级图形函数,我们可以生成需要的各种图形。一个很有用的函数例子是panel.smooth()。
3 显示图形
qqnorm(x) qqline(x) qqplot(x,y)
分布比较图。第一种形式生成向量x对期望正态分数(一个正态记分图),第二个在上面的图上添加一条穿过分布分位点和数据分位点的直线。第三个命令生成x的分位点对y分位点图,用于分别比较它们的分布。
hist(x) hist(x,nclass=n) hist(x,breaks=b, . . . )
生成数值变量x的直方图。通常会自动选定一个合理的类别数,不过可以通过nclass=参数来指定一个推荐值。或者通过参数breaks=来指定分界点。如果给定了probability=TRUE参数,那么条形图代表相对频数而不是累计数。
dotchart(x, . . . )
创建一个x中数据的点图(dotchart)。点图中y轴给出x中数据的标签,x轴给出它们的值。它允许对落入某一特定区间的所有数据项方便的进行可视化选择。
image(x,y,z, . . . ) contour(x,y,z, . . . ) persp(x,y,z, . . . )
生成三个变量的图。函数image是用不同的颜色绘制一些矩形方格来展示z的值,函数contour通过绘制等高线来展示z的值,函数persp绘制一个3D面。
4 参数配置
add=TRUE 强制函数按照低级图形函数的方式操作,将图形置于当前图形上(仅对某些函数有效)。
axes=FALSE 暂时禁止坐标轴的生成|以便使用axis()函数添加你自己定制的坐标轴。默认情况是axes=TRUE,即包含坐标轴。
log="x" log="y" log="xy" 令x,y或者两者全都对数化。这个参数对许多函数都有效,不过不是全部。
type= 参数type=控制所生成图形的类型:
type="p" 绘制单独的点(默认值)
type="l" 绘制线
type="b" 绘制由线连接的点(both)
type="o" 将点绘在线上
type="h" 绘制从点到零轴的垂线(high-density)
type="s" 阶梯式图。第一种形式中,点由垂线的顶部定义;第二种形式里用底部定义。
type="n" 不绘制。不过坐标轴是绘出的(默认情况)而且要根据数据绘出坐标系统。用来给后续的低级图形函数创建图形作基础。
xlab=string ylab=string x轴或y轴的标签。使用这些参数来改变默认的标签,通常的默认值是调用高级绘图函数时所使用对象的名称。
main=string 图表标题,位于图形的顶部,大字体显示。
sub=string 子标题,位于x轴下面,用较小的字体显示。
12.2 低级绘图命令
有些时候高级绘图函数并不能很精确的生成我们想要的图形。这种情况下,我们可以通过低级绘图命令在当前图形上添加信息(例如,点、线或文本)。
points(x,y) lines(x,y)
在当前图形上添加点或线。函数plot()的参数type=也可以用于这些函数(默认的是"p"代表points()和"l"代表lines())。
text(x,y,labels, . . . )
给定点坐标x,y,在该点添加文本。通常labels是一个整数或字符向量,其中labels[i]出现在点(x[i],y[i])。默认值是1:length(x)。
Note: 这个函数通常用于这样的序列中
> 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在图形指定的高度上绘制一条贯穿图形的水平线,同样的,v=x在x轴的指定位置绘制一条贯穿的垂线。而lm.obj是一个包含coefficients组件的列表,该组件的长度为2,分别当作截距和斜率。
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, . . . )
在当前图形的指定边上添加坐标,在哪个边上由第一个参数指定(1到4,从底部按照顺时针顺序)。其他参数控制坐标的位置|在图形内或图形外,以及标记的位置和标签。适合在调用参数为axes=FALSE的函数plot()后添加定制的坐标轴。
低级绘图函数通常都需要一些位置信息(例如,x,y坐标)来决定在哪里添加新的元素。坐标以用户坐标(user coordinates)的形式给出,这个坐标系是根据所提供的数据由之前的高级绘图语句定义的。需要x,y参数的地方还可以选用一个单独的参数,即一个由名为x,y的元素组成的列表。相似的,一个两列的矩阵也可以。像locator()(后面会提到)这样的函数也可以按照这种方式交互的指定图形中的位置。
添加数学注释
某些情况下需要在图形中加入数学符号或公式。在R中可以通过在text, mtext,axis或title中指定一个表达式来实现。例如,下面的代码绘制了二项概率函数的公式:
> text(x, y, expression(paste(bgroup("(", atop(n, x), ")"),p^x, q^{n-x})))
更多的信息,包括其特性的一个完整列表可以在R中通过下面的命令得到:
> help(plotmath)
> example(plotmath)
添加Hershey矢量字体
> help(Hershey)
> example(Hershey)
12.3 图形的交互
R提供了函数,使用户可以通过鼠标从图形中释放信息或添加信息。
locator(n,type)
等待用户使用鼠标左键在当前图形上选择位置。直到n(默认是512)个点都选完或者点击了鼠标另一个键(Unix,Windows),在Mac下用鼠标点击图形窗口外的部分也可以结束。参数type的效果和在高级绘图函数中使用时是一样的,即在选择的点绘制指定的图形。默认情况是不绘制图形。函数locator()将所选点的坐标返回到一个列表中,列表包含x,y两个组件。
通常locator()在调用的时候并不带参数。这个功能在为图例或标签这样的图形元素选择位置时比较有用,尤其是这些位置不好通过计算得到的时候。举个例子,如果要在一个野点附近添加一些信息,可以使用下面的命令
> text(locator(1), "Outlier", adj=0)
identify(x, y, labels)
允许用户在x,y(使用鼠标左键)定义的点附近绘制相应的labels的组件(如果没有给出labels就给出该点的序号),突显该点。当鼠标的另一个键被点击时(Unix,Windows)返回被选点的序号,在Mac下通过点击图形窗口外来实现这个效果。
有时我们更想确定图形中的点,而非它们的位置。例如,我们可能希望从图示中选出某些感兴趣的观测点,然后进行某些操作。通过两个数值向量x,y给定一系列坐标(x; y),我们可以使用identify()函数:
> plot(x,y) > identify(x,y)
函数identify()本身不绘图,但是允许用户移动鼠标,在某点附近点击左键。离鼠标指针最近的点将被突显,并标出其序号(也就是它在向量x/y中的位置)。或者使用identify()的labels参数,把某些信息(例如案例名称)作为突显的标志;或者通过plot=FALSE参数取消所有突显标志。当选点的过程结束后,identify()返回所选点的序号;用户可以使用这些序号从x和y中释放所选的点。
12.4 使用图形参数
通过图形参数可以定制图形显示的几乎所有方面。R包含大量的图形参数,可以控制的包括线条类型,颜色,图标排列,文本对齐等等。
1 持续性变更 (Permanent changes): par()函数
通过par()函数设定图形参数的值会持续性的更改参数的值,也就是说这之后(在当前设备上)所有对图形函数的调用都受到新值的影响。
函数par()用于存取和修改当前图形设备的图形参数列表。
par()不带任何参数,返回当前设备所有图形参数和它们的值的列表。
par(c("col","lty"))
参数为一个字符向量,仅返回参数中指定的图形参数(也是作为一个列表)。
par(col=4, lty=2)
带指定参数(或一个列表型参数),设定指定图形参数的值,并将参数的原始值作为一个列表返回。
所以如果想设定参数绘制一些图形后再恢复成原来的设定,可以这么做:
> oldpar <- par(col=4, lty=2)
. . . plotting commands . . .
> par(oldpar)
2 临时性变更:图形函数的参数
图形参数也可以作为(几乎)所有图形函数的命名参数。这种方式的效果和用于par()函数的效果是一样的,只不过这种改变只在函数调用的区间内有效。比如:
> plot(x, y, pch="+")
生成一个以加号作为绘图符号的散点图,而不改变后续图形的默认的绘图符号。
3 图形参数列表
A 图形元素
R图表由点、线、文本和多边形(填充区)组成。下面的图形参数控制了图形元素的绘制:
pch="+" 用来绘点的字符。这个默认值随不同的图形驱动是不同的,不过通常都是'±'。除非使用"."作为绘图字符,否则绘制的点都会比适当的位置高一点或者低一点,而不是恰好在指定位置。
pch=4当给定一个0到18的整数时,会生成一个特殊的绘图符号。通过下面的命令可以看这些符号都有什么。
> legend(locator(1), as.character(0:18), pch=0:18)
lty=2 线条类型。并不是所有图形设备都支持多种线条类型(在那些支持的设
备上也不全一样),不过线条类型1始终是实线,2及以上的是点、划线或者它们的组合。
lwd=2 线条宽度。所需的线条宽度,是"标准"线条宽度的倍数。对line()等函数绘制的线条和坐标轴都有效果。
col=2 点、线、文本、填充区和图像使用的颜色。每种图形元素都有其可用的颜色列表,这个参数的值就是颜色在列表中的序号。显然,这个参数值对有限的一类设备有效。
font=2 指定文本所使用字体的一个整数。如果可能的话,设备驱动会把1对应普通文本,2对应粗体,3对应斜体,4对应粗斜体。
font.axis font.lab font.main font.sub 这几个参数分别指定坐标轴注释,x,y轴的标签,主、副标题所用的字体。
adj=-0.1 文本对齐和绘图位置有关。0代表左对齐,1代表右对齐,0.5代表水平的中间位置。当前的值使会图位置到左端距离的比例,所以-0.1在文本和绘图位置之间留10%的空白。
cex=1.5 字符缩放。这个值是所需文本字符(包括绘图字符)的大小,与默认文本大小相关。
B 坐标轴和标记
很多R的高级图形都有坐标轴,你可以使用低级图形函数axis()自己创建坐标轴。坐标轴包含三个主要组件:轴线axis line(线条类型由参数lty控制),标记tick mark(沿着轴线划分单元),标号tick label(用来标出这些单元)。这些组件可以用下面这些参数定制。
lab=c(5,7,12)前两个数字分别是x和y轴上所要划分的区间数。第三个数字是坐标轴标签的长度,用字符数来衡量(包括小数点)。参数的值如果选得太小可能导致所有标号都聚在一起。
las=1 坐标轴标签的方向。0代表总是和坐标轴平行,1代表总是水平的,2代表总是垂直于坐标轴。
mgp=c(3,1,0)坐标轴组件的位置。第一个组件是坐标轴标签到坐标轴的距离,单位是文本行(text lines)。第二个组件是到标号的距离,最后一个是轴的巍直到轴线的距离(一般都是0)。正数代表绘图区域外,负数代表区域内。
tck=0.01 标号的长度,绘图区域大小的一个分数作单位。当tck比较小时(小于0.5),就强制x和y轴上的标记为相同大小。tck=1就是生成网格线。取负值时标记画向绘图区域外。内部标记可以使用tck=0.01和mgp=c(1,-1.5,0)。
xaxs="s" yaxs="d" 分别是x、y轴的类型。如果是s(standard)或e(extended)类型,那最大和最小的标记都始终在数据区域之外。如果有某个点离边界非常近,那么扩展型(extended)的轴会稍稍扩展一下。这种类型的轴有时会在边界附近留出大片空白。而i(internal)或r(默认值)类型的轴,标记始终在数据区域内,不过r类型会在边界留出少量空白。
如果这个参数设为d,就锁定当前轴,对之后绘制的所有图形都用这个轴(直到参数被重新设定为其他的那几个值)。这个参数适用于生成一系列固定尺度的图。
C 图边缘(Figure margins)
在R中一个单独图形,图(figure),包含一个绘图区(plot region),以及环绕着这个区域的边缘(其中可能含有坐标轴标签、标题等等),(通常)这两部分以轴为边界。
一个典型的图是
控制图的样式的图形参数包括:
mai=c(1,0.5,0.5,0)分别是底部,左侧,顶部,右侧的宽度,单位是英寸。
mar=c(4,2,2,1)与mai相似,只是单位是文本行(text lines)。
由于更改一个就会改变另一个的值,所以在这个意义上,mai和mar是等价的。这个参数的默认值通常都太大了;右侧边缘很少用到,如果没标题,顶部边缘也不需要,左侧和底部的边缘应当足够大,以容纳坐标轴和标号。此外,默认值并没有考虑到设备表面的大小:比如,使用postscript()驱动,height=4参数时,除非用mar,mai另外设定,否则图的边缘就要占上大约50%。使用多图环境时(后面会提到)。边缘会减少一半,不过这在多图共用一页的时候可能还不够。
D 多图环境
R允许在一页上创建一个n£m的图的阵列。每个图由自己的边缘,图的阵列还有一个可选的外部边缘,如下图所示。
与多图环境相关的图形参数有:
mfcol=c(3, 2) mfrow=c(2, 4)
设定多图阵列的大小。第一个值是行数,第二个值是列数。这两个参数唯一的区别是mfcol把图按列排入,mfrow把图按行排入。上图所示的版式可用mfrow=c(3,2)创建;上图显示的是绘制四幅图后的情况。
mfg=c(2, 2, 3, 2)
当前图在多图环境下的位置。前两个数字是当前图的行、列数;后两个是其在多图阵列中的行列数。这个参数用来在多图阵列中跳转。你甚至可以在后两个数中使用和真值(true value)不同的值,在同一页上得到大小不同的图。
fig=c(4, 9, 1, 4)/10
当前图在页面的位置,取值分别是左下角到左边界,右边界,下、上边界的距离与对应边的百分比数。给出的例子是一个页面右下角的图。这个参数可以设定图在页面的绝对位置。
oma=c(2, 0, 3, 0) omi=(0, 0, 0.8, 0)
外部边缘的大小。与mar和mai相似,第一个用文本行作单位,第二个以英寸作单位,从下方开始按照顺时针顺序指定。
外部边缘对页标题这类东西很有用。文本可以通过带outer=TRUE参数的mtext()函数加入外部边缘。默认情况下是没有外部边缘的因此必须通过oma或omi指定。
函数split.screen()和layout()可以对多个图形作更复杂的排列。
12.6 设备驱动
R几乎可以在任何一种类型的显示器和打印设备上生成(不同质量的)图形。不过,在这之前,需要告诉R要处理的是哪一种设备。这通过启动一个设备驱动来完成。
设备驱动通过调用设备驱动函数来启动。
某些常用的设备驱动有:
X11()[Unix] 使用X11视窗系统
windows()[Windows] 使用 Windows 视窗系统
postscript()在PostScript打印机上打印或者创建PostScript图形文件
pictex()生成一个LATEX文件
当一个设备使用完之后,可以通过下面的命令终止设备驱动
> dev.off()
这个命令可以确保设备已经结束;例如,在某些硬拷贝的设备中,这个命令可以保证每页都已经完成,并且都被传送到打印机了。
PostScript文档
通过给postscript()函数带上file参数,我们可以把图形以PostScript格式存储到文件中。如果没有给出horizontal=FALSE参数,图形是横向的,你可以通过width和height参数控制图形的大小(图形会自动适应)。例如,命令
> postscript("file.ps", horizontal=FALSE, height=5, pointsize=10)
为一个五英寸的图生成一个包含PostScript代码的文件,可以放在文当中。如果命令中的指定的文件名已经存在,将会被覆盖。
多重图形设备
每个对设备驱动的新调用都会打开一个新的图形设备,在设备列表中加入新的一项。这个设备就成为当前设备,图形输出就传送到这个设备。
dev.list() 返回所有活动中设备的序号和名称。在列表位置1的设备始终是空设备(null device),这个设备不接收任何图形命令。
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() 终止列表中的所有图形设备,空设备除外。