3.3 图形参数

我们可以通过修改称为图形参数的选项来自定义一幅图形的多个特征(字体、颜色、坐标轴、标题)。

(修改图形参数的)一种方法是通过函数par()来指定这些选项。以这种方式设定的参数值除非被再次修改,否则将在会话结束前一直有效。其调用格式为par(optionname=value, optionname=name,…)。不加参数地执行par()将生成一个含有当前图形参数设置的列表。添加参数no.readonly=TRUE可以生成一个可以修改的当前图形参数列表。

继续我们的例子,假设你想使用实心三角而不是空心圆圈作为点的符号,并且想用虚线代替实线连接这些点。你可以使用以下代码完成修改:

  1. opar <- par(no.readonly=TRUE)
  2. par(lty=2, pch=17)
  3. plot(dose, drugA, type="b")
  4. par(opar)

结果如图3-3所示。

3.3 图形参数 - 图1

图3-3 药物A剂量和响应的折线图。修改了线条类型和点的符号

首个语句复制了一份当前的图形参数设置。第二句将默认的线条类型修改为虚线(lty=2)并将默认的点符号改为了实心三角(pch=17)。然后我们绘制了图形并还原了原始设置。线条类型和符号将在3.3.1节中详述。

你可以随心所欲地多次使用par()函数,即par(lty=2, pch=17)也可以写成:

  1. par(lty=2)
  2. par(pch=17)

指定图形参数的第二种方法是为高级绘图函数直接提供optionname=value的键值对。这种情况下,指定的选项仅对这幅图形本身有效。你可以通过代码:

  1. plot(dose, drugA, type="b", lty=2, pch=17)

来生成与上图相同的图形。

并不是所有的高级绘图函数都允许指定全部可能的图形参数。你需要参考每个特定绘图函数的帮助(如?plot?hist?boxplot)以确定哪些参数可以以这种方式设置。下面介绍可以设定的许多重要图形参数。

3.3.1 符号和线条

如你所见,可以使用图形参数来指定绘图时使用的符号和线条类型。相关参数如表3-2所示。

表3-2 用于指定符号和线条类型的参数

参  数 描  述
pch 指定绘制点时使用的符号(见图3-4)
cex 指定符号的大小。cex是一个数值,表示绘图符号相对于默认大小的缩放倍数。默认大小为1,1.5表示放大为默认值的1.5倍,0.5表示缩小为默认值的50%,等等
lty 指定线条类型(参见图3-5)
lwd 指定线条宽度。lwd是以默认值的相对大小来表示的(默认值为1)。例如,lwd=2将生成一条两倍于默认宽度的线条

选项pch=用于指定绘制点时使用的符号。可能的值如图3-4所示。

3.3 图形参数 - 图2

图3-4 参数pch可指定的绘图符号

对于符号21~25,你还可以指定边界颜色(col=)和填充色(bg=)。

选项lty=用于指定想要的线条类型。可用的值如图3-5所示。

3.3 图形参数 - 图3

图3-5 参数lty可指定的线条类型

综合以上选项,以下代码:

  1. plot(dose, drugA, type="b", lty=3, lwd=3, pch=15, cex=2)

将绘制一幅图形,其线条类型为点线,宽度为默认宽度的3倍,点的符号为实心正方形,大小为默认符号大小的2倍。结果如图3-6所示。

3.3 图形参数 - 图4

图3-6 药物A剂量和响应的折线图。修改了线条类型、线条宽度、点的符号和符号大小

接下来我们将讨论颜色的指定方法。

3.3.2 颜色

R中有若干和颜色相关的参数。表3-3列出了一些常用参数。 表3-3 用于指定颜色的参数

参  数 描  述
col 默认的绘图颜色。某些函数(如linespie)可以接受一个含有颜色值的向量并自动循环使用。例如,如果设定col=c("red", "blue")并需要绘制三条线,则第一条线将为红色,第二条线为蓝色,第三条线又将为红色
col.axis 坐标轴刻度文字的颜色
col.lab 坐标轴标签(名称)的颜色
col.main 标题颜色
col.sub 副标题颜色
fg 图形的前景色
bg 图形的背景色

在R中,可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。举例来说,col=1col="white"col="#FFFFFF"col=rgb(1,1,1)col=hsv(0,0,1)都是表示白色的等价方式。函数rgb()可基于红—绿—蓝三色值生成颜色,而hsv()则基于色相—饱和度—亮度值来生成颜色。请参考这些函数的帮助以了解更多细节。

函数colors()可以返回所有可用颜色的名称。Earl F. Glynn为R中的色彩创建了一个优秀的在线图表,参见http://research.stowers-institute.org/efg/R/Color/Chart。R中也有多种用于创建连续型颜色向量的函数,包括rainbow()heat.colors()terrain.colors()topo.colors()以及cm.colors()。举例来说,rainbow(10)可以生成10种连续的“彩虹型”颜色。多阶灰度色可使用gray()函数生成。这时要通过一个元素值为0和1之间的向量来指定各颜色的灰度。gray(0:10/10)将生成10阶灰度色。试着使用以下代码:

  1. n <- 10
  2. mycolors <- rainbow(n)
  3. pie(rep(1, n), labels=mycolors, col=mycolors)
  4. mygrays <- gray(0:n/n)
  5. pie(rep(1, n), labels=mygrays, col=mygrays)

来观察这些函数的工作方式。本章始终会有使用颜色参数的示例。

3.3.3 文本属性

图形参数同样可以用来指定字号、字体和字样。表3-4阐释了用于控制文本大小的参数。字体族和字样可以通过字体选项进行控制(见表3-5)。 表3-4 用于指定文本大小的参数

参  数 描  述
cex 表示相对于默认大小缩放倍数的数值。默认大小为1,1.5表示放大为默认值的1.5倍,0.5表示缩小为默认值的50%,等等
cex.axis 坐标轴刻度文字的缩放倍数。类似于cex
cex.lab 坐标轴标签(名称)的缩放倍数。类似于cex
cex.main 标题的缩放倍数。类似于cex
cex.sub 副标题的缩放倍数。类似于cex

  表3-5 用于指定字体族、字号和字样的参数

参  数 描  述
font 整数。用于指定绘图使用的字体样式。1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(以Adobe符号编码表示)
font.axis 坐标轴刻度文字的字体样式
font.lab 坐标轴标签(名称)的字体样式
font.main 标题的字体样式
font.sub 副标题的字体样式
ps 字体磅值(1磅约为1/72英寸)。文本的最终大小为 ps*cex
family 绘制文本时使用的字体族。标准的取值为serif(衬线)、sans(无衬线)和mono(等宽)

举例来说,在执行语句:

  1. par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)

之后创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体、2倍于默认文本大小的标题。

我们可以轻松设置字号和字体样式,然而字体族的设置却稍显复杂。这是因为衬线、无衬线和等宽字体的具体映射是与图形设备相关的。举例来说,在Windows系统中,等宽字体映射为TT Courier New,衬线字体映射为TT Times New Roman,无衬线字体则映射为TT Arial(TT代表True Type)。如果你对以上映射表示满意,就可以使用类似于family="serif"这样的参数获得想要的结果。如果不满意,则需要创建新的映射。在Windows中,可以通过函数windowsFont()来创建这类映射。例如,在执行语句:

  1. windowsFonts(
  2. A=windowsFont("Arial Black"),
  3. B=windowsFont("Bookman Old Style"),
  4. C=windowsFont("Comic Sans MS")
  5. )

之后,即可使用A、B和C作为family的取值。在本例的情境下,par(family="A")将指定Arial Black作为绘图字体。(3.4.2节中的代码清单3-2提供了一个修改文本参数的示例。)请注意,函数windowsFont()仅在Windows中有效。在Mac上,请改用quartzFonts()

如果以PDF或PostScript格式输出图形,则修改字体族会相对简单一些。1对于PDF格式,可以使用names(pdfFonts())找出你的系统中有哪些字体是可用的,然后使用pdf(file="myplot.pdf", family="fontname")来生成图形。对于以PostScript格式输出的图形,则可以对应地使用names(postscriptFonts())postscript(file="myplot.ps", family= "fontname")。请参阅在线帮助以了解更多信息。

1 PDF中文字体的使用比较麻烦,同时在Linux系统中可能会遇到中文字体无法嵌入的问题。Windows上的解决方案之一是使用Cairo包中的CairoPDF()函数。此话题的详细讨论请参考http://cos.name/cn/topic/101521。——译者注

3.3.4 图形尺寸与边界尺寸

最后,可以使用表3-6列出的参数来控制图形尺寸和边界大小。 表3-6 用于控制图形尺寸和边界大小的参数

参  数 描  述
pin 以英寸表示的图形尺寸(宽和高)
mai 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸
mar 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分*。默认值为c(5, 4, 4, 2) + 0.1

*一英分等于十二分之一英寸。——译者注

代码:

  1. par(pin=c(4,3), mai=c(1,.5, 1, .2))

可生成一幅4英寸宽、3英寸高、上下边界为1英寸、左边界为0.5英寸、右边界为0.2英寸的图形。关于边界参数的完整指南,不妨参阅Earl F. Glynn编写的一份全面的在线教程(http://research.stowers-institute.org/efg/R/Graphics/Basics/mar-oma/)。

让我们使用最近学到的选项来强化之前的简单图形示例。代码清单3-1中的代码生成的图形如图3-7所示。

代码清单3-1 使用图形参数控制图形外观

  1. dose <- c(20, 30, 40, 45, 60)
  2. drugA <- c(16, 20, 27, 40, 60)
  3. drugB <- c(15, 18, 25, 31, 40)
  4. opar <- par(no.readonly=TRUE)
  5. par(pin=c(2, 3))
  6. par(lwd=2, cex=1.5)
  7. par(cex.axis=.75, font.axis=3)
  8. plot(dose, drugA, type="b", pch=19, lty=2, col="red")
  9. plot(dose, drugB, type="b", pch=23, lty=6, col="blue", bg="green")
  10. par(opar)

首先,你以向量的形式输入了数据,然后保存了当前的图形参数设置(这样就可以在稍后恢复设置)。接着,你修改了默认的图形参数,这样,得到的图形将为2英寸宽、3英寸高。除此之外,线条的宽度将为默认宽度的两倍,符号将为默认大小的1.5倍。坐标轴刻度文本被设置为斜体、缩小为默认大小的75%。之后,我们使用红色实心圆圈和虚线创建了第一幅图形,并使用绿色填充的绿色菱形加蓝色边框和蓝色虚线创建了第二幅图形。最后,我们还原了初始的图形参数设置。

3.3 图形参数 - 图5

图3-7 药物A和药物B剂量与响应的折线图

值得注意的是,通过par()设定的参数对两幅图都有效,而在绘图函数中指定的参数仅对那个特定图形有效。观察图3-7可以发现,图形的呈现上还有一定缺陷。这两幅图都缺少标题,并且纵轴的刻度单位不同,这无疑限制了我们直接比较两种药物的能力。同时,坐标轴的标签(名称)也应当提供更多的信息。

下一节中,我们将转而探讨如何自定义文本标注(如标题和标签)和坐标轴。要了解可用图形参数的更多信息,请参阅help(par)