R绘图 图形初阶

目录

要点: 创建、修改、保存、组合图形,及低水平画图命令。[R In Action Chapter3]

R基础绘图函数很繁琐,很强大,理论上能画出/组合出任何图形,是一个值得研究的R高级技能。

图形的创建和保存

直接截图,或者依靠菜单保存图片。也可以用命令保存图片。
#输出pdf格式 setwd("F://Temp//") #设定工作目录 pdf("pic1.pdf", width=4, height=4, useDingbats=F) # 设定文件名 attach(mtcars) plot(wt,mpg) abline(lm(mpg~wt)) detach(mtcars) dev.off() #关闭绘图设备 # 输出 svg 格式 svg(file="plot.svg",width=3,height=3.5) plot(c(1,6,3,7,6,9),type="l", col='red', ylab="Density") dev.off()

除了pdf(),还可以使用函数win.metafile()、png()、jpeg()、bmp()、tiff()、xfig()和postscript()将图形保存为其他格式。(注意,Windows图元文件格式仅在Windows系统中可用。)

png函数技巧: 把height width和res增大同样比例试一试。发现图片正常,而且清晰度提高了。
png("type.png",width=600*3,height=3*600,res=72*3) #否则字体大小会变得很不协调

R语言的高质量图形渲染库Cairo

Cairo 库在win10下画图,导入AI乱码! 优先使用 pdf(useDingbats=F),图放到AI不变形,不乱码。

#输出高清pdf library(Cairo) Cairo.capabilities() #检查Cairo的兼容性 # png jpeg tiff pdf svg ps x11 win raster # TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE CairoPDF(file="xx.pdf",width=10,height=10) plot(c(1,2)) #画图语句... dev.off()
Cairo使用起来非常简单,和基础包grDevices中的函数对应:
	CairoPNG: 对应grDevices:png()
	CairoJPEG: 对应grDevices:jpeg()
	CairoTIFF: 对应grDevices:tiff()
	CairoSVG: 对应grDevices:svg()
	CairoPDF: 对应grDevices:pdf()
我常用的图形输出,就是pdf和png。

自定义符号、线条、颜色和坐标轴

1.图形参数设定的两种方式

(1)通过par()指定,除非被再次修改,该设定在session结束前一直有效。该语句可一次性定义好,或使用多次。

> par("mar") #[1] 5.1 4.1 4.1 2.1 用于查询当前"mar"参数的值。

> oldPar=par(no.readonly=T) #返回一个当前图形参数列表,可用于恢复设定: par(oldPar)

oldPar=par(no.readonly = T) #记录当前设定. 或简写 oldPar=par()
par(lty=2,pch=17) #修改设定:line type将默认实线改为虚线,pch将默认的点符号改为实心三角
plot(x,y,type="b")

par(oldPar) #恢复设定
plot(x,y,type="b")

(2)通过高级绘图函数直接定义,仅对当前图形有效。

plot(x,y,type="b",lty=2,pch=17)

(3) 除了par函数,还有options()函数也是如此

op = options(digits = 2) (a = 1.34556) # 1.3 options(op) (a = 1.34556) # 1.34556

2.函数par()中的参数可以分为三大类:

字体、颜色、线条、坐标轴、标题

(1)只能读取,不能进行设置。包括参数cin,cra,csi,cxy, din。

(2)只能通过函数par()进行设置。包括参数:

"ask",
"fig", "fin",
"lheight",
"mai", "mar", "mex", "mfcol", "mfrow", "mfg",
"new",
"oma", "omd", "omi",
"pin", "plt", "ps", "pty",
"usr",
"xlog", "ylog"

(3)剩下的参数除了函数par()外,还可以通过各种高级绘图函数进行设置,如函数plot,points,lines,abline,title,text,axis,image,box,contour,rect,arrows等。

> ?par #查看详细文档。或参考 R中设置图形参数--par()参数详解.html

符号和线条参数

cex: 缩放倍数,默认是1;

lwd: 线条宽度。

pch: 指定绘制时使用的符号(见图fig1)

x = 1:6 y = 5:1 # 生成25个点的网格数据 xy = expand.grid(y=y,x=x) xy=head(xy,n=26) # 画25种pch plot(xy$x-6,xy$y,pch=0:25,col="red",cex=2, xlim=c(-5.5,6),ylim=c(-7,6), # 指定坐标轴范围 ann=F,axes=F) # 这两个参数去掉原有边框 text(3-6,6,"plotting ‘character’: pch=") text(xy$x+0.4-6,xy$y,as.character(0:25))

Fig1 对于pch的21-25,还可以指定边界颜色(col=)和填充色(bg=).



lty: 指定线条类型(见图fig2)。Line types can either be specified as an integer (0=blank, 1=solid (default), 2=dashed, 3=dotted, 4=dotdash, 5=longdash, 6=twodash) or as one of the character strings "blank", "solid", "dashed", "dotted", "dotdash", "longdash", or "twodash", where "blank" uses ‘invisible lines’ (i.e., does not draw them).

plot(NULL, xlim=c(0,6),ylim=c(0,6), # 指定坐标轴范围 ann=F,axes=F) text(3,6.5,"line type: lty=", xpd=T) abline(h=1:6, lty=c(1:6), lwd=2 ) #6种线的类型 text(-0.5, (1:6), label=1:6, xpd=T)

Fig2 线条类型-6种lty


颜色

R 渐变色请参考本站 R 渐变色
参 数 描 述
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()则基于色相—饱和度—亮度值来生成颜色。


颜色函数: 颜色格式互转、颜色生成


# 获取所有颜色的名字 colors() #"white" "aliceblue" "antiquewhite" ... length(colors()) # 657 个颜色 length(colors(distinct = T)) # 502 种独特颜色 #显示所有颜色 scales::show_col( colors(distinct = T), labels = F) # labels=F 就是不显示颜色16名字 #图略 # 查看R定义的颜色及颜色函数们 demo("colors") # 示例:找6个颜色画散点图 colors=c("firebrick1", "deepskyblue3", "goldenrod1", "mediumpurple1", "orange3", "palegreen4") png("02.png", width=72*3, height=72*3, res=72) par(mar=c(3,3,1,1)) plot(mpg ~ wt, data=mtcars, pch=20, cex=2, col=colors, mgp=c(2,1,0)) legend("topright", pch=20, col=colors, legend=colors, cex=0.8, #字体大小 pt.cex=1.2, #点的大小 bty="n") #不要边框 dev.off()

很好很强大的 R颜色列表.pdfAll colors In R.html, produced by script getAllColors


颜色格式互转、生成颜色:

# 颜色名 to rgb: col2rgb(col, alpha = FALSE) > colors()[2] [1] "aliceblue" > col2rgb("aliceblue") [,1] red 240 green 248 blue 255 # 使用 rgb() 生成颜色 rgb(240,248,255, maxColorValue =255) # "#F0F8FF" # 使用 hsv() 生成颜色 hsv(0.57, 0.05, 1) # "#F2FAFF" # rgb to hsv: rgb2hsv(r, g = NULL, b = NULL, maxColorValue = 255) > rgb2hsv(240,248,255) [,1] h 0.57777778 s 0.05882353 v 1.00000000 # color name to hex: col2hex('aliceblue') # method1 col2hex1=function(namedColor){ RGB = col2rgb(namedColor) rgb(t(RGB), maxColorValue =255) } col2hex1('aliceblue') # [1] "#F0F8FF" # method2 col2hex2 = function(x, alpha = "ff") { RGB = col2rgb(x) return(apply(RGB, 2, function(C) { paste(c("#", sprintf("%02x", C), alpha), collapse = "") })) } col2hex2('aliceblue') # [1] "#f0f8ffff"

R自带配色方案

R自带很多套连续颜色集合,包括rainbow()、heat.colors()、terrain.colors()、topo.colors()以及cm.colors()

rainbow(10)可以生成10种连续的“彩虹型”颜色。多阶灰度色可使用gray()函数生成。这时要通过一个元素值为0和1之间的向量来指定各颜色的灰度。gray(0:10/10)将生成10阶灰度色。

n=10
mycolors=rainbow(n)
pie(rep(1,n), labels=mycolors, col=mycolors)
mygrays=gray(1:n/n)
pie(rep(1,n), labels=mygrays, col=mygrays)


par(mfrow=c(2,2), mai=c(0.1,0.4,0.2,0.1))
#mfrow设置图的行列数
# mai设置边距 c(bottom, left, top, right)
barplot(rep(1,6), col= heat.colors(6), main="heat")
barplot(rep(1,6),col=terrain.colors(6), main="terrain")
barplot(rep(1,6),col=topo.colors(6), main="topo")
barplot(rep(1,6),col=cm.colors(6), main="cm")


#画一个色环(未展示) n = 1000 #png("rainbow.disc.png", bg = "transparent") par(mar = c(0,0,0,0)) pie(rep(1,times=n),labels="",col=rainbow(n),border=rainbow(n)) #dev.off() #五个调色板产生的颜色对比如下: #定义画图函数 draw1=function(f,n,main=""){ barplot(rep(1,times=n), axes=FALSE,main=main, col=f(n),border=f(n) ); if(n<=20)box() } #批量调用画图函数 draw2=function(n){ par(mfrow=c(5,1)); par(mar=c(0.3,0.5,2,0.5));par(xaxs="i", yaxs="i") # draw1(rainbow,n,"Rainbow colors") draw1(heat.colors,n,"heat.colors") draw1(terrain.colors,n,"terrain.colors") draw1(topo.colors,n,"topo.colors") draw1(cm.colors,n,"cm.colors") } #left draw2(10000) #right: 如果只需要10中颜色 draw2(10)


colorRampPalette() 自定义颜色组

可以用颜色名称通过colorRampPalette函数产生自己的颜色系列。colorRampPalette的参数如下:

colorRamp(colors, bias = 1, space = c("rgb", "Lab"), interpolate = c("linear", "spline"))

colorRampPalette(colors, ...)

par(mfrow=c(2,1),mai=c(0.2,0.4,0.2,0.1))
#补齐中间的颜色,获得指定数量的渐变色
colorRampPalette(brewer.pal(9,"Blues"))(100) -> color #从正黄色到正蓝色直接过度10个颜色
plot(1:100,col=color,pch=20,cex=2)

barplot(rep(1,30),col=brewer.pal(9,"Blues"))#如果颜色不够,则循环使用


#自定义颜色组2 n=1000 mycolors = colorRampPalette(c("yellow", "red","black"))(n) barplot(rep(1,times=n),col=mycolors,border=mycolors,axes=FALSE); box()


RColorBrewr颜色扩展包

RColorBrewr包提供了3套好看的配色方案。

(1)连续型seq类(sequential),渐变,适用于从低到高排序明显的数据,浅色数字小,深色数字大。

(2)极端型div类(Diverging),生成深色强调两端、浅色表示中部的颜色。适用于对极值和中间值比较注重的数据,可用来标注数据中的离群点。

(3)离散型qual类(Qualitative),生成彼此差异明显的颜色,通常用来标记分类数据。

library(RColorBrewer) brewer.pal.info # 查看有哪些调色板 display.brewer.all() #全部颜色组合名字 display.brewer.all(type="seq")# 有9种颜色 display.brewer.all(type="div")# 有11种颜色 display.brewer.all(type="qual")# 颜色种类不确定 #brewer.pal(9, "某组渐变颜色的名称")来获取该组渐变色的全部9种颜色 barplot(rep(1,8),col=brewer.pal(8,"Set2")) barplot(rep(1,6),col=brewer.pal(8,"Set2")[2:7]) #第二到第七个颜色。 barplot(1:5,col=RColorBrewer::brewer.pal(n = 5,name = "Set2")) #无图 brewer.pal.info # 查看有哪些调色板


文本属性

参 数 描 述
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=符号字体(以Adobe符号编码表示)
font.axis 坐标轴刻度文字的字体样式
font.lab 坐标轴标签(名称)的字体样式
font.main 标题的字体样式
font.sub 副标题的字体样式
ps 字体磅值(1磅约为1/72英寸)。文本的最终大小为 ps*cex
family 绘制文本时使用的字体族。标准的取值为serif(衬线)、sans(无衬线)和mono(等宽)
#左图
plot(0:4,type="n",xlab = NA,ylab=NA,axes=F) #画一个空图形
text(2,4,label="font=1 正常体",font=1)
text(2,3,label="font=2 粗体",font=2)
text(2,2,label="font=3 斜体",font=3)
text(2,1,label="font=4 粗斜体",font=4)

#右图
plot(0:4,type="n",xlab = NA,ylab=NA,axes=F) #画一个空图形
text(2,4,label="cex=1 font=1 正常体",font=1,cex=1)
text(2,3,label="cex=0.5 粗体",font=2,cex=0.5)
text(2,2,label="cex=1.5 font=3 斜体",font=3,cex=1.5)
text(2,1,label="cex=2 font=4 粗斜体",font=4,cex=2)



执行如下命令:

par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)

之后创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体、2倍于默认文本大小的标题。

(1)windows下使用windowsFont()函数来创建映射,
windowsFonts( A=windowsFont("Arial Black"), B=windowsFont("Bookman Old Style"), C=windowsFont("Comic Sans MS") )
#之后,即可使用A、B、C作为family的取值。 #比如使用 par(family="A") 将指定Arial Black作为绘图字体 par(family="A") plot(1:10,main="plot") 坐标轴、标题的字体都是粗体了。

在Mac下,请改用 quartzFonts()函数。


输出pdf、PostScript格式,则修改字体相对简单。

pdf则直接用如下函数找出系统可用字体,

names(pdfFonts())
# [1] "serif" "sans" "mono"
# [4] "AvantGarde" "Bookman" "Courier"
#...
#然后使用
pdf(file="myplot.pdf", family="mono") #来生成图形。
plot(1:10,main="test")
dev.off()

PostScript格式输出,对应函数为 names(postscriptFonts())和postscript(file="myplot.ps", family="fontname")

图形尺寸与边界尺寸

参 数 描 述
pin 以英寸表示的图形尺寸(宽和高)
mai 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸
mar 以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分*。默认值为c(5, 4, 4, 2) + 0.1

*一英分等于十二分之一英寸。——译者注

oldPar=par(no.readonly = T) #记录当前设定 par(pin=c(2,4), mai=c(1.5,1.5,1,0.2)) #2 inch宽,4英寸高。图形边界(第一个底部,顺时针) par(lwd=2, cex=1.5) #线条宽度是默认的2倍,符号是默认的1.5倍 par(cex.axis=0.75, font.axis=3) #坐标轴文本斜体、缩小为默认75%大小 x=1:10 plot(x,x*x, type="b", pch=19, lty=2,col="red") #红色实心圆圈和虚线 plot(x,x*x, type="b", pch=23, lty=6,col="blue", bg="green") #绿色填充的绿色菱形加蓝色边框和蓝色虚线 par(oldPar) #恢复设定


两类边界:mar和oma

R plot中包含两类边界:margin和oma / also here,可以在画图前通过par()函数的参数分别设置。mar=设置margin,oma=设置outer margin area。参数都是4参数向量c(bottom, left, top, right)。比如 par(mar=c(4,0,0,0))表示仅底部留下4行空白,其他地方不留白。

也可以使用omi=和mai=来设定,不过单位是inches,不再是lines。

#用box()定边界mar和oma # Margins area par(oma=c(3,3,3,3))# all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) # Plot plot(0:10, 0:10, type="n", xlab="X", ylab="Y") # type="n" hides the points # Place text in the plot and color everything plot-related red text(5,5, "Plot", col="red", cex=2) box("plot", col="red") #绘图区只是坐标轴围起来的部分 # Place text in the margins and label the margins, all in forestgreen mtext("Margins", side=3, line=2, cex=2, col="forestgreen") mtext("par(mar=c(b,l,t,r))", side=3, line=1, cex=1, col="forestgreen") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="forestgreen") mtext("Line 1", side=3, line=1, adj=1.0, cex=1, col="forestgreen") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="forestgreen") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="forestgreen") box("figure", col="forestgreen") #这是figure区域 # Label the outer margin area and color it blue # Note the 'outer=TRUE' command moves us from the figure margins to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=2, col="blue", outer=TRUE) mtext("par(oma=c(b,l,t,r))", side=1, line=2, cex=1, col="blue", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=1, col="blue", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="blue", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="blue", outer=TRUE) box("outer", col="blue") #这是outer区域,也最大


6种边框类型:bty=

bty(box type)6种字符:o" (the default), "l", "7", "c", "u", or "]"("n"是不显示边框)。可以用于plot()中,也可以用于box()中。

par(mfrow=c(2,6), mar=c(0.5,0.5,4,0.5)) for(i in c('o','l','7','c','u',']')){ plot(c(1),xaxt='n',yaxt='n', #不显示坐标轴 bty=i,main=paste0('bty="',i,'"')) #bty可用于plot()中 } par(mar=c(4,0.5,0,0.5)) for(i in c('o','l','7','c','u',']')){ plot(c(1),col="green", axes=F, #不显示坐标轴 #xaxt='n',yaxt='n', ann=T) #F则不显示轴标签和标题 box(col="red", bty=i,main=paste0('bty="',i,'"')) #bty也可用于box()中 }


添加文本、自定义坐标轴和图例

x=1:10 plot(x,x*x, type="b", col="red",lty=2,pch=2,lwd=2, main="This is main", sub="This is sub", xlab="X(x axis)", ylab="x*x(y axis)", xlim=c(0,10),ylim=c(0,100) )


注意

并非所有函数都支持这些选项。请参考帮助文档。

从更精细的控制和模块化的角度考虑,你可以使用本节余下部分描述的函数来控制标题、坐标轴、图例和文本标注的外观。


某些高级绘图函数已经包含了默认的标题和标签。你可以通过在plot()语句或单独的par()语句中添加ann=FALSE来移除它们。

标题 title()

#plot(1:10) #带xy轴标签,会和title设置的标题重叠 plot(1:10,ann=F) #ann=F则去掉默认坐标轴标签和所有title title(main="My title", col.main="red", sub="my sub-title", col.sub="blue", xlab='my x label', ylab='my y lable', col.lab="green",cex.lab=0.75) #label标签绿色,标签是默认大小的75%


坐标轴 axis()

参 数 描 述
side 一个整数,表示在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右)
at 一个数值型向量,表示需要绘制刻度线的位置
labels 一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值)
pos 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)
lty 线条类型
col 线条和刻度线颜色
las 标签是否平行于(=0)或垂直于(=2)坐标轴
tck 刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为-0.01
(…) 其他图形参数
plot中图和轴距离 xaxs / yaxs Only "r" and "i" styles have been implemented in R: r——默认;
i —— 图形和坐标轴不留空白 just finds an axis with pretty labels that fits within the original data range.
注意: 不要x坐标轴刻度是 xaxt="n",很相近,但不同参数。

创建自定义坐标轴时,要禁用高级绘图函数自动生成的坐标轴。

参数 axes=F将禁用全部坐标轴(包括坐标轴框架线,除非添加了参数 frame.plot=T)。

参数 xaxt="n"和yaxt="n"将分别禁用X和Y轴(会留下框架线,只是去除了刻度)。

#综合实例:绘制带有双y坐标轴的图形 x=c(1:10) y=x z=10/x opar=par(no.readonly = T) par(mar=c(5,4,4,8)+0.1) #增加边界大小 plot(x,y,type="b", #绘制x对y的点图 pch=21,#pch: plot character col="red",yaxt="n", #yaxt不要y轴刻度 lty=3,ann=F) #ann是不要所有默认的标题和标签 # lines(x,z,type="b",pch=22,col="blue",lty=2) #绘制x对10/x的点图,蓝色 #axis第一个参数表示位置 1=below, 2=left, 3=above and 4=right. axis(2,at=x,labels=x,col.axis="red",las=0) #自定义坐标轴2左侧,las=0垂直于轴,2平行于轴 axis(4,at=z,labels=round(z,digits=2), col.axis="blue",las=2,cex.axis=0.7,tck=-0.02) #自定义坐标轴4右侧; tck刻度长度 mtext("y=1/x",side=4,line=3,cex.lab=1,las=2,col="blue") #图外右侧添加文字;las=2垂直于轴 title("An example of creative axes", xlab="X values", ylab="Y=X") #标题和坐标轴标签 par(opar)

除lines()和mtext()外上文都讨论过了。 lines()向现有图形添加线元素,比如在一幅图画两条或更多曲线。 mtext()用于在图形边界添加文本。



需求1: 怎么为y轴刻度值添加不同的颜色呢?

因为axis的col.axis参数不能向量化,所以只能多次使用axis分别标注不同颜色的刻度,或者使用mtext添加坐标轴刻度。

palette ( c ( "steelblue", "orange" )) X = 1:5 Cols = rep ( 1, length ( X )) Cols [ c ( 1, length ( X ))] = 2 Cols # plot ( X, yaxt = "n", ylab="" ) axis ( 2, at = X, labels = FALSE ) mtext ( paste ( "Case", X ), at = pretty ( X ), las=2, side = 2, line = 1, col = Cols )

需求2:隐藏坐标轴刻度?col.ticks = "transparent",设置轴(col)、刻度标签(col.axis)的颜色

plot(NA, xlim=c(-5,6), ylim=c(-7,6), #xaxt='n', yaxt='n', #分别不要x或y坐标 axes=F,#不要坐标和边框 ann=F) #不要坐标标签和标题 # 画通过原点的坐标轴 axis(1,c(-5,0,6),pos=0, # 确定轴的坐标为0 col.ticks = "transparent",#刻度透明,即隐藏掉 col="grey",col.axis="black", hadj=-1,#水平调整标签位置,正负号表反向移动方向 padj=-1.5) # 调整刻度名与轴之间的距离 axis(2,c(-7,0,6),pos=0, col.ticks = "transparent",col="grey",col.axis="black", hadj=1,padj=1.5)


次要刻度线

要创建次要刻度线,需要使用Hmisc包中的minor.tick()函数。
library(Hmisc) minor.tick(nx=n,ny=n,tick.ratio=0.5) #tick.ratio=0.5 长度为主刻度线的一半 #nx和ny指定主刻度线之间细分几个区间。 #当前的主刻度线长度获取 par("tck")

调整轴元素之间的距离:mgp=c()

mgp=c(2.5,1,0) #坐标轴各部件的位置。推荐 mgp=c(1.4,0.5,0) 比较紧凑。

第一个元素为坐标轴位置到坐标轴标签的距离,以文本行高为单位。

第二个元素为坐标轴位置到坐标刻度标签的距离。

第三个元素为坐标轴位置到实际画的坐标轴的距离,通常是0。

d=c(1) par("mgp") #默认[1] 3 1 0 par(mfrow=c(3,3), mar=c(4,4,1,1)) #三行三列 #1 坐标轴标签和轴距离 plot(d,xlab="mgp=c(3,1,0)") #control plot(d,mgp=c(2,1,0),xlab="mgp=c(2,1,0)") #坐标轴标签靠近轴 plot(d,mgp=c(-1,1,0),xlab="mgp=c(-1,1,0)") #坐标轴标移到另一侧:warnings符号不同 #2 刻度标签 plot(d,mgp=c(2,1,0),xlab="mgp=c(2,1,0)") #control plot(d,mgp=c(2,0,0),xlab="mgp=c(2,0,0)") #刻度标签靠近轴 plot(d,mgp=c(2,-1,0),xlab="mgp=c(2,-1,0)") #刻度标签移到轴另一侧:warnings符号不同 #3 刻度位置 plot(d,mgp=c(2,1,0),xlab="mgp=c(2,1,0)") #control plot(d,mgp=c(2,1,1),xlab="mgp=c(2,1,1)") #刻度远离轴 plot(d,mgp=c(2,1,-1),xlab="mgp=c(2,1,-1)") #刻度内移:warnings符号不同


坐标轴标签倾斜: srt=45

或者屏蔽默认坐标轴(xaxt="n"),重绘一个满足自己要求的坐标轴。

labs = paste(names(table(mtcars$cyl)), "cylinders") #返回值是条形图的x坐标 xPos = barplot(table(mtcars$cyl), xaxt="n") #xaxt="n"不要x坐标轴 text(x=xPos, y=-0.5, labels=labs, cex=0.8, #字体是默认的倍数 col="navyblue", xpd=TRUE, #允许绘制在绘图区外 adj=1, #adj=1右上对齐 srt=30) #倾斜30度


对数坐标轴 log="xy"

参考文章(Philip Brennecke, NM2013 Fig 3),以下R代码改写自其补充材料2。

#数据示例 meansHeLa[1:3] # 5_8S_rRNA 7SK A2M #14.37722513 0.93673966 0.06131997 cv2HeLa[1:3] #5_8S_rRNA 7SK A2M # 8.465926 4.789838 28.000000 #对数坐标轴,定义为对数,然后手工添加轴刻度 plot( NULL, xaxt="n", yaxt="n", log="xy", xlim = c( 1e-1, 3e5 ), ylim = c( .005, 100 ), xlab = "average normalized read count", ylab = "squared coefficient of variation (CV^2)" ) axis( 1, 10^(-1:5), c( "0.1", "1", "10", "100", "1000", expression(10^4), expression(10^5) ) ) #x轴数学符号 axis( 2, 10^(-2:2), c( "0.01", "0.1", "1", "10" ,"100"), las=2 ) #y轴数字 abline( h=10^(-2:1), v=10^(-1:5), col="#D0D0D0", lwd=2 ) #背景灰线 # Plot the plant genes, use a different color if they are highly variable points( meansHeLa, cv2HeLa, pch=20, cex=.2, col="#70500040") #col = ifelse( p < .1, "#C0007090", "#70500040" ) ) #可以根据p值(提前计算)选择颜色 #因为缺少上文数据,下列代码无法运行,仅供欣赏 # Add the technical noise fit, as before xg <- 10^seq( -2, 6, length.out=1000 ) lines( xg, coefficients(fit)["a1tilde"] / xg + a0, col="#FF000080", lwd=3 ) # Add a curve showing the expectation for the chosen biological CV^2 thershold lines( xg, psia1theta/xg + coefficients(fit)["a0"] + minBiolDisp, lty="dashed", col="#C0007090", lwd=3 ) # Add the normalised ERCC points points( meansERCC, cv2ERCC, pch=20, cex=1, col="#0060B8A0" )


网格线 grid()

更多例子点击查看: Plot grid in R

# data set.seed(132) x = rnorm(500) # fig1: dot below plot plot(x, main="Fig1") #grid(nx = NA, ny = NULL, lty = 2, col = "gray", lwd = 2) #只画水平线 grid(nx = NULL, ny = NULL, lty = 2, col = "gray", lwd = 2) #横竖网格 par(new = TRUE) #再画一层 plot(x, pch = 19, col = 4) # fig1_B: 使用 abline 绘制 plot(x) # Vertical grid abline(v = seq(0, 500, 100), lty = 2, col = "gray") # Horizontal grid abline(h = seq(-3, 3, 1), lty = 2, col = "gray") # Grid below points points(x, pch = 19, col = 4) # fig2: hist on horizontal grid hist(x, main="Fig2") grid(nx = NA, ny = NULL, #只画横线 lty = 1, col = "gray", lwd = 1) hist(x, col = 4, add = TRUE)



参考线 abline()

x=1:10 plot(x,x*x) abline(h=36,v=6) #画两条线 #也可以添加很多条线,并指定线条类型、颜色、宽度 abline(h=c(10,50,100), lty=2, col="red",lwd=0.5) #三条red虚横线,宽度是一半 abline(v=seq(0,10,2), lty=2, col="grey",lwd=0.5) #n条灰色虚竖线,宽度是一半



图例 legend()

参 数 描 述
location 有许多方式可以指定图例的位置。你可以直接给定图例左上角的x、y坐标,也可以执行locator(1),然后通过鼠标单击给出图例的位置,还可以使用关键字bottom、bottomleft、left、topleft、top、topright、right、bottomright或center放置图例。如果你使用了以上某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘图区域大小的分数表示)
title 图例标题的字符串(可选)
legend 图例标签组成的字符型向量
ncol 图例的列数目。如果horiz为true,则此项无意义。
y.intersp=2 图形之间的y距离,高度差
x.intersp=3 图形和文字的x距离
text.width=4 两个图例之间的距离,水平距离。
xpd=T 图例显示到图形外部
其他选项。如果图例标示的是颜色不同的线条,需要指定col=加上颜色值组成的向量。
如果图例标示的是符号不同的点,则需指定pch=加上符号的代码组成的向量。
如果图例标示的是不同的线条宽度或线条类型,请使用lwd=或lty=加上宽度值或类型值组成的向量。
要为图例创建颜色填充的盒形(常见于条形图、箱线图或饼图),需要使用参数fill=加上颜色值组成的向量

其他图例参数,bty指定盒子样式,bg指定背景色,cex指定大小,text.col指定文本颜色。 horiz=T将会水平放置图例,默认是竖直放置。更多细节参考 help(legend)

x=1:10;y=x; z=10/x; opar=par(no.readonly = T) #par(lwd=2, cex=1, font.lab=2) par(mai=c(2,1,1,0.5)) plot(x,y,type="b", pch=15, lty=1, col="red", ylim=c(0,10), main="X vs. Y", mgp=c(1.4,0.5,0), #坐标轴标签、刻度标签偏移,坐标轴偏移(默认为0) xlab="X value",ylab="Y value") lines(x,z,type="b", pch=17,lty=2,col="blue") abline(h=c(3), lwd=1.5, lty=2, col="grey") #横虚线 library("Hmisc") minor.tick(nx=5,ny=5,tick.ratio = 0.4) #添加次要刻度线 #legend("bottom", inset=-0.7, legend(x=2,y=-1.5, legend=c("This is A","This is B"), #title="Data Type", #horiz = T,#横着显示 ncol=2, #图例显示为两列 cex=1, #字体大小倍数 xpd=T, #有这句话才能显示在图外 bty="n", #不要图例边框 x.intersp=0.2, #图形和文字的距离 text.width=4, #两个图例之间的距离 lty=c(1,2), pch=c(15,17), col=c("red","blue")) #线型-形状-颜色和前面一致 par(opar)


legend() 设置间距(x和y方向),不要小方块外边框

par(oma=c(1,5, 1.5, 0.1)) # 使用了par设置oma,mar图的边距 #par(mar=c(0,0,0,0)) # 设置绘图边距 plot(c(1), ylab="L") legend(x=0.6,y=1.7,legend = c("KO","Ctrl"), xpd=T, x.intersp=0.2, #图形和文字的x距离 y.intersp=3, #图形之间的y距离,高度差 text.width=2, #两个图例之间的距离(这里没作用) cex=1.8, #图例缩放倍数 bty="n", #不要图例的外方框 border=NA, #不要图例小方块描边 fill = c( rgb(255,192,203,max=255),rgb(165,75,42,max=255) ) )


一幅图解决R语言绘制图例的各种问题

legend(x, y = NULL, legend, fill = NULL,col =, bty = "o",xjust = 0, yjust = 1, x.intersp = 1, y.intersp =1, adj = c(0, 0.5), text.width = NULL,xpd=TRUE)

Legend 定位

1. 如果图例绘在制图区外,必须提前保留绘制legend的空间。如par(mai=c(2,0.5,0.5,0.5)),图例绘制在下方,所以留2,其余3个方向为0.5。

2. 图例绘在制图区外,必须设置参数xpd=TRUE,否则命令正确也不会出图,因为默认xpd=F。

3. 图例位置由x,y决定。legend 默认坐标为左上角的坐标(因为设定xjust=0,yjust=1),因此可以通过xjust,yjust来调节。xjust=1,yjust=0,即为右下角坐标。

Legend布局

1. 如果图例数量太多,则设置多列(ncol=),如ncol=4,分为4列。

2. 如果图例不加边框,则设置bty=“n”,“o”为加边框。

3. 图标和文字的位置,可以通过x.intersp, y.intersp, adj,text.width等来调控。

x(y).intersp指图标和文字之间的绝对距离,adj指图标和文字的相对距离,text.width指图标和文字整体的宽度。

set.seed(20211029) b=matrix(sample(1:16), 4,4);b row.names(b)=c("red","green","cyan","purple") colnames(b)=c("eg1", "eg2", "eg3", "eg4") b # eg1 eg2 eg3 eg4 #red 15 12 13 9 #green 4 16 3 11 #cyan 1 2 7 14 #purple 6 10 5 8 pdf("xx.pdf", width=4.5, height=3.3) par(mai=c(2, 0.5, 0.5, 0.5), mgp = c(3,1,0)/1.5) #1 #mai控制边界(b,l,t,r)inch, mgp坐标轴与文字的距离 barplot(b, beside=T, col=rainbow(4)) #2 box(col="green") xy=par("usr"); xy #3 # [1] 0.24 20.76 -0.16 16.00 # 以下语句末尾#后的编号对应图中右边红色编号 legend(x=xy[2]-xinch(0.2), y=xy[3]-yinch(0.8), legend=rownames(b), fill=rainbow(4), #col=rainbow(4), 没有线,则不用设置线的颜色 xjust=1, yjust=0, xpd=T, ncol=4, bty="n" ) #4 xpd=T允许在box外绘图 legend(x=xy[2]-xinch(0.2), y=xy[3]-yinch(1), legend=rownames(b), fill=rainbow(4), xjust=1, yjust=0, xpd=T, ncol=4, bty="n", adj=0.5 ) #5 adj 控制文字的与方块(固定)的距离,-远离,+靠近。 legend(x=xy[2]-xinch(0.2), y=xy[3]-yinch(1.2), legend=rownames(b), fill=rainbow(4), xjust=1, yjust=0, xpd=T, ncol=4, bty="n", x.intersp=0 ) #6 图片和文字的距离,图标和文字都移动,xjust=1表示图例右侧固定 # 0表示文字紧贴着图标;负数表示文字重叠到图标;正数表示文字和图标有距离。 legend(x=xy[2]-xinch(0.2), y=xy[3]-yinch(1.4), legend=rownames(b), fill=rainbow(4), xjust=1, yjust=0, xpd=T, ncol=4, bty="n", text.width=1) #7 图标和文字整体的宽度,非负。可以理解为水平宽度 legend(x=xy[2]-xinch(0.2), y=xy[3]-yinch(1.6), legend=rownames(b), fill=rainbow(4), xjust=1, yjust=0, xpd=T, ncol=4, bty="n", x.intersp=0.2, text.width=1.5) #8 联合使用更好:图文距离时0;图标之间距离1.5 legend(x=xy[1]+xinch(0.2), y=xy[3]-yinch(1.4), legend=rownames(b), fill=rainbow(4), xjust=0, yjust=1, xpd=T, ncol=2, bty="n", x.intersp=0.2, y.intersp=0.8, text.width=1.5) #9 分2列,设置垂直间距 # text(xy[2], c(xy[3]-yinch(0.8), xy[3]-yinch(1), xy[3]-yinch(1.2), xy[3]-yinch(1.4), xy[3]-yinch(1.6), xy[3]-yinch(1.8)), labels = c(4,5,6,7,8,9), xpd=T, pos=3, col="red") points(xy[1],xy[3], col="red", pch=20, cex=1, xpd=T) points(xy[2],xy[4], col="red", pch=20, cex=1, xpd=T) text(xy[1],xy[3], labels = c("xy[1], xy[3]"), xpd=T, pos=1, col="red", cex=0.7) text(xy[2],xy[4], labels = c("xy[2], xy[4]"), xpd=T, pos=3, col="red", cex=0.7) dev.off()


# 命令1:设置绘图参数mai=c(下,左,上,右) 的边界空间。
# 命令2:绘制柱状图。
# 命令3:选取绘图区域左下角和右上角的坐标。
# 命令4:正常绘图,设置xpd=T。xinch()、yinch(),分别表示沿x轴,y轴移动的距离,按绝对距离计算,或按坐标轴的数量级计算。fill=T,即显示图标(默认为矩形填充色)。fill=F的话可以设置pch,选择图标类型。
# 命令5:设置adj=0.6,adj越接近于0,图标与文字的相对距离越远。
# 此参数作用于文字,图标不动。
# 命令6:设置x.intersp=0.6,越接近于0,图标与文字的绝对距离越近。以一侧为标准,图标文字均移动。
# 命令7:设置text.width=1.4,表示图标和文字整体的宽度。当文字太长时可以调节此参数。
# 命令8:text.width与x.intersp结合使用,效果最好。
# 命令9:设置ncol=2,分为两列。

文本标注 text(), mtext()

text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。

text(location,"text to place",pos,...)

mtext("text to place",side,line=n,...)

参 数 描 述
location 文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置
pos 文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示
side 指定用来放置文本的边。1=下,2=左,3=上,4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对齐
srt The string rotation in degrees. 指定文字旋转角度,0-360角度值。只支持 text()。如 text(x=-0.12, y=200, labels = "x = -0.1", pos = 3, srt=90, col="red");

其他选项: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, labels=row.names(mtcars), offset=0.5, #偏移距离 cex=0.6,pos=4, #字体为默认的60%,pos=4位右侧 col="red") detach(mtcars)

mtcars提供的32种车型的车重和每加仑汽油行驶英里数散点图。每个点右侧标注车辆型号。


#win下自定义字体 windowsFonts( A=windowsFont("微软雅黑"), B=windowsFont("华文行楷") ) opar=par(no.readonly = T) par(cex=1.5) plot(1:3, type="n",ann=F,axes=F,frame.plot=T) text(2,1.2,"default 默认") text(2,1.5,family="mono","mono 同宽") text(2,2,family="serif","serif") text(2,2.5,family="A","微软雅黑") text(2,2.8,family="B","华文行楷") title(sub="学习在R中设置字体",cex.sub=0.5,#字体大小 mgp=c(-1, -0.2, 0) ) par(opar)

数学标注 help(plotmath)

使用类似于TeX中的写法为图形添加数学符号和公示。细节和示例参考help(plotmath); demo(plotmath)。expression()中可以使用的数学表达式,比Latex少,但是比matlab多。

也可以用 plotmath() 函数为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。

具体使用是利用text()语句中放入expression表达的数学公式。

#fig1: Mathematical Annotation in R plot(1,2,type="b",ylim=c(1.2,2.1), pch=21,col="blue",bg="red",cex=2) # 在(1,2)处画一个点 text(1,2,expression(hat(x)), pos=4) # 在(1,2)右加入\hat{x} #更复杂的公式 formula = expression(italic(Prob) == bgroup("(",atop(n, x),")")%*%p[1]^x%*%(1-p[1])^(n-x)) text(1,1.5,label=formula) # fig2: https://stats.idre.ucla.edu/r/codefragments/greek_letters/ set.seed(1) # for reproducible, pseudo-random numbers h = rnorm(mean = 5, sd = 1, n = 1000) hist(h, xlab = expression(h), main = expression(paste("希腊字母, ", mu, "=5, ", sigma,"=1")))

其他标注公式的函数

公式可以使用 expression(), bquote(), substitute(), parse(text=) 等函数实现。

注: 下文说的“变量替换”,就是把变量名替换为的它的值。

(1)expression(), 见上文,不支持变量替换。

(2)bquote() 函数画公式(支持变量替换)。 除了.()子表达式的内容被它们的值替换外,其它表达式都被引用。

(3) substitute() 函数画公式(支持变量替换): 格式上类python: substitute( paste(nn, x^2), list(nn=labNames[1], x=100))

(4) parse(text=str1)/str2lang(str1)/str2expression(str1) 把字符串转换为公式:先拼接字符串(该步比较复杂),再用这几个函数任意一个转为公式,支持变量替换。

外链: R 语言 | 如何用【非科学计数法】在图中标记P值?(R /ggplot2)

# fig1: 标注线性拟合曲线的R^2 plot(mpg ~ disp, data=mtcars, mgp=c(2,1,0), main="bquote()") # 散点图 fit=lm(mpg ~ disp, data=mtcars)# 拟合曲线 abline(fit,col="red") # 标注R^2 text(x=300,y=30, col='red', label=bquote( R^2==.( round(summary( fit )$r.squared, 3) ) ) ) # fig2:线性拟合公式、R^2、p值 data("faithful") head(faithful) plot(waiting ~ eruptions, data=faithful, pch=19, cex=0.2, mgp=c(2,1,0), main="substitute()") # 散点图 model.lm = lm(formula = waiting ~ eruptions, data = faithful) # 拟合曲线 summary(model.lm) #对于一元线性回归方程y=ax+b,Intercept是指的截距,x对应的是系数。 abline(model.lm,col="blue", lwd=2) # 标注公式 l = list(a = as.numeric(format(coef(model.lm)[1], digits = 4)), b = as.numeric(format(coef(model.lm)[2], digits = 4)), r2 = format(summary(model.lm)$r.squared, digits = 2), p = format(summary(model.lm)$coefficients[2,4], digits = 2)) eq = substitute( atop( atop(phantom(0), italic(y) == a + b %.% italic(x)), #phantom(0)就是占位符,因为平级的atop()字号一致 atop( italic(R)^2~"="~r2, italic(P)~"="~p), ), l) eq str(eq) #language atop(i... class(eq) #"call" text(x=1.5, y=90, col='red', label= eq, adj=0 ) # 附: ggplot2 标注公式,就是传入公式的字符串,然后指定参数 parse=T 即可。 library(ggplot2) ggplot(faithful, aes(x=eruptions,y=waiting)) + geom_point() + theme_bw()+ stat_smooth(method='lm',formula = y~x,colour='red')+ annotate(geom="text", x=4, y=50, label=as.character(as.expression(eq)), parse = TRUE) # fig3: 拼接字符串,然后转为公式 a=1; b=2 str1=paste('y[estimate]~"="~', a, '+~',b,'^italic(x)', sep=""); # 拼接字符串 # check str1; #[1] "y[estimate]~\"=\"~1+~2^italic(x)" class(str1) #[1] "character" class( parse(text=str1) ) #[1] "expression" # plot x=seq(-1,10,0.1);x plot(x, 1+2^x, type="l", col="red", mgp=c(2,1,0), ylab="Y", main="parse(text=)") # 标注公式 # 函数1: parse(text=str1) text(x=1,y=800, label= parse(text=str1), adj = 0) # 函数2: str2lang(str1) text(x=1,y=600, label= str2lang(str1), adj = 0, col='red') # 函数3: str2expression(str1) text(x=1,y=300, label= str2expression(str1), adj = 0, col='blue')

图形的组合

在R中使用函数par()或layout()可以容易的组合多幅图。

par()参数的自动恢复on.exit()

oldPar=par(no.readonly=T) #返回一个当前图形参数列表,可用于恢复设定: par(oldPar)

#函数内还可以 draw=function(){ opar = par(mar = c(4,3,3,1), mgp=c(2,1,0)) on.exit(par(opar)) #离开函数时自动恢复原来的par()设置 plot(1:5) } draw() plot(1:5)

par()参数mfrow控制布局

par()是使用图形参数 mfrow=c(nrows,ncols) 来创建按行填充的、行数为nrows、列为ncols的图形矩阵。mfcol=c(nrows,ncols)则按列填充。

#示例1 #画图函数 myDraw=function(){ set.seed(1000);plot(rnorm(10),pch="1", cex=0.5) set.seed(1001);plot(rnorm(10),pch="2", cex=1) set.seed(1002);plot(rnorm(10),pch="3", cex=1.5) set.seed(1003);plot(rnorm(10),pch="4", cex=2) } par(mar=c(3, 3, 0.5, 0.5)) #横着输出-左图 par(mfrow=c(2,2)) #两行两列,mfrow行 myDraw() #竖着输出-右图 par(mfcol=c(2,2)) #两行两列,mfcol列 myDraw()

高级绘图函数hist()包含一个默认的标题,可以使用main=""来禁用它,或ann=F禁用所有标题和标签


使用layout()函数更精细的排版: matrix, widths和heights

如果页面不均等分隔绘制多图,用layout函数分隔页面。它有四个参数,mat,widths,heights和respect。后三个参数有默认值,示例2我们只设置第一个参数mat。它是一个矩阵,表示绘图区分隔的各部分,相同数字的部分合并成一个绘图区,数字也是它们作图时的顺序。下面的矩阵mat有2行3列,我们看看它绘出的图形:

注意:mat参数的值必需从1-n顺序依次取值,不能有间隔。

#示例2 layout布局 par(mar=c(2, 2, 0.5, 0.5)) #layout布局1-left mat = matrix(c(1,1,2,3,4,4), nrow=2, byrow=TRUE) mat # [,1] [,2] [,3] #[1,] 1 1 2 #[2,] 3 4 4 layout(mat) myDraw() #layout布局2-right mat = matrix(c(1,2,3,4,4,4), nrow=2, byrow=TRUE) mat # [,1] [,2] [,3] #[1,] 1 2 3 #[2,] 4 4 4 layout(mat) myDraw()


#示例3 使用widths=和heights=两个参数更精确的控制每幅图的大小。 #widths=各列宽度值组成的一个向量 #heights=各列高度值组成的一个向量 #相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm()来指定。 attach(mtcars) par(mar=c(4,3, 0.5, 0.5)) mat=matrix(c(1,1,2,3),nrow=2,byrow=T) #layout(mat) #左图: 默认左右1:1,上下1:1 layout(mat, widths = c(1,3),heights =c(1,2)) #右图: 左右1:3,上下1:2 plot(1:8) hist(wt) hist(disp) detach(mtcars)

layout()函数能轻松控制最终图形中子图数量和摆放方式,以及这些子图的相对大小。参考help(layout)。

#layout.show()函数用于展示布局 ## create single figure which is 5cm square nf = layout(matrix(1), widths = lcm(5), heights = lcm(5)) #使用lcm()来指定绝对宽高(单位:厘米) layout.show(nf) plot(1:5)

fig参数精细布局,自由嵌入图形: par(fig=c(), new=T)

可以使用fig=c(x1,x2,y1,y2)的方式将若干图形以任意排布方式组合到单幅图中。

需要把画布理解成左下角为坐标(0,0),右上角为(1,1)的一个坐标系。fig=c(x1,x2,y1,y2)来设置该参,x1,x2定位绘图区的x轴范围,y1,y2定位绘图区的y轴范围。使用new=TRUE参数来确认是否在原画布上继续画,还重新在一张新画布上开始画。

#左下角为(0,0),右上角为(1,1)。fig=(x1,x2,y1,y2)表示绘图区间 opar=par(no.readonly = T) par(fig=c(0,0.8,0,0.8)) #fig=参数更精细控制图形布局 plot(mtcars$wt,mtcars$mpg, xlab="Miles Per Gallon", ylab="Car Weight") #top 在上方添加箱线图 par(fig=c(0,0.8,0.4,1),new=T) #添加新图到现有图上,所以要new=T boxplot(mtcars$wt,horizontal = T,axes=F) #left 在右侧添加箱线图 par(fig=c(0.6,1,0,0.8),new=T) boxplot(mtcars$mpg, axes=F) #顶部文字 mtext("Enhanced Scatterplot",side=3,outer=T,line=-5) par(opar)


图形叠加: par(new=T), add=T

#画 hist+density 叠加图 par(mfrow = c(3,1), mar = c(4,1,2,1), oma = c(1,3,0,0)) sapply(levels(iris$Species), function(f) { hist(iris$Sepal.Length[iris$Species == f], main = f, xlab = "", n=25, xlim=c(4,8) ) par(new=T) plot(density(iris$Sepal.Length[iris$Species == f], n=50), xlim=c(4,8), col='red', ann=F, axes=F ) }) mtext(side = 1, outer = T, line = -1, "Sepal.Length", cex = 0.8) mtext(side = 2, outer = T, line = 2, "Freq", cex = 0.8)

叠加hist和density图: 柱状图 + 密度图。左图 通过 par(new=T)来叠加图片。右图 通过次级作图函数叠加图片。

#通过次级作图函数叠加图片。 # 造数据 set.seed(2021) permZ=rnorm(10000, 2, 0.7) #画频率图 # hist(permZ, n=20, xlim=c(-1, 5)) #y=频数 hist(permZ, n=20, freq = F) #y=频率 # 画密度图 lines(density(permZ, n=20), col='red', lty=2, lwd=2 ) # 画标准正如态分布曲线图 #lines(density( rnorm(100000), n=50), col='blue', ann=F) # 更细腻的画法 x1=seq(-1,5,0.1); y1=dnorm(x1, mean=0, sd=1 ) lines(x1, y1, col="blue", lty=2, lwd=2) # 图例 legend('topright', col=c('red','blue'), bty="n", lty=2, lwd=2, legend=c("real", "theoretical"))

对于hist/curve等图,还可以使用 add=T 参数进行叠加。


# 模拟数据 set.seed(202010) a1=rnorm(1000,180,10) a2=rnorm(1000,165,7) # freq = F 频率, freq=T 频数(默认) hist(a1, n=20) #y [0, 200] hist(a1, n=20, freq=T) #y [0,200] hist(a1, n=20, freq=F) #y [0, 0.04] # 频率才表示曲线下面积为1 hist(a1, n=20, freq=F, col="#FF000088", xlim=c(130, 220), ylim=c(0, 0.07), mgp=c(2,1,0), xlab="Height", main="Histogram") #add=T 叠加到上一个hist图上 hist(a2, n=20, freq=F, col="#0000FF88", add=T) #图例 legend("topleft", legend = c("boy", "girl"), fill=c("#FF000088", "#0000FF88"), bty="n") # 叠加曲线 curve( dnorm(x, 180, 10), col = "red", lty = 2, lwd = 2, add = TRUE) curve( dnorm(x, 165, 7), col = "blue", lty = 2, lwd = 2, add = TRUE)