plot
函数虽然主要用于绘制散点图和折线图,但它实际上是一个比较全能的函数。本篇就介绍如何使用plot
函数绘制其他类型的图形。另外,上篇介绍的高级绘图函数如boxplot
、barplot
等都有参数add
,可以实现图层叠加,而plot
在绘制散点图和折线图时是没有这个参数的,要想在已有图形上叠加散点图或折线图,需要使用低级绘图函数。
低级绘图函数与高级绘图函数的区别在于,它不能新建绘图页面,只能在已有的绘图页面和坐标系统中添加对应的图形要素,前面已经介绍的添加文本、图例的text
、legend
等函数就属于低级函数。本篇也会介绍graphics
包中剩余的低级绘图函数。
1 叠加点、线要素
叠加散点的低级函数是points
,叠加折线的低级函数是lines
,其参数和plot
完全一样,不同之处就是type
参数的默认值。详见graphics | 基础绘图系统(一)——主函数plot及其参数
points(x, y = NULL, type = "p", ...)
lines(x, y = NULL, type = "l", ...)
把
points
的type
参数更改为l
,也能绘制折线图;反之亦然;这两个函数的参数设置同
plot
,同时也能继承来自par
函数中的参数。
除此之外,还有专门的低级函数用于添加直线和线段等要素:
# 直线
abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,
coef = NULL, untf = FALSE, ...)
# 线段
segments(x0, y0, x1 = x0, y1 = y0,
col = par("fg"), lty = par("lty"), lwd = par("lwd"),
...)
# 带箭头线段
arrows(x0, y0, x1 = x0, y1 = y0, length = 0.25, angle = 30,
code = 2, col = par("fg"), lty = par("lty"),
lwd = par("lwd"), ...)
abline
中,a
为直线截距,b
为斜率;h
为水平直线的y轴截距,v
为垂直直线的x轴截距;coef
为使用向量制定直线截距和斜率;
segments
函数绘制点(x0, y0)到点(x1, y1)之间的连线,x0、y0、x1和y1若为向量则执行向量化运算;
arrows
函数绘制点A(x0, y0)到点B(x1, y1)之间的带箭头线段,length
控制箭头长度,angle
控制箭头角度,code
控制箭头方向:1表示从B到A,2表示从A到B,3表示双向箭头。
# 来自官方例子
## Setup up coordinate system (with x == y aspect ratio):
plot(c(-2,3), c(-1,5), type = "n", xlab = "x", ylab = "y", asp = 1)
## the x- and y-axis, and an integer grid
abline(h = 0, v = 0, col = "gray60")
text(1,0, "abline( h = 0 )", col = "gray60", adj = c(0, -.1))
abline(h = -1:5, v = -2:3, col = "lightgray", lty = 3)
abline(a = 1, b = 2, col = 2)
text(1,3, "abline( 1, 2 )", col = 2, adj = c(-.1, -.1))
segments(-3, 1:4, -1, 1:4)
text(-4, 2.5, "segments", col = "red")
points(rep(-2,4), c(1:4), cex = 1.5, pch = 16)
text(-2, 3.5, "points", col = "red")
arrows(c(1,2,4), c(1,2,3), c(2,4,6), c(2,3,4),
length = 0.1, angle = 45, code = 1)
text(4,2, "arrows", col = "red")
abline
中的untf
参数用于坐标轴刻度对数化后,控制是否对直线参数进行对数转换:
FALSE表示不进行对数转换,绘制出的图形直观上仍为直线;
TRUE表示进行转换,绘制出的图形直观上是对数曲线。
x = 1:10
y = 2^x
plot(x, y, log = "y", type = "n")
abline(a = 2, b = 100, col = "red", untf = T)
text(6, 250, "untf = T", col = "red")
abline(a = -2, b = 0.5, col = "blue", untf = F)
text(7, 5, "untf = F", col = "blue")
abline
也可以接受来自线性回归的系数作为参数,留待后续在数学模型板块介绍。
2 其他低级函数
网格
grid(nx = NULL, ny = nx, col = "lightgray", lty = "dotted",
lwd = par("lwd"), equilogs = TRUE)
nx
和ny
分别表示网格在横、纵方向的个数;equilogs
用于在坐标刻度对数化后网格是否仍然按直观上的等间隔分布。
边框线
box(which = "plot", lty = "solid", ...)
在介绍
par
函数时已说明,基础绘图系统中有plot
、figure
、inner
和outer
四种边框线。
矩形
rect(xleft, ybottom, xright, ytop, density = NULL, angle = 45,
col = NA, border = NULL, lty = par("lty"), lwd = par("lwd"),
...)
xleft
、ybottom
、xright
和ytop
分别表示矩形的左、下、右和上四至;density
表示矩形内阴影线的密度,angle
表示阴影线的倾斜角度。
轴须线
rug(x, ticksize = 0.03, side = 1, lwd = 0.5, col = par("fg"),
quiet = getOption("warn") < 0, ...)
轴须线一般用于展现样本中某变量的分布密度:
side
表示坐标轴序号,1-4分别表示下、左、上、右;x
为需要添加轴须线的坐标,一般是数值向量;ticksize
的数值表示轴须的长度,正负表示轴须的方向。
plot(1:10, type = "n")
grid(10, col = "grey")
box("figure", col = "red")
rect(2,2,5,8, density = 20, angle = 45)
rug(rnorm(100000,5))
rug(runif(1000, 1, 10), side = 4)
3 plot的其他用法
3.1 plot.data.frame
plot
的输入对象为数据框时,绘制数据框中变量两两之间的散点图:
plot(x, ...)
x
为数据框。
library(tidyverse)
mtcars %>%
mutate(cyl = factor(cyl),
carb = factor(carb)) %>%
select(cyl, carb, mpg)-> dta
plot(dta)
3.2 plot.factor
当plot
函数的第一个参数x
为因子类型时:
plot(x, y, legend.text = NULL, ...)
若
y
缺失,绘制柱形图;若
y
为数值型,绘制箱型图;若
y
也为因子型,绘制棘状图(堆叠柱形图)。
par(mfrow = c(1,3))
plot(dta$cyl)
plot(dta$cyl, dta$mpg)
plot(dta$cyl, dta$carb)
3.3 plot.formula
plot
也可以像boxplot
和barplot
一样使用变量间的函数形式来指明变量:
plot(formula, data = parent.frame(), ..., subset,
ylab = varnames[response], ask = dev.interactive())
formula
、data
、subset
参数同barplot.formula
;lines
、points
和text
等低级函数也有此用法。
par(mfrow = c(1,2))
plot(mpg ~ cyl, data = dta)
plot(carb ~ cyl, data = dta)
3.4 plot.histogram
plot
可以在hist
函数的基础上绘制直方图:
plot(x, freq = equidist, density = NULL, angle = 45,
col = NULL, border = par("fg"), lty = NULL,
main = paste("Histogram of",
paste(x$xname, collapse = "\n")),
sub = NULL, xlab = x$xname, ylab,
xlim = range(x$breaks), ylim = NULL,
axes = TRUE, labels = FALSE, add = FALSE,
ann = TRUE, ...)
x
为hist
函数的输出对象。
a <- hist(dta$mpg, plot = F)
plot(a)
3.5 plot.function
plot
也可以像curve
函数一样绘制函数图象:
plot(x, y = 0, to = 1, from = y, xlim = NULL, ylab = NULL, ...)
x
为函数名;y
此时等价于curve
中的from
参数。
plot(sin, -2*pi, 2*pi)