[R语言]Chapter 3 基本图形绘制
3.1 使用图形
#绑定数据框mtcars
plot(wt,mpg) #打开一个图形窗口并生成了一幅散点图,横轴表示车身重量,纵轴为每加仑汽油行驶的英里数
abline(lm(mpg~wt)) #向图形添加了一条最优拟合曲线
title("Regression of MPG on Weight") #添加标题
detach(mtcars) #为数据框解除了绑定
在主控制台不报错,在代码区就报错...
3.2 一个简单的例子
drugA <- c(16,20,27,40,60)
drugB <- c(15,18,25,31,40)
plot(dose,drugA,type = "b")#type="b"表示同时绘制点和线
help("plot")
#type
#what type of plot should be drawn. Possible types are
#"p" for points,
#"l" for lines,
#"b" for both,
#"c" for the lines part alone of "b",
#"o" for both ‘overplotted’,
#"h" for ‘histogram’ like (or ‘high-density’) vertical lines,
#"s" for stair steps,
#"S" for other steps, see ‘Details’ below,
#"n" for no plotting.</pre>
plot()是R中为对象作图的一个泛型函数(它的输出将根据绘制对象类型的不同而变化)。本例中,plot(x,y,type="b")将x置于横轴,将y置于纵轴,绘制点集(x,y),然后使用线段将其连接。type="b"表示同时绘制点和线。
3.3 图形参数
我们可以通过修改称为图形参数的选项来自定义一幅图形的多个特征(字体,颜色,坐标轴,标签)。
一种方法是通过函数par()来指定这些选项。以这种方式设定的参数值除非被再次修改,否则将在会话结束前一直有效。调用格式为par(optionname=value,optionname=name,...)。不加参数地执行par()将生成一个含有当前图形参数设置的列表。添加参数no.readonly=TRUE可以生成一个可以修改的当前图形参数列表。
#修改图形参数:点由空心圆圈变成实心三角形,实线变成虚线,阿拉伯数字与图形的对应关系见下文
opar <- par(no.readonly = TRUE) #修改默认的图形参数
par(lty=2,pch=17)
plot(dose,drugA,type = "b")#在代码区运行不改变,在主控制台运行改变
另一种方法是为高级绘图函数直接提供optionname=value的键值对,这种情况下,指定的选项仅对这幅图形本身有效。
并不是所有的高级绘图函数都允许指定全部可能的图形参数。你需要参考每个特定绘图函数的帮助(如?plot,?hist或?boxplot)以确定哪些参数可以以这种方式设置。
3.3.1 符号和线条
pch 指定绘制点时使用的符号,见图3-4
cex 指定符号的大小。cex是一个数值,表示绘图符号相对于默认大小的缩放倍数。默认大小为1,1.5表示放大为默认值的1.5倍,0.5表示缩小为默认值的50%等等。
lty 指定线条类型,见图3-5
lwd 指定线条宽度。lwd是以默认值的相对大小来表示的(默认值为1),如lwd=2将生成一条两倍于默认宽度的线条。</pre>
a.png
对于符号21-25,你还可以指定边界颜色(col=)和填充色(bg=)。
b.pnglty=用于指定想要的线条类型。
综上:
plot(dose,drugA,type = "b",lty=3,lwd=3,pch=15,cex=2)
绘制一幅线条类型为点线,宽度为默认宽度的3倍,点的符号为实心正方形,大小为默认符号大小的2倍。
3.3.2 颜色
col 默认的绘图颜色,某些函数(如lines和pie)可以接受一个含有颜色值的向量并自动循环使用。例如,如果设定col=c("red","blue")并需要绘制三条线,则第一条线将为红色,第二条线为蓝色,第三条线又将为红色。
col.axis 坐标轴刻度文字的颜色
col.lab 坐标轴标签(名称)的颜色
col.main 标题颜色
col.sub 副标题颜色
fg 图形的前景色
bg 图形的背景色
在R中,可以通过颜色下标、颜色名称、十六进制的颜色值,RGB值或HSV值来指定颜色。举例来说,col=1,col="white",col="#FFFFFF",col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色的等价方式。函数rgb()可基于红-绿-蓝三色生成颜色,而hsv则基于色相-饱和度-亮度值来生成颜色。
3.3.3 文本属性
图形参数同样可以用来指定字号、字体和字样。
cex 表示相对于默认大小缩放倍数的数值。默认大小为1,1.5表示放大为默认值的1.5倍,0.5表示缩小为默认值的50%。
cex.axis 坐标轴刻度文字的缩放倍数,类似于cex
cex.lab 坐标轴标签(名称)的缩放倍数,类似于cex
cex.main 标题的缩放倍数,类似于cex
cex.sub 副标题的缩放倍数,类似于cex
font 整数。用于指定绘图使用的字体样式,1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体。
font.axis 坐标轴刻度文字的字体样式
font.lab 坐标轴标签(名称)的字体样式
font.main 标题的字体样式
font.sub 副标题的字体样式
ps 字体磅值,文本的最终大小为ps*cex
family 绘制文本时使用的字体族。标准的取值为serif(衬线),sans(无衬线),mono(等宽)
##之后创建的所有图形都将拥有斜体,1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体,2倍于默认文本大小的标题。待验证???
par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)</pre>
3.3.4 图形尺寸与边界尺寸
用于控制图形尺寸和边界大小的参数
pin 以英寸表示的图形尺寸(宽和高)
mai 以数值向量表示的边界大小,顺序为"下、左、上、右",单位为英寸
mar 以数值向量表示的边界大小,顺序为"下、左、上、右",单位为英寸
#可生成一幅4英寸宽、3英寸高、上下边界为1英寸,左边界为0.5英寸、右边界为0.2英寸的图形。
par(pin=c(4,3),mai=c(1,.5,1,.2))
使用图形参数控制图形外观
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) ##no.readonly logical; if TRUE and there are no other arguments, only parameters are returned which can be set by a subsequent par() call on the same device.
par(pin=c(2,3)) #修改默认的图形参数,2英寸宽、3英寸高
par(lwd=2,cex=1.5) #线条宽度为默认的两倍,符号为默认的1.5倍
plot(dose,drugA,type = "b",pch=19,lty=2,col="red") #坐标轴刻度文本被设置为斜体,缩小为默认大小的75%,之后使用红色实心圆圈和虚线创建了第一幅图形
plot(dose,drugB,type = "b",pch=23,lty=6,col="blue",bg="green") #使用绿色填充的绿色菱形加蓝色边框和蓝色虚线创建了第二幅图形,最后还原了初始的图形参数设置
par(opar)
上述通过par()设定的参数对两幅图都有效,而在plot()函数中指定的参数仅对那个特定图形有效。
3.4 添加文本、自定义坐标轴和图例
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 = "Doseage",ylab = "Drug Response",
xlim = c(0,60),ylim = c(0,70))
某些高级绘图函数已经包含了默认的标题和标签,你可以通过在plot()语句或单独的par()语句中添加ann=FALSE来移除它们。
3.4.1 标题
可以使用title()函数为图形添加标题和坐标轴标签。
#title()可指定其他图形参数(如文本大小、字体、旋转角度和颜色),以下将生成红色的标题和蓝色的副标题,以及比默认大小小25%的绿色x轴、y轴标签。
title(main = "My title",col.main="red",sub = "My subtitle",col.sub="blue",
xlab = "My X label",ylab = "My Y label",
col.lab="green",cex.lab=0.75)
函数title()一般来说被用于添加信息到一个默认标题和坐标轴标签被ann=FALSE选项移除的图形中。
3.4.2 坐标轴
你可以使用函数axis()来创建自定义的坐标轴,而非使用R中默认的坐标轴。
格式为:
axis(side,at=,labels=,pos=,lty=,col=,las=,tck=,...)
坐标轴选项
side 一个整数,表示在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右)
at 一个数值型向量,表示需要绘制刻度线的位置
labels 一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值)
pos 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)
lty 线条类型
col 线条和刻度线颜色
las 标签是否平行于(=0)或垂直于(=2)坐标轴
tck 刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为-0.01
创建自定义坐标轴时,你应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt="n"和yaxt="n"将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)
自定义坐标轴的示例
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) #绘制x对y的图形
lines(x, z, type = "b", pch=22, col="blue", lty=2) #添加x对1/x的直线
axis(2,at=x,labels = x,col.axis="red",las=2)
axis(4,at=z,labels = round(z,digits = 2),
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") #添加文本和标题,其中函数mtext()用于在图形的边界添加文本。
par(opar)
3.4.3 参考线
函数abline()可以用来为图形添加参考线
#在y为1,5,7的位置添加了水平实线
abline(h=c(1,5,7))
#在x为1,3,5,7,9的位置添加了垂直的蓝色虚线
abline(v=seq(1,10,2),lty=2,col="blue")
3.4.4 图例
使用函数legend()来添加图例。
图例选项
location 有许多方式可以指定图例的位置,你可以直接给定图例左上角的x,y坐标,也可以执行locator(1),然后通过鼠标单击给出图例的位置,还可以使用关键词bottom,bottomleft,left,topleft,top,topright,right,bottomright或center放置图例。如果你使用了以上某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小
title 图例标题的字符串
legend 图例标签组成的字符型向量
... 其他选项,如果图例标示的是颜色不同的线条,需要指定col=加上颜色值组成的向量。如果图例标示的是符号不同的点,则需指定pch=加上符号的代码组成的向量。如果图例标示的是不同的线条宽度或线条类型,请使用lwd=或lty=加上宽度值或类似值组成的向量。要为图例创建颜色填充的盒形(常见于条形图,箱线图或饼图),需要使用参数fill=加上颜色值组成的向量。
其他常用的图例选项包括用于指定盒子样式的bty、指定背景色的bg,指定大小的cex,以及指定文本颜色的text.col。指定horiz=TRUE将会水平放置图例,而不是垂直放置。关于图例的细节,可以参考help(legend)。
#示例,依赖量对比药物A和药物B的响应情况
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) #增加线条、文本、符号、标签的宽度或大小
plot(dose,drugA,type = "b",
pch=15,lty=1,col="red",ylim = c(0,60),
main = "Drug A vs. Drug B",
xlab = "Drug Doseage",ylab = "Drug Response")
lines(dose,drugB,type = "b",
pch=17,lty=2,col="blue")
abline(h=c(30),lwd=1.5,lty=2,col="gray") #绘制图形
legend("topleft",inset = .05,title = "Drug Type",c("A","B"),
lty=c(1,2),pch=c(15,17),col=c("red","blue")) #添加图例
3.4.5 文本标注
我们可以通过函数text()和mtext()将文本添加到图形上,text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。
使用格式:
text(location,"text to place",pos,...)
mtext("text to place",side,line=n,...)
函数text()和mtext()的选项
locatioin 文本的位置参数,可为一对x、y坐标,也可通过指定 location为locator(1)使用鼠标交互式地确定摆放位置
pos 文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示
side 指定用来放置文本的边。1=下,2=左,3=上,4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可以使用adj=0将文本向左下对齐,或使用adj=1右上对齐
其他常用的选项有cex,col和font(分别用来调整字号、颜色和字体样式)。text()也通常用来标示图形中的点,只需要指定一系列x,y坐标作为位置参数,同时以向量的形式指定要放置的文本。
#示例
attach(mtcars)
plot(wt,mpg,
main = "Mileage vs. Car Weight",
xlab = "Weight",ylab = "Mileage",
pch=18,col="blue")
text(wt,mpg,
row.names(mtcars),
cex = 0.6,pos = 4,col = "red") #函数text()被用来在各个数据点右侧添加车辆型号,各点的标签大小被缩小了40%,颜色为红色。
detach(mtcars)
#展示不同字体族的示例
opar <- par(no.readonly = TRUE)
par(cex=1.5)
plot(1:7,1:7,type = "n") #type="n",意味no plotting
text(3,3,"Example of default text")
text(4,4,family="mono","Example of mono-spaced text")
text(5,5,family="serif","Example of serif text")
par(opar)
3.5 图形的组合
在R中使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形。
可以在par()函数中使用图形参数mfrow=c(nrows,ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵,还可以使用mfcol=c(nrows,ncols)按列填充矩阵。
#创建四幅图形并将其排布在两行两列
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow=c(2,2)) #设置排列方式,按行填充,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)
#示例二,三行一列排布
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow=c(3,1))
hist(wt) #高级绘图函数hist()包含了一个默认的标题(使用main=""可以禁用它,抑或使用ann=F来禁用所有标题和标签)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)
函数layout()的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
#一幅图被置于第1行,另外两幅图被置于第2行。
attach(mtcars)
layout(matrix(c(1,1,2,3),2,2,byrow = TRUE)) #位置关系未搞懂
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数,其形式为:
widths=各列宽度值组成的一个向量
heights=各列高度值组成的一个向量
相对宽度可以直接通过数值指定,绝对宽度可以通过函数lcm()来指定。
#一幅图形置于第1行,两幅图形置于第2行,第1行图形的高度是第2行图形高度的1/2,右下角图形的宽度是左下角图形宽度的1/3,高度和宽度是相对于整体的图形来说的。
attach(mtcars)
layout(matrix(c(1,1,2,3),2,2,byrow = TRUE),widths = c(3,1),heights = c(1,2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
图形布局的精细控制
使用fig=完成对图形布局的精细控制。
c.png多幅图形布局的精细控制,位置参数不是很懂???
#边界上添加了两幅箱线图的散点图
opar <- par(no.readonly = TRUE)
par(fig=c(0,0.8,0,0.8))#将散点图设定为占据横向范围0.8,纵向范围0.8
plot(mtcars$wt,mtcars$mpg,
xlab = "Miles Per Gallon",
ylab = "Car Weight") #设置散点图
par(fig=c(0,0.8,0.55,1),new=TRUE) #上方箱线图横向占据0-0.8,纵向0.55-1
boxplot(mtcars$wt,horizontal = TRUE,axes=FALSE)#在上方添加箱线图
par(fig=c(0.65,1,0,0.8),new=TRUE)#右侧箱线图横向占据0.65-1,纵向0-0.8
boxplot(mtcars$mpg,axes=FALSE) #右侧添加箱线图
mtext("Enhanced Scatterplot",side = 3,outer = TRUE,line = -3)
par(opar)