图形的创建与保存
图形的优势:有助于从庞杂的数据中洞察潜在的关系和本质,提取出不易发现的模式。
R允许在交互式会话中逐条输入语句构建图形、逐步完善图形特征。
attach(mtcars) #绑定R固有的数据框
plot(wt,mpg) #打开一个图形窗口并生成车身重量(x)与每加仑汽油行驶公里数的散点图
abline(lm(mpg~wt)) # 向图形添加一条最优拟合曲线
title("regression of mpg on weight")#为图形添加标题
detach(mtcars) #解绑
保存图形方法:
- 代码:将绘图语句夹在开启目标图形设备的语句和关闭目标图形设备的语句之间即可。
pdf("mygraph.pdf") #开启
attach(mtcars) #绑定R固有的数据框
plot(wt,mpg) #打开一个图形窗口并生成车身重量(x)与每加仑汽油行驶公里数的散点图
abline(lm(mpg~wt)) # 向图形添加一条最优拟合曲线
title("regression of mpg on weight")#为图形添加标题
detach(mtcars) #解绑
dev.off() #关闭
图形也可以保存为其他格式,使用不同函数,如:win.metafile()、png(),jpeg().bmp(),tiff() ,xfig() ,postscript()
- 图形用户界面:“文件”→“另存为”
创建多幅图而避免覆盖:执行plot(),hist(),boxplot()这样的高级绘图命令会在创建一幅新图形时覆盖之前的图形。
dev.new() #创建前打开一个新的图形窗口
statements to create graph1
dev.new()
statements to create graph2
也可以在图形用户界面查看多个图形:历史(history)→记录(recording),“上一个”(previous)→“下一个(next)”
自定义图形参数
R允许对图形的高度定制,自主定义图形的各种参数,来调整图形的外观
dose<-c(20,30,40,45,60)
drugA<-c(16,20,27,40,60)
drugB<-c(15,18,25,31,40)
#绘制描述药物A剂量与响应关系的图形
plot(dose,drugA,type="b")
# plot(x,y,type="b")将x置于横轴,y置于纵轴,绘制点集(x,y),使用线段(即type="b",同时绘制点和线)
#help(plot)可以查看plot相关选项
修改图形参数的方法:
①函数par()指定相应选项。调用格式:par(optionname=value,optionname=name,……)
不加参数执行par()会生成一个含有当前图形参数设置的列表;添加参数no.readonly=TRUE会生成一个可以修改的当前图形参数列表。
opar<-par(no.readonly=TRUE) #存储初始设置,opar即original par
par(lty=2,pch=17) #也可分开写
par(opar) # 恢复初始设置
②为高级绘图函数直接提供optionname=value的键值对,指定的选项将会仅对这幅图形本身有效
plot(dose,drugA,type="b",lty=2,pch=17)
#?plot或者?hist、?boxplot可以查看对于特定绘图函数可以直接指定图形参数的范围
符号&线条
- 选项pch=:
其中符号21-25,还可以指定边界颜色(col=)和填充色(bg=) - 选项lty=:指定想要的线条类型
plot(dose,drugA,type="b",lty=3,lwd=3,pch=15,cex=2)
颜色
R中指定颜色的方法多种:颜色下标、颜色名称、十六进制颜色值、RGB值或HSV值
如白色:
col=1
col="white"
col="#FFFFFF"
col=rgb(1,1,1) #基于红-绿-蓝三色值生成颜色
col=hsv(0,0,1)#基于色相-饱和度-亮度值生成颜色
colors() #返回所有可用颜色的名称
> rainbow(10) #生成10种连续的彩虹色
[1] "#FF0000" "#FF9900" "#CCFF00"
[4] "#33FF00" "#00FF66" "#00FFFF"
[7] "#0066FF" "#3300FF" "#CC00FF"
[10] "#FF0099"
> gray(0:10/10) #生成10阶灰度色
[1] "#000000" "#1A1A1A" "#333333"
[4] "#4D4D4D" "#666666" "#808080"
[7] "#999999" "#B3B3B3" "#CCCCCC"
[10] "#E6E6E6" "#FFFFFF"
> n <- 10
> mycolors <- rainbow(n)
> pie(rep(1,n),labels = mycolors,col=mycolors)
> mygray <- gray(0:n/n)
> pie(rep(1,n),labels=mygray,col=mygray)
R中有多种创建连续型颜色向量的函数:rainbow(), heat.colors(),terrain.colors(), topo.colors(), cm.colors()
文本属性
指定文本大小的参数:
指定字体族和字样的参数:
在Windows中可以通过函数windowsFont()(这个函数仅在Windows上有效)创建有关字体族的新映射:
windowsFonts(
A=windowsFont("Arial Black"),
B=windowsFont("Bookman Old Style"),
C=windowsFont("Comic Sans MS")
)
names(pdfFonts()):输出系统中的可用字体
生成图形:pdf(file=“myplot.pdf”,family=“fontname”)
par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)
图形尺寸和边界尺寸
par(pin=c(4,3),mai=c(1,.5,1,.2))
#生成一幅4*3(英寸)的图形,上下边界均为1英寸,左右边界分别为0.5英寸和0.2英寸。
#标注文本和标题
一些高级绘图函数支持自行设定坐标轴和文本标注选项。
参数:
标题 main
副标题 sub
坐标轴标签 xlab ylab
坐标轴范围xlim、ylim
plot(dose,drugA,type="b",
col="red",lty=2,pch=2,lwd=2,
main="clinical trials for drugA",
sub="this is hypothetical data",
xlab="dosage",ylab="drug response",
xlim=c(0,60),ylim=c(0,70))
部分高级绘图函数包含默认的标题和标签,可以在plot()语句或单独的par()语句中添加参数ann=FALSE移除。
标题
函数title():添加标题和坐标轴标签,指定如文本大小 字体 旋转角度 颜色等参数
title(main="main title",col.main="red",
sub="sub-title",col.sub="blue",
xlab="x-axis label",ylab="y-axis label",
col.lab="green",cex.lab=0.75)
坐标轴
函数axis():创建自定义坐标轴
axis(side,at=,labels=,pos=,lty=,col=,las=,tck=,…)
【注意】高级绘图函数会自动生成坐标轴,如果要自定义,应当设置参数axes=FALSE,来禁用全部坐标轴(以及坐标轴框架线,除非设置frame.plot=TRUE)
函数lines():可以为一幅现有图形添加新的图形元素
函数mtext():可以在图形的边界添加文本
#综合示例
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-z图线
lines(x,z,type="b",pch=22,col="blue",lty=2)
#自主绘制坐标轴
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:次要刻度线相对于主刻度线的大小比例
参考线
函数abline():为图形添加参考线
abline(h=yvalues,v=xvalues)
abline(h=c(1,5,7)) #在y为1,5,7的位置添加水平实线
abline(v=seq(1,10,2),lty=2,col="blue")
图例
使用情境:图形中包含的数据不止一组,图例可以标注每个图形属于哪一类数据。
函数legend(): legend(location,title,legend,…)
其它选项:包括指定盒子样式的bty,指定背景色的bg,指定大小cex,指定文本颜色text.col,指定horiz=TRUE则水平放置图例。(使用help(legend)可以查看)
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="drugA vs. drugB",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=0.02,title="drug type",c("A","B"),cex=0.5,lty = c(1,2),pch=c(15,17),col=c("red","blue"))
par(opar)
【结果】
文本标注
一般文本
用途:向图形本身添加文本
函数text():可向绘图区域内部添加文本
格式 text(location,“text to place”, pos,…)
函数mtext():可向图形的四个边界之一添加文本
格式 mtext(“text to place”,side,line=n,…)
其他选项:cex(字号),col(颜色),font(字体样式)
#示例:文本标注
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") #在每个数据点右侧(pos=4)添加车辆型号,标签大小缩小为默认字号的0.6
detach(mtcars)
#示例:不同字体族
opar<-par(no.readonly=TRUE)
par(cex=1.5) #字号放大为默认大小的1.5倍以便于辨认
plot(1:7,1:7,type="n")
text(3,3,"example of default text")
#family=参数选项用于指定字体族
text(4,4,family="mono","example of mono-spaced text")
text(5,5,family="serif","example of serif text")
par(opar)
数学符号表注
demo(plotmath)
函数plotmath():可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。
图形组合
用途:将多幅图形组合为一幅图形,以便于同时比较、更好洞察数据本质。
函数par():使用参数mfrow=c(nrows,ncols)创建按行填充且行数为nrows、列数为ncols的图形矩阵。nfcol=c(nrows,ncols)按列填充。
#示例1
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)
注:高级绘图函数hist()包含一个默认标题,可以使用main=" "或ann=FALSE来禁用。
#示例2
attach(mtcars)
opar<-par(no.readonly=TRUE)
par(mfrow=c(3,1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)#恢复默认参数
detach(mtcars)
函数layout():layout(mat),控制最终图形中的子图数量位置和相对大小。
mat是一个矩阵,指定了所要组合的多个图形的所在位置
#示例
attach(mtcars)
layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
#解释:2*2矩阵,按行排列,第一个位置和第二个位置均为第一个图形,第三个位置放第二个图形,第四个位置放第三个图形
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))
#解释:widths=c(3,1)表示第一幅:第二幅宽度=3:1,即1/4width:3/4width(图形窗口宽度);height同理
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
终极武器:help(layout)
图形布局的精细控制
用途:不单单是组合图形,而是要精细控制图形布局,排布或叠加若干图形来创建单幅有意义的图形
图形函数fig()
#示例:在散点图上添加两幅箱线图,创建单幅增强型图形
opar<-par(no.readonly=TRUE)
par(fig=c(0,0.8,0,0.8)) #散点图 fig=参数选项(x1,x2,y1,y2)标出绘图区域,与matlab类似
plot(mtcars$wt,mtcars$mpg,xlab="miles per gallon",ylab="car weight")
par(fig=c(0,0.8,0.55,1),new=TRUE) #上方箱线图,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=默认会新建一幅图形,故若要添加一幅图到一幅现有图形上,请设定参数new=TRUE
需要不断尝试找到合适的位置参数。