R语言的图形参数主要由par()函数控制,图形布局主要由layout()函数控制
图形参数
我们以如下数据为例
剂量(dose) |
对药物A的响应(drugA) |
对药物B的响应(drugB) |
20 |
16 |
15 |
30 |
20 |
18 |
40 |
27 |
25 |
45 |
40 |
31 |
60 |
60 |
40 |
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# par()函数作用是全局的,使用par()修改过的参数除非会话结束,否则将一直保留,之后画
# 的图形将一直使用修改过的参数绘制。
opar <- par(no.readonly=TRUE) # 保存原始的par参数
par(lty=3,pch=8) # 设置线型线宽
plot(dose,drugA,type='b') # 绘制图形
par(opar) # 将参数恢复为原始参数
# type='b' 表示同时绘制点和线
# type='p' 表示只绘制点
# type='l' 表示只绘制线
# type='o' 表示绘制的线穿过点
# type='c' 表示只绘制线且空出有点的地方(实际就是b模式把点去掉)
符号和线型线宽
参数 |
描述 |
默认值 |
lty |
线条类型 |
solid(即1) |
lwd |
线条宽度 |
1 |
pch |
设置绘图点和符号的类型 |
1 |
cex |
控制文字和绘图符号的大小,cex=1表示正常大小,0.8表示正常大小的80% |
1 |
# R中的线型和线宽
plot.new()
plot.window(xlim = c(0, 6), ylim = c(0, 6), ann = F, asp = 1)
int <- 0:5+0.5
abline(h = int, lty = 1:6, lwd = 1:6)
text(1, int, paste(rep("lty = ", 6), 1:6, rep(", lwd = ", 6), 1:6), pos = 3)
plot(dose,drugA,type='b',lty=3,lwd=4,pch=15,cex=3)
#绘制一幅图形,其线条类型为点线,宽度为默认宽度的4倍,点的符号为实心正方形,大小为默认符号大小的3倍
颜色
在R中,可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。举例来说,col=1、col=“white”、col="#FFFFFF"、col=rgb(1,1,1) 和 col=hsv(0,0,1) 都是表示白色的等价方式.colors()可以返回所有可用的颜色。当需要连续的颜色时,可以使用rainbow()函数来生成。
参数 |
描述 |
默认值 |
col |
默认的绘图颜色。某些函数(如lines和pie)可以接受一个含有颜色值的向量并自动循环使用。例如,如果设定col=c(“red”, “blue”)并需要绘制三条线,则第一条线将为红色,第二条线为蓝色,第三条线又将为红色 |
‘black’ |
col.axis |
坐标轴刻度文字的颜色 |
‘black’ |
col.lab |
坐标轴标签(名称)的颜色 |
‘black’ |
col.main |
标题颜色 |
‘black’ |
col.sub |
副标题颜色 |
‘black’ |
fg |
图形的前景色 |
‘black’ |
bg |
图形的背景色 |
‘white’ |
mycolors <- rainbow(5) # 参数为整数,表示要生成的颜色数量
pie(rep(1,5), labels=mycolors, col=mycolors)
mygrays <- gray(0:5/5) # 生成 5阶灰度色
pie(rep(1, 5), labels=mygrays, col=mygrays)
文本属性
控制字号,字体, 字样
参数 |
描述 |
默认值 |
cex |
控制文字和绘图符号的大小,cex=1表示正常大小,0.8表示正常大小的80% |
1 |
cex.axis |
坐标轴刻度位子的缩放倍数 |
1 |
cex.lab |
坐标轴标签(名称)的缩放倍数 |
1 |
cex.main |
主标题文字缩放倍数 |
1.2 |
cex.sub |
副标题的缩放倍数 |
1 |
font |
整数。用于指定绘图使用的字体样式。1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(以Adobe符号编码表示) |
1 |
font.axis |
坐标轴刻度文字的字体样式 |
1 |
font.lab |
坐标轴标签的字体 |
1 |
font.main |
主标题的字体 |
2 |
font.sub |
副标题的字体样式 |
1 |
ps |
字体磅值(1磅约为1/72英寸).文本的最终大小为 ps*cex |
12 |
family |
绘制文本时使用的字体族。标准的取值为serif(衬线)、sans(无衬线)和mono(等宽) |
‘’ |
plot(dose,drugA,type='b',font.lab=2, cex.lab=1.5) # 坐标轴标签字体斜体且放大1.5倍
text(dose-1,drugA+1,drugA,cex=0.8, font=4) # 添加文本
图形尺寸和边界尺寸
参数 |
描述 |
默认值 |
pin |
数值型向量c(宽,高),以英寸表示的图形尺寸 |
(5.4,4.8) |
mai |
数值型向量 c(底部,左侧,上方,右侧),设置图形边距大小,单位英寸 |
c(1,0.8,0.8,0.4)+0.02 |
mar |
数值型向量 c(底部,左侧,上方,右侧),设置图形边距大小,单位英分 |
c(5, 4, 4, 2) + 0.1 |
opar <- par(no.readonly=TRUE)
par(pin=c(2, 3),mfcol=c(1,2))
par(lwd=2, cex=1.5)
par(cex.axis=.75, font.axis=3)
plot(dose, drugA, type="b", pch=19, lty=2, col="red")
plot(dose, drugB, type="b", pch=23, lty=6, col="blue", bg="green")
par(opar)
添加文本,自定义坐标轴和图例
参数 |
描述 |
默认值 |
ann |
控制高水平绘图函数的主标题和坐标轴标题注释,若ann=FALSE,将不显示这些注释 |
TRUE |
side |
一个整数,表示在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右) |
|
at |
一个数值型向量,表示需要绘制刻度线的位置 |
|
labels |
一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值 |
|
pos |
坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值) |
|
las |
标签是否平行于(=0)或垂直于(=2)坐标轴 |
0 |
tck |
刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为-0.01) |
|
xaxt |
设置x轴类型,xaxt=“n” 表示没有坐标轴,取其它值都会画出坐标轴 |
s |
yaxt |
设置y轴类型,同上 |
s |
plot(dose, drugA, type="b",
col="red", lty=2, pch=2, lwd=2,
main="Clinical Trials for Drug A", # 主标题
sub="This is hypothetical data", # 副标题
xlab="Dosage", ylab="Drug Response", # x,y轴标签
xlim=c(0, 60), ylim=c(0, 70)) # x,y轴的范围
在高级绘图函数中,都是自带坐标轴标题等属性的。如果想自定义,就要使用ann=FALSE 来禁用坐标轴注释
x <- c(1:10)
y <- x
z <- 10/x
opar <- par(no.readonly=TRUE)
par(mar=c(5, 4, 4, 8) + 0.1) # 设置边界大小
plot(x, y, type="b",
pch=21, col="red", # 设置符号类型及线颜色
yaxt="n", lty=3, ann=FALSE) # 关闭坐标轴及坐标轴注释
lines(x, z, type="b", pch=22, col="blue", lty=2) # 绘制 z线
axis(2, at=x, labels=x, col.axis="red", las=2) # 绘制自定义x 轴
axis(4, at=z, labels=round(z, digits=2), # 绘制自定义y轴
col.axis="blue", las=2, cex.axis=0.7, tck=-.01)
mtext("y=1/x", side=4, line=3, cex.lab=1, las=2, col="blue") #坐标轴标签
title("An Example of Creative Axes", # 标题
xlab="X values",
ylab="Y=X")
par(opar)
# 参考线
abline(h=c(1,2,3), v=(4,5,6))
# 在y轴1,2,3处,x轴4,5,6处添加参考线
# 图例
legend(location,title,legend....)
参数 |
描述 |
location |
有许多方式可以指定图例的位置。你可以直接给定图例左上角的x、y坐标,也可以执行locator(1),然后通过鼠标单击给出图例的位置,还可以使用关键字bottom、bottomleft、left、topleft、top、topright、right、bottomright或center放置图例。如果你使用了以上某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘图区域大小的分数表示) |
title |
图例标题的字符串(可选) |
legend |
图例标签组成的字符型向量 |
… |
其他选项。如果图例标示的是颜色不同的线条,需要指定col=加上颜色值组成的向量。如果图例标示的是符号不同的点,则需指定pch=加上符号的代码组成的向量。如果图例标示的是不同的线条宽度或线条类型,请使用lwd=或lty=加上宽度值或类型值组成的向量。要为图例创建颜色填充的盒形(常见于条形图、箱线图或饼图),需要使用参数fill=加上颜色值组成的向量 |
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40) # 输入数据
opar <- par(no.readonly=TRUE) # 保存原始参数
par(lwd=2, cex=1.5, font.lab=2) # 设置线宽, 放大1.5倍, 坐标轴标签字体 粗体
plot(dose, drugA, type="b",
pch=15, lty=1, col="red", ylim=c(0, 60), # 设置符号类型,线型, 颜色, y轴取值范围
main="Drug A vs. Drug B", # 主标题
xlab="Drug Dosage", ylab="Drug Response")
text(dose-1, drugA+1.8, drugA, col='red',cex=0.5,font=2) # 添加文本
text(dose, drugB-2, drugB, col='blue',cex=0.5,font=2) # 添加文本
lines(dose, drugB, type="b",
pch=17, lty=2, col="blue")
abline(h=c(30), lwd=1.5, lty=2, col="gray") # 参考线
library(Hmisc) # 载入包
minor.tick(nx=3, ny=3, tick.ratio=0.5) # 添加次要刻度线
legend("topleft", inset=.05, title="Drug Type", c("A","B"), # 图例
lty=c(1, 2), pch=c(15, 17), col=c("red", "blue"))
par(opar)
text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。
参数 |
描述 |
location |
文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置 |
pos |
文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示 |
side |
指定用来放置文本的边。1=下,2=左,3=上,4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对齐 |
text(lacation, “text”, pos,…)
mtext(“text”, side, line=n,…)
图形布局
使用layout()函数可以很容易的绘制出不同布局的拼图。
layout(mat,widthhs=rep.int(1,ncol(mat)), height=rep.int(1,nrow(mat)), respect=FALSE)
参数 |
描述 |
mat |
矩阵,描述绘图环境,比如matrix(c(1,2,3,3),nrow=2,ncol=2,byrow=TRUE)表示见绘图区域分割成2行2列,按列填充。第三张图占据整个第二行,前两张图平分第一行 |
widths |
向量,分割区域宽度,widths=(2,1)表示绘图区宽度按照2:1划分 |
heights |
向量,分割区域高度,heights=(3,1)表示绘图区高度按照3:1划分 |
# 在par()函数中使用图形参数 mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。
# nfcol=c(nrows, ncols)按列填充矩阵
attach(mtcars)
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt,mpg, main="Scatterplot of wt vs. mpg")
plot(wt,disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")
par(opar)
detach(mtcars)
# layout()函数
layout(matrix(c(1,2,3,3), nrow=2, ncol=2), widths=c(2,1)) # 设置布局 2行2列 默认列填充, 第三幅图占据3,4号位,且宽度是1,2的1/2
opar <- par(no.readonly=TRUE)
par(mai=c(0.6,0.6,0.1,0.1),cex=0.7) # 设置图形边距及缩放0.7
x <- rnorm(5000) # 生成5000个标准正态分布的随机数
y <- rchisq(5000, 10) # 生成5000个卡方分布的随机数
hist(x, prob=TRUE, col='lightblue', # x 的直方图,
xlab='x', ylab='Density', # 设置坐标轴注释
ylim=c(0,0.4),main="") # 设置y轴范围,禁用主标题
hist(y, freq=FALSE, col='pink', xlab="y", ylab='Density', main="")
boxplot(x, col='red', lwd=1)
par(opar)
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths=c(3, 1), heights=c(1, 2)) # 第二行高度是第一行的2倍,第三幅图的宽度是第二幅图的 1/3
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
# 更精细的控制图形,可以使多张图组合成一张有实际意义的图形
# 利用 fig= 参数来精确的控制绘图,参数fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量
# 想想绘图区域是一个宽为 1 ,高为 1 的矩形,则x1, x2, y1, y2的范围就是[0,1]
# fig= 默认 会新建一幅图形,所以在添加一幅图到一幅现有图形上时,请设定参数new=TRUE。
opar <- par(no.readonly=TRUE)
par(fig=c(0, 0.8, 0, 0.8)) # 设置散点图范围
plot(mtcars$mpg, mtcars$wt, # 散点图
xlab="Miles Per Gallon",
ylab="Car Weight")
par(fig=c(0, 0.8, 0.5, 1), new=TRUE) # 设置上方箱线图范围,宽于散点图一致,高度范围在0.5-1,。
boxplot(mtcars$mpg, horizontal=TRUE, axes=FALSE) # 上方添加箱线图, 禁用坐标轴
par(fig=c(0.6, 1, 0, 0.8), new=TRUE) # 设置右边箱线图,高度与散点图一直,宽度范围在0.6-1.
boxplot(mtcars$wt, axes=FALSE) # 右边添加箱线图,禁用坐标轴
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)
par(opar)