R语言实战—2

图形初阶

pdf("mygraph.pdf")      
 attach(mtcars)       #绑定了数据框mtcars
 plot(wt, mpg)             #绘制散点图
 abline(lm(mpg~wt))      #向图形添加了一条最优拟合曲线
 title("Regression of MPG on Weight")      #添加了标题
 detach(mtcars)      #为数据框解除了绑定
dev.off()

通过执行如plot()、hist()(绘制直方图)或boxplot()这样的高级绘图命令来创建一幅新图形时,通常会覆盖掉先前的图形。如何才能创建多个图形并随时查看每一个呢?
dev.new()
statements to create graph 1
dev.new()
statements to create a graph 2
etc.

plot(x, y, type="b")将x置于横轴,将y置于纵轴,绘制点集(x, y),然后使用线段将其连接。选项type="b"表示同时绘制点和线。

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

opar <- par(no.readonly=TRUE)        #复制了一份当前的图形参数设置
par(lty=2, pch=17)        #将默认的线条类型修改为虚线(lty=2),并将默认的点符号改为了实心三角(pch=17)
plot(dose, drugA, type="b")        
par(opar)        #还原了原始设置

第二种方法是为高级绘图函数直接提供optionname=value的键值对。这种情况下,指定的选项仅对这幅图形本身有效:plot(dose, drugA, type="b", lty=2, pch=17)


可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。举例来说,col=1、col="white"、col="#FFFFFF"、col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色的等价方式。



3-1 使用图形参数控制图形外观
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(pin=c(2, 3))        #修改了默认的图形参数:2英寸宽、3英寸高
par(lwd=2, cex=1.5)      #线条的宽度将为默认宽度的两倍,符号将为默认大小的1.5倍
par(cex.axis=.75, font.axis=3)      #坐标轴刻度文本被设置为斜体、缩小为默认大小的75%
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)

某些高级绘图函数已经包含了默认的标题和标签。你可以通过在plot()语句或单独的par()语句中添加ann=FALSE来移除它们。
可以使用title()函数为图形添加标题和坐标轴标签。调用格式为:title(main="main title", sub="subtitle",xlab="x-axis label", ylab="y-axis label")
举例来说,以下代码将生成红色的标题和蓝色的副标题,以及比默认大小小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)

可以使用函数axis()来创建自定义的坐标轴,其格式为:
axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)

创建自定义坐标轴时,你应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt="n"yaxt="n"将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。

3-2 自定义坐标轴的示例
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)    #添加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")
par(opar)

创建次要刻度线,需要使用Hmisc包中的minor.tick()函数。
library(Hmisc)
minor.tick(nx=n, ny=n, tick.ratio=n)
其中nx和ny分别指定了X轴和Y轴每两条主刻度线之间通过次要刻度线划分得到的区间个数。tick.ratio表示次要刻度线相对于主刻度线的大小比例。当前的主刻度线长度可以使用par("tck")获取。举例来说,下列语句将在X轴的每两条主刻度线之间添加1条次要刻度线,并在Y轴的每两条主刻度线之间添加2条次要刻度线:
minor.tick(nx=2, ny=3, tick.ratio=0.5)
次要刻度线的长度将是主刻度线的一半。

abline()可以用来为图形添加参考线。abline(h=yvalues, v=xvalues)
legend()添加图例。legend(location, title, legend, ...)

3-3 
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 Dosage", 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")      #添加参考线
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()将文本添加到图形上。text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。
text(location, "text to place", pos, ...)
mtext("text to place", side, line=n, ...)

#展示不同字体族
opar <- par(no.readonly=TRUE)
par(cex=1.5)
plot(1:7,1:7,type="n")
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)

除了用来添加文本标注以外,text()函数也通常用来标示图形中的点。
只需指定一系列的x、y坐标作为位置参数,同时以向量的形式指定要放置的文本。
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")
detach(mtcars)

使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形。
par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。另外,可以使用mfcol=c(nrows, ncols)按列填充矩阵。
layout()的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。

#创建四幅图形并将其排布在两行两列中
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)

#依三行一列排布三幅图形
attach(mtcars)
opar <- par(no.readonly=TRUE)
par(mfrow=c(3,1))
hist(wt)     
#高级绘图函数hist()包含了一个默认的标题(使用main=""可以禁用它,抑或使用ann=FALSE来禁用所有标题和标签)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)

#layout()
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()来指定。

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)
#再次将一幅图形置于第1行,两幅图形置于第2行。
#但第1行中图形的高度是第2行中图形高度的二分之一。
#除此之外,右下角图形的宽度是左下角图形宽度的三分之一
3-4 多幅图形布局的精细控制
opar <- par(no.readonly=TRUE)
par(fig=c(0, 0.8, 0, 0.8))       #fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。
plot(mtcars$wt, mtcars$mpg,xlab="Miles Per Gallon",ylab="Car Weight")
par(fig=c(0, 0.8, 0.55, 1), new=TRUE)
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE)   #在上方添加箱线图
par(fig=c(0.65, 1, 0, 0.8), new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)     #在右侧添加箱线图
mtext("Enhanced Scatterplot", side=3, outer=TRUE, line=-3)
par(opar)

fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。


第一个fig=将散点图设定为占据横向范围0-0.8,纵向范围0-0.8。上方的箱线图横向占据0-0.8,纵向0.55-1。右侧的箱线图横向占据0.65-1,纵向0-0.8。
fig=默认会新建一幅图形,所以在添加一幅图到一幅现有图形上时,请设定参数new=TRUE。

你可能感兴趣的:(R语言实战—2)