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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335