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()。屏幕上什么都不会出现,图直接写进文件。