【NEW-3.0】R-图形初阶
前言
千呼万唤始出来,终于到了图形这部分,这部分主要说明如何创建和保存图形以及图形相关常用的参数使用。
图形相关基础函数
使用图形
首先,先在你的R上运行如下代码:
1 | # 创建一个 1.jpg 的文件 |
运行后会在当前工作目录下产生一个名称为1.jpg
的图片,如下所示:
这就是所生成的图形,利用的是trees
数据所生成的图形。
图形输出
用于图形输出的函数如下所示:
函数 | 功能 |
---|---|
pdf('filename.pdf') |
输出PDF 文件 |
png('filename.png') |
输出PNG 文件 |
jpeg('filename.jpg/jpeg') |
输出JPG 文件 |
bmp('filename.bmp') |
输出BMP 文件 |
需要注意的是使用上述函数输出图片后要使用dev.off()
函数来完成文件输出。
关于
JPG
和JPEG
的区别可以参考我这篇文章琐碎问题记录。
图形参数
我们可以通过修改图形的相关参数来实现我们想要的图形效果,例如图形颜色,图形样式等。
修改图形参数的方式有两种,第一种是使用par()
函数来修改全局参数,第二种是在定义图形的时候定义相关参数。关于par()
函数的使用后续说明。
在前面的代码中,以及试验过了plot()
函数的输出结果,即图形样式。函数原型如下:
1 | plot(x, y = NULL, type = "p", xlim = NULL, ylim = NULL, |
- **
x
**:即x
轴数据 - **
y
**:即y
轴数据
符号和线条
可以通过设置以下参数来修改图形的符号和线条类型:
参数 | 说明 |
---|---|
pch |
指定绘制点时使用的符号 |
cex |
指定符号的大小。cex 是数值型,默认大小为1,2表示放大2倍 |
lty |
指定线条类型 |
lwd |
指定线条宽度。默认值为1,同cex |
关于**pch
值对应的点符号样式**如下图:
关于lty
参数对应线条的类型样式如下图:
颜色
用于颜色指定的相关参数如下:
参数 | 说明 |
---|---|
col |
设置绘图颜色。某些函数可以接受颜色值向量并自动循环使用。例如:col=c('red','green) 则绘制的图线先红色后绿色,周而复始. |
col.axis |
坐标轴刻度文字的颜色 |
col.lab |
坐标轴标签的颜色 |
col.main |
标题颜色 |
col.sub |
副标题颜色 |
fg |
前景色(即图表框的颜色) |
bg |
背景色 |
颜色的指定可以通过颜色索引,颜色名称,十六进制颜色值,RGB值或者HSV值来指定颜色。例如:
1 | col=1 |
文本属性
图形参数同样可以用来指定字号,字体和字样等,参数如下所示:
参数 | 说明 |
---|---|
cex |
表示绘图大小,默认为1 |
cex.axis |
坐标轴刻度字体的大小,大小设置同上 |
cex.lab |
坐标轴标签的大小,大小设置同上 |
cex.main |
标题的大小,大小设置同上 |
cex.sub |
副标题的大小,大小设置同上 |
————- | ————————————– |
font |
接收整型参数,用于指定绘图字体样式。(1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体) |
font.axis |
坐标轴刻度字体样式,同上 |
font.lab |
坐标轴标签字体样式,同上 |
font.main |
标题字体样式,同上 |
font.sub |
副标题字体样式,同上 |
ps |
字体磅值(1磅 $\approx$ $\frac{1}{72}$ 英寸),文本最终大小=$ps \times cex$ |
family |
绘制文本时使用的字体族。 |
添加文本,自定义坐标轴和图例
图形尺寸于边界尺寸
同样的可以通过参数来控制生成图形的尺寸,如下所示:
参数 | 说明 |
---|---|
pin |
以英寸表示图形的尺寸(宽和高) |
mai |
以数值向量表示边界的大小,顺序是下,左,上,右,单位为英寸 |
mar |
以数值向量表示边界大小,顺序同上,单位是英分 |
1英寸=2.54厘米,1英分= $\frac{1}{12}$ 英寸
标题
需要高级绘图函数(例如plot
,hist
,boxplot
)允许设定更多的自定义内容,例如标题,图例等。
某些高级绘图函数默认包含了标题和标签,可以通过设置
ann=FLASE
来移除它们
可以使用title()
函数为图形添加标题和坐标轴标签,函数原型如下:
1 | title(main = NULL, sub = NULL, xlab = NULL, ylab = NULL, |
NA是Not Available的缩写,是一种占位符,可以理解为值=NA,但是不存在
代码示例:
1 | title(main = '这是主标题',sub = '这是副标题',xlab = '这是横坐标标签',ylab = '这是纵坐标标签') |
坐标轴
可以使用函数axis()
来创建自定义坐标轴。函数原型如下:
1 | axis(side, at = NULL, labels = TRUE, tick = TRUE, line = NA, |
参数说明如下:
参数 | 说明 |
---|---|
side |
整型,表示在图形哪边绘制坐标轴(1=下,2=左,3=上,4=右) |
at |
数值型向量,表示需要绘制刻度线的位置 |
labels |
字符型向量,表示置于刻度线旁边的文字标签(如果为NULL 则直接使用at 中的值) |
pos |
坐标轴线绘制位置的坐标(即与另一条坐标轴相交的位置) |
lty |
线条类型 |
col |
线条和刻度线的颜色 |
las |
标签是否平行(=0)或者垂直于(=2)坐标轴 |
tck |
刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为 $-0.01$ |
创建自定义坐标轴时,应该禁用高级绘图函数自动生成的坐标轴。
- 参数
axes=FLASE
将禁用全部坐标轴(包括坐标轴框架线) - 参数
xaxt='n'
和yaxt='n'
将分别禁用 X 轴或者 Y 轴(会留下框架线,只是去除了刻度)
现在运行如下代码示例:
1 | # 定义数据 |
运行结果生成的图形如下:
关于上述语法解释,**line()
函数是绘制图线**,其函数原型如下:
1 | line(x, y, iter = 1) |
其中参数type
的值以及功能如下:
参数 | 功能 |
---|---|
type='p' |
表示绘制点 |
type='l' |
表示绘制线 |
type='b' |
表示绘制点和线 |
type='c' |
表示曲线连接的空点 |
type='s' 或者type='S' |
表示阶梯状线 |
type='h' |
表示直方图状垂直线 |
type='n' |
表示不产生任何点或者线 |
round()
函数是进行四舍五入的函数,函数原型如下:
1 | round(x, digits = 0) |
x
:需要处理的数据digits
:要使用的小数位数或者有效数字的数目
mtext
函数是将文本写在图形区域的是个边距的周围。函数原型如下:
1 | mtext(text, side = 3, line = 0, outer = FALSE, at = NA, |
相关参数说明如下:
参数 | 说明 |
---|---|
text |
标题内容 |
side |
文本在坐标轴边框的位置(1=下,2=左,3=上,4=右) |
line |
距离坐标轴边框的距离,值越大越远 |
las |
文字是否平行(=0)或者垂直于(=2)坐标轴 |
次要刻度线
如上创建的图形都只拥有主刻度线,没有次刻度线。想要创建次刻度线,需要使用Hmisc
宏包的minor.tick()
函数。minor.tick()
函数原型如下:
1 | minor.tick(nx=2, ny=2, tick.ratio=0.5, x.args = list(), y.args = list()) |
nx
:指在X轴分割的区域,2即次刻度线将每个区间分为两个区域ny
:指在Y轴分割的区域,同上tick.ratio
:表示次刻度相对于主刻度线的大小比例
参考线
函数abline()
可以用来为图形添加参考线,函数原型如下:
1 | abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL, |
h
:Y 轴的参考线v
:X 轴的参考线
代码实例:
1 | # 在垂直 3 坐标和水平 2 坐标,用虚线话画出红色的参考线 |
图例
当图形中存在多个数据的时候,使用图例可以帮助读者快速区分数据曲线。
可以使用函数legend()
来添加图例。函数原型如下:
1 | legend(x, y = NULL, legend, fill = NULL, col = par("col"), |
参数说明如下:
参数 | 说明 |
---|---|
location |
有两种定位图例位置的方法,第一种是通过指定 X,Y 的值来指定图例的位置(以图例左上角为顶点),第二种方式是通过指定关键字,"bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right" and "center" ,如果使用关键字指定位置,可以通过inset 参数来调整其距离边框的位置。 |
title |
图例的标题 |
代码示例:
1 | legend("topleft",title = '图例标题',inset = 0.2,c('A','B'),pch=c(2,5)) |
效果如下:
文本标注
可以通过函数text()
和mtext()
将文本添加到图形,text()
可以向绘图区域内添加文字,而mtext()
是向绘图区域四周添加文字。函数原型如下:
1 | # mtext |
mtext
函数已经在坐标轴部分说明了,text
的相关参数说明如下;
x
:指定 X 轴的位置y
:指定 Y 轴的位置label
:标注内容pos
:标准内容和点的偏移量
代码示例:
1 | # 创建数据 |
运行效果:
数学标注
同样的,你也可以使用类似于Tex
中的写法为图形添加数学符号和公式。可以利用plotmath()
函数来实现,如果你希望看到即时效果,可以尝试运行demo(plotmath)
来查看。
代码示例:
1 | # 使用 expression() 来呈现数学公式 |
关于
Tex
/LaTex
用法说明,可以看我这篇文章LaTex基础(上)
图形的组合
在R中使用函数par()
或者layout()
可以组合多幅图形为一幅总括图。
可以通过在par()
函数中使用图形参数mfrow=c(nrows,ncols)
来创建按行填充的图形矩阵,或者可以使用**nfcol=c(nrows,ncols)
来按列填充矩阵**。代码示例:
1 | # 绑定数据源 |
运行效果如下:
接下来尝试使用layout()
函数绘制组合图形,其函数原型如下:
1 | layout(mat, widths = rep.int(1, ncol(mat)), |
mat
:矩阵类型参数,四个参数表示四个位置
代码示例:
1 | attach(trees) |
运行效果如下:
为了更精细的控制每幅图的大小,可以有选择性的在layout()
函数中使用heights
和widths
两个参数。
widths
和heights
:两个函数都接收一个向量参数,是一种比例
相对高度可以通过数值来指定,绝对高度通过函数lcm()
来指定。代码示例:
1 | attach(trees) |
运行效果如下:
图形的精细化控制
在某些情况下,你可能希望通过多个图形叠加来形成其他图形,这个时候就需要使用fig
参数来实现。代码示例如下:
1 | attach(trees) |
new=TRUE
:意思是绘制图形的时候不清楚原图像,而是继续叠加绘图
运行效果如下:
**fig
参数接收一个四参数的向量,它表示的是相对位置,其参数类型为fig=c(x1,x2,y1,y2)
**,代码par(fig=c(0,0.8,0,0.8))
的意思是规定图形的绘制范围为:横向从 0 到 0.8 这个比例范围内,纵向 0 到 0.8 这个比例范围内。
如果你在绘图过程中报错
figure margins too large
,则说明绘图已经超出绘图设备区域,适当缩小绘图区域即可。
End
这部分初步理解和利用图形相关参数来实现一些基本的自定义图形。