Menu

R 语言 plot() 函数:图形类型、颜色、pch 和图例

R 的 plot() 函数怎么用:图形类型、标题和坐标轴标签、颜色、点的符号(pch)、用 lines() 和 abline() 叠加图层,以及图例。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

plot() 是 R 的一站式绘图函数

在 R 中画图,用两个长度相同的数值向量调用 plot(x, y) 即可。R 为每一对值画一个点,第一个向量对应横轴,第二个对应纵轴,并自动用变量名标注坐标轴:

x <- 1:12
y <- c(2, 5, 4, 8, 9, 12, 11, 15, 14, 18, 17, 21)

plot(x, y)

结果是十二个空心圆点,随着 x 增大稳步上升。入门门槛就这么低:不用装包,不用任何设置。plot() 随基础 R 一起提供,大多数快速探索用的图形背后都是它。

因为本页的代码运行器只显示文本输出,本文中的绘图调用都是静态代码片段,把它们粘贴到 RStudio 或任何本地 R 会话中就能看到图。在这里能运行的是数据准备部分。这本来也是个好习惯:画图之前先看看数字。

如果只传入一个向量,plot(y) 会把索引位置 1、2、3……作为横轴,用来快速查看一串测量值很方便。

选择图形类型

type 参数决定每对值怎么画:

plot(x, y, type = "p")   # points (the default)
plot(x, y, type = "l")   # a connected line
plot(x, y, type = "b")   # both: points joined by line segments
plot(x, y, type = "h")   # vertical bars from zero, like a spike chart
plot(x, y, type = "s")   # a step function

type = "l" 把散点变成折线图,任何随时间测量的数据都适合用它。type = "b" 在显示趋势的同时,还能看到每一个观测值。type = "h" 从零向上为每个值画一条细竖线,type = "s" 画成阶梯状,每个值保持不变直到下一个值出现,适合价格或库存数量这种跳跃式变化的量。

标题、标签和颜色

没有标签的图只是写给自己看的笔记。三个参数可以解决这个问题:main 设置标题,xlab 和 ylab 设置坐标轴标签。col 设置颜色:

plot(x, y,
     type = "b",
     main = "Monthly signups",
     xlab = "Month",
     ylab = "Signups (thousands)",
     col  = "steelblue")

col 接受三种值:

  • 颜色名:"red"、"steelblue"、"tomato"、"darkgreen"。R 认识 657 种颜色名,运行 colors() 可以列出全部。
  • 十六进制颜色代码:col = "#2C7FB8",和 CSS 里的写法完全一样。
  • 颜色向量:每个点一个颜色,按分组给点上色就是这么做的:col = c("tomato", "steelblue")[group],其中 group 是一个因子。

用 pch 设置点的符号,用 cex 和 lwd 设置大小

默认的空心圆用来探索数据没问题,但拿给别人看就显得模糊不清。pch(plotting character,绘图字符)用来选择符号,编号从 0 到 25:

plot(x, y, pch = 19)                     # solid circle - the usual choice
plot(x, y, pch = 17)                     # solid triangle
plot(x, y, pch = 21, col = "black",
     bg = "gold")                        # fillable circle: border + fill

有两个编号值得记住。pch = 19 是大多数成品图使用的实心圆。pch = 21 到 25 是可填充的符号:col 设置边框颜色,bg 设置内部颜色,这样就能得到双色的点。

大小和线条样式也有各自的参数:

  • cex 缩放点的大小:cex = 1.5 让点变成原来的 1.5 倍。
  • lwd 设置 type = "l" 或 "b" 时的线宽:lwd = 2 是一条清晰、易读的线。
  • lty 设置线型:lty = 1 实线,2 虚线,3 点线。

叠加图层:points()、lines() 和 abline()

plot() 会开始一张新图。要在已有的图上面继续画,就用它的几个搭档函数,它们会添加到当前的图上,而不是替换它:

plot(x, y, type = "l", lwd = 2, col = "steelblue",
     main = "Actual vs. target")

points(x, y, pch = 19, col = "steelblue")   # add the observations
lines(x, x * 1.5, lty = 2, col = "gray40")  # add a second series, dashed
abline(h = 10, col = "tomato")              # horizontal reference line at y = 10

abline() 是画参考线的工具,有三种用法:

  • abline(h = 10):在纵轴的某个值处画一条水平线。
  • abline(v = 6):在横轴的某个值处画一条竖直线。
  • abline(a = 0, b = 1.5):按截距 a 和斜率 b 画一条直线。

它最妙的用法是:传给它一个拟合好的模型,它就会帮你画出回归线,abline(lm(y ~ x))。这一行代码就让散点图有了说服力;散点图指南会在此基础上继续讲。

有一条规则要注意:坐标轴的范围由第一次调用 plot() 决定。如果叠加的数据超出了这个范围,超出的部分会被裁掉,所以在最初的 plot() 中,要把 xlim = 和 ylim = 设得足够大,能容纳你打算添加的所有内容。

添加图例

一张图有不止一组数据时,就需要图例。legend() 的第一个参数是位置关键字:"topright"、"topleft"、"bottomright"、"bottomleft"、"top"、"bottom" 或 "center"(这些是 R 的字面字符串,所以代码里要保持英文),然后是标签和对应的样式:

legend("topright",
       legend = c("Actual", "Target"),
       col    = c("steelblue", "gray40"),
       lty    = c(1, 2),
       pch    = c(19, NA),
       lwd    = 2)

col、lty 和 pch 向量必须和 legend 逐项对应:第一个标签对应第一个颜色,依此类推。某组数据不适用的样式用 NA 表示(这里目标线没有点)。位置关键字把图例框固定在绘图区域的某个角上,选一个没有数据的角就好。

多面板与保存为文件

要在一张图里显示多个图,先设置绘图网格再画:par(mfrow = c(1, 2)) 把设备分成一行两列,接下来的两次 plot() 调用会按顺序填满这两个面板。画完后用 par(mfrow = c(1, 1)) 恢复,不然之后的图都会很小。

保存为文件的原理是把绘图输出重定向到一个文件设备,而不是屏幕:

png("signups.png", width = 800, height = 600)

plot(x, y, type = "b", pch = 19, col = "steelblue",
     main = "Monthly signups", xlab = "Month", ylab = "Signups")

dev.off()

png() 和 dev.off() 之间的所有内容都会写进文件,屏幕上什么都不会出现。忘了写 dev.off() 是经典的 bug:在你关闭设备之前,文件会一直被锁定,而且是空的。pdf()、jpeg() 和 svg() 的用法完全一样。

要点回顾

  • plot(x, y) 会立即画图;type = 在点("p")、线("l")和点线("b")之间切换。
  • main、xlab、ylab 为图加标签;col 接受颜色名(colors() 中有 657 种)或十六进制颜色代码。
  • pch = 19 是实心圆;pch = 21 至 25 把边框(col)和填充(bg)分开设置;cex、lwd、lty 控制大小和线条样式。
  • points()、lines() 和 abline() 在已有的图上叠加图层,abline(lm(y ~ x)) 一次调用就能加上回归线。
  • legend("topright", ...) 为各组数据加标签;png(...) 加 dev.off() 把图保存为文件。

下一篇:直方图,拿到一个新数据集时,你最先会用到的单变量图形。

常见问题

R 中怎么画图?

用两个长度相同的数值向量调用 plot(x, y)。R 会打开一个图形窗口,每一对值画一个点。加上 type = "l" 画折线图,用 main、xlab 和 ylab 加标题,用 col 设置颜色。

R 中的 pch 是什么意思?

pch(plotting character,绘图字符)用来选择点的符号,编号从 0 到 25。pch = 19 是大多数人想要的实心圆。21 到 25 号符号的填充是单独设置的:col 设置边框,bg 设置内部。

R 中怎么给图加图例?

在画完图之后调用 legend(),第一个参数是位置关键字,比如 "topright",再传入标签向量 legend =,以及和图中一致的 col、pch 或 lty 值。

怎么把 R 的图保存成文件?

画图前先打开一个文件设备,画完后关闭它:先 png("myplot.png", width = 800, height = 600),然后是画图代码,最后 dev.off()。屏幕上什么都不会出现,图直接写进文件。

Coddy 编程语言插图

和 Coddy 一起学编程

开始