图形初级
3.1 使用图形
在交互式会话中,通过组条输入语句构建图形,直至得到想要的效果
attach(mtcars) #绑定了数据框mtcars plot(wt,mpg) #打开图形窗口并生成一副散点图,横走表示车身重量,纵轴表示每加仑汽油形式的英里数 abline(lm(mpt~wt)) #根据前一句画出的图像求出拟合的函数 title("Regression of MPG on Weight") #加标题 detach(mtcars) #解除绑定
通过代码保存图形:
将绘图语句夹在开启目标图形设备的语句和关闭目标图形设备的语句之间即可
pdf("mygraph.pdf") #开启目标图形设备的语句
#绘图语句
attach(mtcars)
plot(wt,mpg)
abline(lm(mpt~wt))
title("Regression of MPG on Weight")
detach(mtcars)
dev.off()#关闭目标图形设备的语句
除了pdf(),还可以用win.metafile(),png(),jepg(),bmp(),tiff(),xfig(),postscript(),将图形保存为其它格式
通过图形界面保存图形的方法:“另存为”
问题:执行如plot(),hist()或boxplot()这样的高级绘图命令创建一副图形时,通常会覆盖掉先前的图形,如何创建多个图形并且随时查看每一呢?
解决
方法1:创建新图形前打开新的图形窗口
dev.new() #打开图形设备窗口
创建图语句
dev.new ( )
创建图语句
...
方法2:通过图习性用户界面查看多个图形
打开第一个图形窗口后,”历史(History)“-》”记录(Recording)“--》使用菜单的”上一个(previous)“和”下一个(Nex)查看已经绘制的图形。
方法3:(适用于全平台)使用函数dev.new()、dev.next()、dev.prev()、dev.set()、dev.off()同时打开多个图形窗口,并决定将哪个输出发送到哪个窗口。具体参考help(dev.cur)
3.2 一个简单的例子
先构造一个健翔的数据集,描述病人对两种药物五个剂量水平上的响应情况
dose<-c(20,30,40,45,60) drugA<-c(16,20,27,40,60) drugB<-c(15,18,25,31,40) mydata1<-data.frame(dose,drugA,drugB) mydata1<-rename(mydata1,c(dose="剂量",drugA="对药物A的响应",drugB="对药物B的响应"))
另一种方式
"剂量"<-c(20,30,40,45,60) "对药物A的响应"<-c(16,20,27,40,60) "对药物B的响应"<-c(15,18,25,31,40) mydata<-data.frame(剂量,对药物A的响应,对药物B的响应)
结果如下
假设采用第一种方式绘制的数据框,下面创建描述药物A与响应关系的图形
plot(dose,drugA,type='b')
其中type='b'表示同时绘制点和线
3.3 图形参数
有两种方式。par()和高级绘图函数直接提供的键值对。
1 函数par()--------------除非再次修改,否则设置的参数一直到此次回合结束
格式:par(optionname=value, optioname=value,...)
函数内没输入任何东西,则par()生成一组当前参数的列表
no.readonly=TRUE将生成可修改的图形参数列表。不可修改的变量就不管了。
举个例子了解这个函数,继续上面的例子。
将空心圆点改成实心三角形,将实线改成虚线。
opar<-par( no.readonly = TRUE) #取出可以修改的变量。 opar$lty #结果为[1] "solid" opar$pch #结果为 [1] 1 这些参数就是上图的图形参数,下面对参数修改 par(lty=2,pch=17) #lty=2虚线,pch=17实心三角形 plot(doze,drugA,type='b') #运行这条语句后出现上图的第二张 par(opar)#恢复 plot(doze,drugA,type='b') #看图上图的第三张,又恢复了原样。
2 高级绘图函数直接提供optionname=value的键值对。----------------指定的选项仅对这幅图本身有用。
3.3.1 符号和线条
可用图形参数指定绘图时使用的符号和线条
这里列举几个常用的
pch=点
col=边界颜色,bg=填充色
lty=线条
lwd=线条宽度(相对大小的倍数)
cex=符号大小(默认值的倍数)
plot(doze,drugA,type='b',lty=3,lwd=3,cex=2)
3.3.2 颜色
参数 | 描述 |
col | 默认的绘图颜色 |
col.axis | 坐标轴可读文字颜色 |
col.lab | 坐标轴标签(名称)的颜色 |
col.main | 标题颜色 |
col.sub | 副标题颜色 |
fg | 图形的前景色 |
bg | 图形的背景色 |
指定颜色方法有多种,例如
颜色下标 | 颜色名称 | 十六进制颜色值 | RGB值(红绿蓝) | HSV值(色相-饱和度-亮度值) |
col=1 | col=“while” | col=“#FFFFFF” | col=rgb(1,1,1) | col=hsv(0,0,1) |
colors()返回所有可选颜色的名称
R中许多创建连续型向量的函数:rainbow(),heat.colors(),terrain.colors(),topo.colors(),cm.colors()
RColorBrewer创建颜色配对。---------要下载RColorBrewer包
library(RColorBrewer) n<-7 mycolors<-brewer.pal(n,"Set1") barplot(rep(1,n),col=mycolors)
从Set1调色板中抽取7种十六进制表示的颜色,并返回一个向量。
Brewer.pal.info返回所有可选调色板列表。
gray()生成多节灰度色,需要元素值为0到1之间的向量来指定各颜色的灰度,gray(0:10/10)生成10阶灰度值。
n<-10 mycolors<-rainbow(n) pie(rep(1,n),labels = mycolors,col = mycolors) mygrays<-gray(0:n/n) pie(rep(1,n),labels = mygrays,col=mygrays)
3.3.3 文本属性
指定文本大小的参数:cex(相对于默认大小缩放倍数的值),cex.aixs,cex.lab,cex.main,cex.sub
指定字体族、字号和字样的参数:font(整数。1=常规、2=粗体、3=斜体、4=粗斜体、5=符号字体),font.axis(坐标轴刻度文字的字体字样)、font.lab(坐标轴标签(名称)的字体字样)、font.main、font.sub、ps(字体磅值(1磅约为1/72英寸)文本最终大小ps*cex)、family(绘制文本时使用的字体族)
par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)#创建的图形有斜体、1.5倍默认文本大学的坐#标轴标签,粗斜体、2倍默认文本大学的标题
字体族的衬线、无衬线和等宽字体的具体映射与图形设备有关。如果不满意,需要创建新的映射。windows中,通过widwosFont()创建这类映射
windowsFonts( A=windowsFont("Arial Black"), B=windowsFont("Bookman Old Style"), C=windowsFont("Comic Sans Ms") ) plot(dose,drugA,type='b')
对于pdf格式输出图形
通过
> names(pdfFonts())
[1] "serif" "sans" "mono"
[4] "AvantGarde" "Bookman" "Courier"
[7] "Helvetica" "Helvetica-Narrow" "NewCenturySchoolbook"
[10] "Palatino" "Times" "URWGothic"
[13] "URWBookman" "NimbusMon" "NimbusSan"
[16] "URWHelvetica" "NimbusSanCond" "CenturySch"
[19] "URWPalladio" "NimbusRom" "URWTimes"
[22] "ArialMT" "Japan1" "Japan1HeiMin"
[25] "Japan1GothicBBB" "Japan1Ryumin" "Korea1"
[28] "Korea1deb" "CNS1" "GB1"
找出那些字体可用,在用pdf(file=“...”,family=",,,,")生成图形
对于PostScript格式的输出图形
> names(postscriptFonts())
[1] "serif" "sans" "mono"
[4] "AvantGarde" "Bookman" "Courier"
[7] "Helvetica" "Helvetica-Narrow" "NewCenturySchoolbook"
[10] "Palatino" "Times" "URWGothic"
[13] "URWBookman" "NimbusMon" "NimbusSan"
[16] "URWHelvetica" "NimbusSanCond" "CenturySch"
[19] "URWPalladio" "NimbusRom" "URWTimes"
[22] "ArialMT" "ComputerModern" "ComputerModernItalic"
[25] "Japan1" "Japan1HeiMin" "Japan1GothicBBB"
[28] "Japan1Ryumin" "Korea1" "Korea1deb"
[31] "CNS1" "GB1"
再使用postscript(file="...ps",family="...")
3.3.4 图形尺寸与边界尺寸
参数 | |
pin | 图形尺寸的宽与高(英寸) |
mai | 数值向量表示边界大小,“下左上右”,英寸 |
mar | 。。。。。。。。。。,“下左上右”,英分 |
3.4 添加文本、自定义坐标轴和图例
许多高级绘图函数可自行设定坐标轴和文本标注(plot,hist,boxplot)
例如plot函数添加标题(main),副标题(sub),坐标轴标签(xlab,ylab),坐标轴范围(xlim,ylim)
dose=c(20,30,40,45,60) drugA<-c(16,20,27,40,60) drugB<-c(15,18,25,31,40) 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", xlim=c(0,60),ylim=c(0,70))
注意:默写函数已经包含默认的标题和标签,可以通过在plot()语句或者单独的par()语句添加ann=FALSE移除它们
3.4.1 标题
title():图形标题和坐标轴标签
一般调用格式
title(main="main title",sub="subtitle",
xlab="x-axis labels",ylab="My Y labe",)
可以指定其他图形参数
title(main="main title", col.main = "red" #将标题设置为红色
sub="subtitle", col.sub = "blue" #将此标题设置为蓝色
xlab="x-axis labels",ylab="My Y labe",
col.lab ="green",cex.lab =0.75) #将坐标轴设置为绿色,文字大小设置为原来的75%
3.4.2 坐标轴
axis()创建自定义坐标轴
axis(side,at=,labels,pos=,lty=,col=,las=,tck=,...)
创建自定义坐标轴时,应对禁止高级绘图函数自动生成坐标轴,axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非添加参数frame.plot=TRUE)
参数xaxt=“n”禁用X轴,yaxt=“n”禁用Y轴(会留下框架线,只是去除刻度)
mtext()在图形的页边空白写入文本
mtext(text, side = 3, line = 0, outer = FALSE, at = NA,
adj = NA, padj = NA, cex = NA, col = NA, font = NA, ...)
text-写入的文本;side--表示绘制在图形那边的坐标轴(1下,2左,3上,4右)
lines()为现有图形添加元素
次要刻度线
包:Hmisc,需要函数 minor.tick()
添加次要刻度线
libraray(Hmisc)
minor.tick(nx=n,ny=n,tick.ratio=n)
nx和ny表示X轴和Y轴两条主刻度线之间通过次要刻度线划分得到的区间个数。
tick.ratio 次要刻度相对主刻度线的大小比例。(可通过par(“tck”)获取当前主刻度线长度)
3.4.3 参考线
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”) 从1到10,间隔为2的构成的为遏制添加蓝色虚线。
3.4.4 图例
legend(location,title,legend)
location 制定图例位置,1,直接给出图例左上角x和y的坐标,2.使用关键字(bottom,bottomleft,left,topleft,top,topright,right,bottomright,center)放置图例,同时可使用参数inset= 制定图例向土星内侧移动的大小(以绘图区域大小的分数表示)。
3.location(1),再鼠标单击指出位置
title 图例标题的字符串
legend 图例标签组成的字符型向量
3.4.5 文本标注
- text(location,“文本”,pos)
- mtext(“文本”,side,line=n)
pos:文本的位置参数。1下,2左,3上,4右。可同时制定offset作为偏移量,以相对于单个字符宽度的比例表示。
side:制定放置文本的边。1下,2左,3上,4右。可制定参数line= 来内移或外移文本,值越大,文本越外移。也可adj=0将文本向坐下对齐,adj=1右上对齐。
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)
图3-11 一副散点图(车重与每加仑汽油行驶英里数)的示例,各点均添加标签(车型)
3.4.6 数学标注
plotmath()为图形主体或者边界上的标题、坐标轴名称或文本标注添加数学符号
3.5 图形的组合
- par()使用参数mfrow=c(nrows,ncols)创建行填充、行数为nrows、列数为ncols的图形矩阵。 nfcol=(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)
attach(mtcars) opar <- par(no.readonly=TRUE) par(mfrow=c(3,1)) hist(wt) hist(mpg) hist(disp) par(opar) detach(mtcars)
- layout(mat)
mat是一个矩阵,制定图形组合的位置。
attach(mtcars) layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE)) hist(wt) hist(mpg) hist(disp) detach(mtcars)
> matrix(c(1,1,2,3)) [,1] [1,] 1 [2,] 1 [3,] 2 [4,] 3
第一个图占据第一行的第一格和第二格,第二个图形占据第二行的第一个格,第三个图形占据了第二行的第三格。
参数: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)
得到图形,将一幅图置于第一行,两幅图置于第二行。第一行图形的高度是第二行中图形高度的二分之一。此外,右下角图形的宽度是左下角图形宽度的三分之一。
图形布局的精细控制
通过fig= 实现通过排布或者叠加若干图形来创建单幅的、有意义的图形。
opar <- par(no.readonly=TRUE) #设置散点图 par(fig=c(0, 0.8, 0, 0.8))#fig将散点图设定为占据横向范围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.55, 1), new=TRUE) #箱线图横向占据0~0.8,纵向占据0.55~1 boxplot(mtcars$mpg, horizontal=TRUE, axes=FALSE) #右侧添加箱线图 par(fig=c(0.65, 1, 0, 0.8), new=TRUE) boxplot(mtcars$wt, axes=FALSE) par(opar)
fig= 默认会新建一幅图形,因此在添加一幅图到现有图形时,设定参数new=TRUE