折线图
如果将散点图上的点从左往右连接起来,就会得到一个折线图,以基础安装中的Orange数据集为例,它包含五种橘树的树龄和年轮数据,现要考察第一种橘树的生长情况:
opar <- par(no.readonly=TRUE) #设置初始化参数
par(mfrow=c(1,2)) #把画布分成2部分
t1 <- subset(Orange, Tree==1) #加载数据集,考察第一种橘树的生长情况
plot(t1$age, t1$circumference, xlab="Age (days)", ylab="Circumference (mm)",
main="Orange Tree 1 Growth") #画出树的年龄和生长周长的散点图
plot(t1$age, t1$circumference, xlab="Age (days)", ylab="Circumference (mm)",main="Orange Tree 1 Growth", type="b") #画出树的年龄和生长周长的折线图
par(opar) #还原画布设置
折线图一般可用下列两个函数之一来创建:
plot(x, y, type=)
lines(x, y, type=)
x和y是要连接的(x, y)点的数值型向量。
下图是折线的类型:
上图显示了plot()和lines()函数中的type参数值在绘图中的具体表现,值得注意的是plot()和lines()函数工作原理并不相同,plot()函数是在被调用时创建一幅新图,而lines()函数则是在已存在的图形上添加信息,并不能自己生成图形。
例子:我们可以先通过plot()函数中的type="n"选项来创建坐标轴、标题和其他图形特征,然后再使用lines()函数添加各种需要绘制的曲线。我们以绘制五种橘树随时间推移的生长状况为例,逐步展示一个更复杂折线图的创建过程。每种树都有自己独有的线条。代码如下:
Orange$Tree <- as.numeric(Orange$Tree) #把变量Orange$Tree设置为数值型
ntrees <- max(Orange$Tree) #取出树的类型有多少种
xrange <- range(Orange$age) #range 返回一个包含所有给定参数的最小值和最大值的向量。
yrange <- range(Orange$circumference)
plot(xrange, yrange, #绘制散点图的两个参数
type="n", # type="n"选项来创建坐标轴
xlab="Age (days)", #设置x轴的名称
ylab="Circumference (mm)" #设置y轴的名称
)
colors <- rainbow(ntrees) #设置每种树不同的颜色
linetype <- c(1:ntrees) #设置从1到ntrees总共几种不通过的线形
plotchar <- seq(18, 18+ntrees, 1) #设置线条中图标不同的类型,圆形、方形等
for (i in 1:ntrees) { #设置i的取值范围
tree <- subset(Orange, Tree==i) #取出每一个子树
lines(tree$age, tree$circumference, #在原来散点图的基础上添加信息
type="b", #设置线形为点线
lwd=2, #lwd是设置线条的宽度(粗细)
lty=linetype[i], # lty设置线条类型,比如i=2意思是绘制虚线
col=colors[i], # col设置线条的颜色
pch=plotchar[i] #pch设置线条中图标不同的形状,比如pch=17是三角标识
)
}
title("Tree Growth", "example of line plot") #设置主标题和副标题
legend(xrange[1], yrange[2], #绘制图例,xrange[1], yrange[2]用来定位图例的x轴和y轴坐标
1:ntrees, #设置绘制线条的数目
cex=0.8, #设置图例中字体的大小
col=colors, #指定图例中线条的颜色
pch=plotchar, #指定图例线形中不同的图标
lty=linetype, #指定图例的线形
title="Tree" #指定图列的标题
)
结果分析:plot()函数先用来创建空图形,只设定了轴标签和轴范围,并没有绘制任何数据点,每种橘树独有的折线和点都是随后通过lines()函数来添加的。可以看到,Tree 4和Tree 5在整个时间段中一直保持着最快的生长速度,而且Tree 5在大约664天的时候超过了Tree 4。