11.2 折线图

如果将散点图上的点从左往右连接起来,那么就会得到一个折线图。以基础安装中的Orange数据集为例,它包含五种橘树的树龄和年轮数据。现要考察第一种橘树的生长情况,绘制图形11-17。左图为散点图,右图为折线图。可以看到,折线图是一个刻画变动的优秀工具。

11.2 折线图 - 图1

图11-17 散点图与折线图的对比

图11-17是由代码清单11-3中的代码创建的。

代码清单11-3 创建散点图和折线图

  1. opar <- par(no.readonly=TRUE)
  2. par(mfrow=c(1,2))
  3. t1 <- subset(Orange, Tree==1)
  4. plot(t1$age, t1$circumference,
  5. xlab="Age (days)",
  6. ylab="Circumference (mm)",
  7. main="Orange Tree 1 Growth")
  8. plot(t1$age, t1$circumference,
  9. xlab="Age (days)",
  10. ylab="Circumference (mm)",
  11. main="Orange Tree 1 Growth",
  12. type="b")
  13. par(opar)

在第3章中,代码中的基本参数你都已经见过,因此此处不做过多讲解。图11-17中两幅图的主要区别取决于参数type = "b"。折线图一般可用下列两个函数之一来创建:

  1. plot(x, y, type=)
  2. lines(x, y, type=)

其中,xy是要连接的(x, y)点的数值型向量。参数type =的可选值见表11-1。 表11-1 折线图类型

类  型 图形外观
p 只有点
l 只有线
o 实心点和线(即线覆盖在点上)
bc 线连接点(c时不绘制点)
sS 阶梯线
h 直方图式的垂直线
n 不生成任何点和线(通常用来为后面的命令创建坐标轴)

图11-18给出了各类型的示例。可以看到,type = "p"生成了典型的散点图,type = "b"是最常见的折线图。bc间的不同之处即点是否出现或者线之间是否有空隙。type ="s"type ="S"都生成阶梯线(阶梯函数),但一种类型是先横着画线,然后再上升,而第二种类型是先上升,再横着画线。

11.2 折线图 - 图2

图11-18 plot()lines()函数中的type参数值

注意,plot()lines()函数工作原理并不相同。plot()函数是被调用时即创建一幅新图,而lines()函数则是在已存在的图形上添加信息,并不能自己生成图形。

因此,lines()函数通常是在plot()函数生成一幅图形后再被调用。如果对图形有要求,你可以先通过plot()函数中的type = n来创建坐标轴、标题和其他图形特征,然后再使用lines()函数添加各种需要绘制的曲线。

我们以绘制五种橘树随时间推移的生长状况为例,逐步展示一个更复杂折线图的创建过程。每种树都有自己独有的线条。代码见代码清单11-4,结果见图11-19。

代码清单11-4 展示五种橘树随时间推移的生长状况的折线图

  1. Orange$Tree <- as.numeric(Orange$Tree) # 为方便起见,将因子转化为数值型
  2. ntrees <- max(Orange$Tree)
  3. xrange <- range(Orange$age) # (以下10行) 创建图形
  4. yrange <- range(Orange$circumference)
  5. plot(xrange, yrange,
  6. type="n",
  7. xlab="Age (days)",
  8. ylab="Circumference (mm)"
  9. )
  10. colors <- rainbow(ntrees)
  11. linetype <- c(1:ntrees)
  12. plotchar <- seq(18, 18+ntrees, 1)
  13. for (i in 1:ntrees) { # (以下10行) 添加线条
  14. tree <- subset(Orange, Tree==i)
  15. lines(tree$age, tree$circumference,
  16. type="b",
  17. lwd=2,
  18. lty=linetype[i],
  19. col=colors[i],
  20. pch=plotchar[i]
  21. )
  22. }
  23. title("Tree Growth", "example of line plot")
  24. legend(xrange[1], yrange[2], # (以下8行) 添加图例
  25. 1:ntrees,
  26. cex=0.8,
  27. col=colors,
  28. pch=plotchar,
  29. lty=linetype,
  30. title="Tree"
  31. )

11.2 折线图 - 图3

图11-19 展示五种橘树生长状况的折线图(另见彩插图11-19)

在代码清单11-4中,plot()函数先用来创建空图形,只设定了轴标签和轴范围,并没有绘制任何数据点,每种橘树独有的折线和点都是随后通过lines()函数来添加。可以看到,Tree 4和Tree 5在整个时间段中一直保持着最快的生长速度,而且Tree 5在大约664天的时候超过了Tree 4。

代码清单11-4使用了许多R中的编程惯例,这些惯例在第2章、第3章和第4章都已讨论过。通过亲手一行一行地敲入代码,观察可视化结果,你可以检验是否对这些惯例有了深刻的理解。如果答案是肯定的,那么恭喜你,你正在成为严肃的R程序员(声名和机遇都唾手可得了)!在下一节中,我们将会探索各种同时检验多个相关系数的方法。