创建折线图
对于时间序列数据,折线图能更清楚地展示随时间发展的趋势和变化。如图 7-13 所示,
创建折线图,只需要在调用 plot( )时设置 type= "l"即可:
t <- 1:50
y <- 3 * sin(t * pi /60) + rnorm(t)
plot(t, y, type = "l",
main = "Simple line plot")
图 7-13
1.自定义线的类型和宽度
就像散点图中 pch 能够自定义点的类型一样,lty 用于指定折线图中线的类型。图 7-14
展示了 R 支持的 6 种线型:
lty_values <- 1:6
plot(lty_values, type = "n", axes = FALSE, ann = FALSE)
abline(h =lty_values, lty = lty_values, lwd = 2)
mtext(lty_values, side =2, at = lty_values)
title("Line types (lty)")
图 7-14
上述代码用 type= "n"创建一个带有正确坐标轴范围的空画布,并关闭坐标轴的显示,
另一个函数 abline( )用于绘制线型不同但线宽相等的水平线(lwd = 2)。mtext( )函
数用于在画布边缘添加文本。注意,abline ( )和 mtext( )的参数是向量化的,所以
不需要用 for 循环来逐行绘制或添加边缘文本。
下面的例子将演示如何运用 abline( )在图中添加辅助线。首先,我们创建前文所
述的 y 关于时间 t 的折线图(上文创建第 1 幅折线图时定义的 y 与 t 的关系)。假设我们
还想画出 y 在这段时间内的均值和取值范围(在这段时间中,y 出现了最大值和最小值)。
使用 abline( ),可以方便地绘制出这些辅助线,并用不同的线型和颜色加以区分,如
图 7-15 所示。
plot(t, y, type = "l", lwd = 2)
abline(h = mean(y), lty = 2, col = "blue")
abline(h = range(y), lty = 3, col = "red")
abline(v = t[c(which.min(y), which.max(y))], lty = 3, col = "darkgray")
title("Line plot with auxiliary lines")
图 7-15
2.绘制多阶段折线图
还有一种折线图,不同线型在同一张图中混合使用,这种图称作多阶段折线图。一种
典型的多阶段折线图是:第 1 阶段为历史数据,第 2 阶段为预测数据。假设数据 y 的第 1
阶段包含前 40 个观测值,剩下的数据点是基于历史数据的预测。如图 7-16 所示,我们想
用实线表示历史数据,用虚线表示预测数据。这里,我们先把第 1 阶段的数据绘制出来,
并调用 lines( )将用虚线绘制第 1 阶段的预测数据添加到原有图形中。注意 lines( )
对折线图的作用就相当于 points( )对散点图的作用:
p <- 40
plot(t[t <= p], y[t <= p], type = "l",
xlim =range(t), xlab = "t")
lines(t[t >= p], y[t >= p], lty = 2)
title("Simple line plot with two periods")
图 7-16
3.绘制带点的折线图
有时,我们想要强调观测值是离散的,或者只是单纯地为了使图形更加清晰,把折线和点
画到同一张图上是一种有效的方式。方法很简单,只要绘制一幅折线图,再用points( )把
同一数据所对应的点添加至该折线图中即可,如图 7-17 所示。
plot(y, type = "l")
points(y, pch = 16)
title("Lines with points")
图 7-17
另一种等效方法是:先用 plot( )函数绘制散点图,然后用 lines( )函数将同一数
据对应的折线图添加至该散点图中。因此,以下代码应生成与上例相同的图表:
plot(y, pch = 16)
lines(y)
title("Lines with points")
4.绘制带图例的多序列图
一幅完整的多序列图包括用折线和点表示的多个序列和一个说明图中序列的图例。
以下代码随机生成两个对应时间 x 的序列 y 和 z,并将它们绘制在同一幅图中,如
图 7-18 所示。
x <- 1:30
y <- 2 *x +6 * rnorm(30)
z <- 3 * sqrt(x) +8 * rnorm(30)
plot(x, y, type = "l",
ylim = range(y, z), col = "black")
points(y, pch = 15)
lines(z, lty = 2, col = "blue")
points(z, pch = 16, col = "blue")
title ("Plot of two series")
legend("topleft",
legend = c("y", "z"),
col = c("black", "blue"),
lty = c(1, 2), pch = c(15, 16),
cex = 0.8, x.intersp = 0.5, y.intersp = 0.8)
图 7-18
上述代码先用plot( )和points( )创建y的点线图,再用lines( )和points( )
把 z 对应的点线添加到图中。最后,我们用 legend( )在左上角添加图例以分别说明表
示 y 和z 的线和点的形式。注意 cex 用于设置图例的字体大小,x.intersp 和 y.intersp
用于图例的微调。
另一种有用的折线图是阶梯型折线。我们在 plot( )和 lines( )中设置 type="s"来
创建一个简单的阶梯图,如图 7-19 所示。
plot(x, y, type = "s",
main = "A simple step plot")
图 7-19