R语言基础绘图系统(一)——主函数plot及其参数

R语言的基础绘图系统主要由基础包graphics提供,它包含了各式的图形绘制函数,如折线图、直方图、箱形图等。本篇主要介绍plot()函数的用法,它主要用于绘制散点图和折线图。

plot()函数的语法结构如下:

plot(x, y = NULL, type = "p",
     xlim = NULL, ylim = NULL,
     log = "", main = NULL, sub = NULL, 
     xlab = NULL, ylab = NULL,
     ann = par("ann"), 
     axes = TRUE, frame.plot = axes,
     panel.first = NULL, panel.last = NULL, asp = NA,
     xgap.axis = NA, ygap.axis = NA,
     ...)

x和y分别是绘图点的横纵坐标,y可以省略

  • x相当于自变量,y相当于因变量;
  • y没缺省时,必须和x同长度,类型是可以向量化的数据结构,如向量、矩阵的行或列、数组的元素、数据框的列、列表的元素等;
  • y缺省时,x为单列时,y默认为c(1:n),其中n为x的长度;
  • y缺省时,x为两列的矩阵或数据框,则该矩阵或数据框的第一、二列分别对应自变量和因变量;
  • y缺省时,x为三列及以上的矩阵时,则该矩阵的第一、二列分别对应自变量和因变量,其他列忽略;
  • y缺省时,x为三列及以上的数据框时,则绘制各列两两之间的关系。
par(mfrow = c(2,2))
set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)

# x和y是同长度的向量
plot(x, y, main = "x和y是同长度的向量")
# y缺省
plot(x, main = "y缺省")

x2 <- cbind(x, y)
x2df <- as.data.frame(x2)

# x为两列的矩阵
plot(x2, main = "x为两列的矩阵")
# x为两列的数据框
plot(x2df, main = "x为两列的数据框")
set.seed(123)
x <- c(1:5)
y3 <- matrix(runif(15, 0, 10), ncol = 3)
x4 <- cbind(x, y3)
x4df <- as.data.frame(x4)

# x为四列的矩阵时,只绘制前两列之间的关系
plot(x4, main = "x为四列的矩阵")
# x为四列的数据框,绘制各列两两之间的关系
plot(x4df, main = "x为四列的数据框")

参数type控制图形类型

参数type共有9种可选项,默认值为p,表示散点图(points);当为n时不输出任何图形,目的是为其他函数形成空白的绘图区域。具体可参见以下例子:

par(mfrow = c(3,3))
set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)
x2 <- cbind(x, y)

plot(x2, type = "n", main = "不显示")
plot(x2, type = "p", main = "散点图")
plot(x2, type = "l", main = "折线图")
plot(x2, type = "b", main = "散点+间断折线")
plot(x2, type = "c", main = "间断折线")
plot(x2, type = "o", main = "散点+连续折线")
plot(x2, type = "h", main = "垂直于x轴")
plot(x2, type = "s", main = "楼梯形状")
plot(x2, type = "S", main = "反楼梯形状")

main控制绘图标题,sub控制绘图次标题

set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)
x2 <- cbind(x, y)

plot(x2, main = "这是标题", sub = "这是次标题")

坐标轴和边框参数

plot()的一些参数可用于对坐标轴的样式进行修改:
  • xlimylim分别用于控制图形横、纵坐标的范围,默认为NULL,超过xlim或ylim的取值不会被绘制出来;
  • log控制坐标轴的刻度是否为等对数间距,log = "x"表示横坐标轴刻度对数化,log = "y"表示纵坐标轴对数化,log = "xy"或log = "yx"表示横、纵坐标轴均对数化;
  • asp控制纵坐标和横坐标单位刻度的长度之比,比如当asp = 2时表示1单位y轴的刻度是1单位x轴刻度长度的两倍;
  • xgap.axisygap.axis分别控制横、纵坐标刻度值的间隙,取值为大于或等于0的数值,数值越大,间隙越宽;
  • xlabylab分别控制横、纵坐标轴的标签;
  • axes控制是否显示坐标轴和边框,默认为TRUE表示显示,当为FALSE,不显示坐标轴和边框;
  • frame.plot参数用于控制是否绘制边框,此参数不影响坐标轴的显示。
par(mfrow = c(3,3))
set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)
x2 <- cbind(x, y)

# 控制显示范围
plot(x2, xlim = c(1,4), ylim = c(1,9), main = "控制显示范围")
# 坐标轴对数化
plot(x2, log = "x", main = "坐标轴对数化")
# 设置纵坐标与横坐标单位刻度长度之比 
plot(x2, asp = 0.4, main = "单位刻度长度之比")
# 横坐标轴间隙为1
plot(x2, xgap.axis = 1, main = "xgap.axis = 1")
# 横坐标轴间隙为4
plot(x2, xgap.axis = 4, main = "xgap.axis = 4")
# 设置坐标轴标签
plot(x2, xlab = "这是横坐标", ylab = "这是纵坐标", main = "设置坐标标签")
# 不显示坐标轴和边框
plot(x2, axes = F, main = "不显示坐标轴和边框")
# 不显示边框,坐标轴仍显示
plot(x2, frame.plot = F, main = "只显示坐标轴")
# 不显示坐标轴,边框仍显示
plot(x2, axes = F, frame.plot = T, main = "只显示边框")

panel.first和panel.last用于设置网格

调用panel.first时,网格会先于图形绘制,故网格在图形之下;
调用panel.last时,网格会后于图形绘制,故网格在图形之上。

par(mfrow = c(1,2))
set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)
x2 <- cbind(x, y)

plot(x2, type = "l", panel.first = grid(5, 10),
     pch = 0, lwd = 4, col = "blue",
     main = "网格在下")

plot(x2, type = "l", panel.last = grid(5, 10),
     pch = 0, lwd = 4, col = "blue",
     main = "网格在上")

可以看出,由于右图图形在网格之下,因此与网格相交的部分会出现空隙。

ann参数控制标题和坐标轴标签是否显示

ann也是par()函数的参数,默认与par()ann相同,当它为TRUE时,标题和坐标轴标签会正常显示,当为FALSE时,标题和坐标轴标签不会显示。

par(mfrow = c(1,2))
set.seed(123)
x <- c(1:5)
y <- runif(5, 0, 10)
x2 <- cbind(x, y)

# 正常显示标题和坐标轴标签
plot(x2, main = "我是标题", 
     xlab = "这是横坐标", ylab = "这是纵坐标", ann = T)
# 隐藏标题和坐标轴标签
plot(x2, main = "我是标题", 
     xlab = "这是横坐标", ylab = "这是纵坐标", ann = F)

从右图可以看出,当ann = F时即使设置了标题和坐标轴标签,也不会显示。

...中的参数均不是plot()独有的

这些参数即可以在plot()中设置,也可以在一些依赖于plot()函数才能生效的其他函数中进行设置,最后都作用于plot()绘制的图形,因此放到其他函数中进行介绍。

编辑于 2021-02-15 16:52