R语言实战之图形入门

R是一个惊艳的图形构建平台

1
2
3
4
5
6
7
8
9
> pdf("mygraph.pdf")
> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on Weight")
> detach(mtcars)
> dev.off()
  • dev.cur(): 当前输出的图形
  • dev.list()
  • dev.next(which = dev.cur()): 下一个图形
  • dev.prev(which = dev.cur()): 上一个图形
  • dev.off(which = dev.cur()): 停止输出图形
  • dev.set(which = dev.next()): 设置当前输出图形
  • dev.new(..., noRStudioGD = FALSE): 创建新的输出图形

图形参数

  • 函数par()可以修改图形参数
    • pch: 绘制点时使用的符号,从0~24分别代表不同符号,即picture char
    • lty: 线条类型1~6,即line type
    • lwd: 线条宽度,默认值的倍数,即line width
    • 还有其它参数,如颜色、文本大小、字体等
1
2
3
4
5
6
7
8
9
10
11
12
13
> 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")
> opar <- par(no.readonly=TRUE) # 备份旧选项
> par(pin=c(2,3))
> par(lwd=2,cex=1.5)
> 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) # 恢复

颜色

  • 函数colors()返回所有颜色
    • col: 边界颜色,如col=c(“green”,”red”)
    • col.axis: 坐标轴刻度文字颜色
    • col.lab: 坐标轴标签的颜色
    • col.main: 标题颜色
    • col.sub: 副标题颜色
    • fg: 前景色
    • bg: 背景色

文本

  • cex: 指定符号的大小,表示默认绘图符号的缩放倍数,默认是1,如1.5,0.5等
  • cex.axis: 坐标轴刻度文字缩放
  • cex.lab: 坐标轴标签缩放
  • cex.main: 标题缩放
  • cex.sub: 副标题缩放

字体

  • 函数quartzFonts()在Mac平台创建字体族
  • 函数names(pdfFonts())获取PDF支持的输出字体
  • 函数names(postscriptFonts())获取PostScript图片支持的输出字体
  • 字体参数:
    • font: 整数,表示字体样式,1=常规,2=粗体,3=斜体,4=斜粗体,5=符号字体
    • font.axis: 坐标轴刻度文字
    • font.lab: 坐标轴标签文字
    • font.main: 标题文字
    • font.sub: 副标题文字
    • ps: 字体大小,文本最终大小=ps * cex
    • family: 字体族,如serif=衬线,sans=无衬线,mono=等宽

尺寸

  • pin: 英寸单位表示的宽、高
  • mai: 数值向量表示的边界大小,顺序是下、左、上、右,英寸单位
  • mar: 数值向量表示的边界大小,顺序是下、左、上、右,默认是c(5,4,4,2)+0.1,英分单位(一英分等于十二分之一英寸)

文本、坐标轴与图例

1
2
3
4
5
6
> plot(dose, drugA, type="b",
+ col="red",lty=2,pch=2,lwd=2,
+ main="Main Title",
+ sub="sub title",
+ xlab="Dosage",ylab="Drug Response",
+ xlim=c(0,60),ylim=c(0,70))

文本标题

  • 函数title()添加标题与坐标轴标签, ann=FALSE可以禁掉绘图函数自带的标题和标签,从而使用自定义的
1
2
3
4
> title(main="Main Title", col.main="red",
+ sub="sub title", col.sub="blue",
+ xlab="X lable",ylab="Y lable",
+ col.lab="green", cex.lab=0.75)

坐标轴

  • 函数axis()创建自定义坐标轴:
    • axes=FALSE, xaxt="n", yaxt="n" 分别禁掉绘图函数自带的坐标轴、x轴、y轴
    • side: 在哪边绘制坐标轴,1=下,2=左,3=上,4=右
    • at: 绘制刻度线位置
    • labels: 刻度线旁边的文字标签,NULL=使用at中的值
    • pos: 坐标轴线相交的坐标位置
    • lty
    • col
    • las: 标签是否平行于坐标轴,0=平行,2=垂直
    • tck: 刻度线的长度,0=禁用刻度,1=绘制网格线,负值=图形外侧,正值=图形内侧,默认-0.01

次要刻度线

  • 软件包Hmisc中的minor.tick()创建次要刻度线
    • nx,ny: 两个主刻度线中划分几个次要刻度线
    • tick.ratio: 相对于主刻度线的大小比例,一般使用0.5
1
2
3
> install.packages("Hmisc")
> library(Hmisc)
> minor.tick(nx=2, ny=3, tick.ratio=0.5)

参考线

  • 函数abline()添加参考线
1
2
> abline(h=yvalues,v=xvalues)
> abline(h=c(1,5,7), v=seq(1,10,2), lty=2,col='blue')

图例

  • 函数legend()添加图例,对每个线条添加说明
    • location: 图例位置
    • title: 图例标题
    • legend: 图例标签组成的字符型向量
    • horiz=TRUE: 水平放置图例
1
2
> legend("topleft", inset=0.05, title="Drug Type", legend=c("A","B"),
+ lty=c(1,2), pch=c(15,17), col=c("red","green"))

文本标注

  • 函数text(): 将文本添加到图形内部,一般用来标示图形中的点
  • 函数mtext(): 将文本添加到图形的四个边界之一
    • location: 文本位置
    • pos: 文本相对位置参数的方位,1=下,2=左,3=上,4=右
    • side: 用来放文本的边界,同上
1
2
3
4
5
> par(opar)
> attach(mtcars)
> plot(wt,mpg,main="Main Title",xlab="Weight",ylab="Mileage",pch=18,col="blue")
> text(wt,mpg,row.names(mtcars), cex=0.6, pos=4, col="red")
> detach(mtcars)

数学标注

  • 函数plotmath()用来标注数学公式

图形的组合

一般通过par()图形参数或函数layout()来进行图形组合。

par()图形参数方式

  • mfrow = c(nrows,ncols):按行填充图形矩阵
  • mfcol = c(nrows,ncols): 按列填充图形矩阵
1
2
3
4
5
6
7
8
9
10
> attach(mtcars)
> par(opar)
> opar <- par(no.readonly=TRUE)
> par(mfrow=c(2,2)) # 图形参数
> plot(wt, mpg, main="Scatterplot of wt vs. mgp")
> 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)

layout()方式

  • layout(mat): mat矩阵指明了所要组合图形的所在位置
1
2
3
4
5
6
7
> attach(mtcars)
> # 一个2*2的矩阵,第一行两列都属于第一个图形,第二行的分别是第二、三个图形
> layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
> hist(wt)
> hist(mpg)
> hist(disp)
> detach(mtcars)
  • 通过widths,heights来精确控制每幅图像大小
1
2
3
4
5
6
7
> attach(mtcars)
> # 矩阵中两行的高度是1/2,每行内两列宽度是3/1
> 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=精细控制

  • 左下角坐标是(0,0)
  • 右上角坐标是(1,1)
  • 参数fig=c(x1,x2,y1,y2): 横向宽度占用位置,竖向高度占用位置,如fig=c(0, 0.8, 0, 0.8)
  • fig默认新建一副图形,如果是添加到现有图形,增加参数new=TRUE
1
2
3
4
5
6
7
> par(fig=c(0, 0.8, 0, 0.8), new=TRUE)
> # 这里是有0.55,而不是0.8,是为了不至于离的太远;
> # 位置不是绝对的,需要不断调整、尝试,找到最佳位置。
> par(fig=c(0, 0.8, 0.55, 1), new=TRUE)
> par(fig=c(0.65,1, 0, 0.8), new=TRUE)
吴羽舒 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!