1 min read

Steem 和 R 语言:跟大鹏学 R 语言(17)颜色

Links: steemit.com, cnsteem.com, busy.org, steemdb.com, steemd.com

黯然销魂者,唯别而已矣。

这是“江郎才尽”的江郎写出来的著名诗句。

本文是最后一次连载《学 R》一书的内容。这书里贯穿了金庸元素。本文是连载第 17 篇。17 这个数字不常用,金庸的小说里,只有杨过的“黯然销魂掌”是17掌。

黯然销魂者,唯别而已矣。

前情回顾:

有了颜色参数,我们的作图本领更加强大,可以重新考虑一下 mydata2 这个数据框了。

实际上,mydata2的每个数据点都包含了三个内容:“年份”,“月份”,“CO2浓度”。这是个三维数据。我们前面由于刚刚入门,受作图能力所限,只能把数据“降维打击”成了二维,只保留了“年份”和“浓度”两个维度(当然也可以只保留“月份”和“浓度”,或“年份”和“月份”,但后者实在无趣)来作图。既然每个点都可以指定一个特有的颜色,那么就可以用颜色来表示这些数据点的第三个维度。

下面,我们将作一个散点图,图上每个点的横坐标是“月份”,纵坐标是“年份”,每个点的颜色表示“浓度”,在色带上,越偏向紫色就表示浓度越大(紫移),越偏向红色就表示浓度越小(红移)。

我们先用 unlist()函数(见第8.1节)把“浓度”这个数据框转换成一个向量,作为第一个维度:

myco2 <- unlist(mydata2[, 1:12])
myco2 <- round(myco2)

为了简化后面的操作,我们用 round() 函数对浓度数据进行了四舍五入。

然后,用一个向量myyear来存储第二个维度“年份”:

myyear <- rep(mydata2$year, 12)

rep()是重复函数(repeat的缩写)。由于每年12个月,所以,每个年份重复12次。

最后,用向量 mymonth 来存储第三个维度“月份”,每个月份重复的次数是数据里出现的年数,也就是行数:

mymonth <- rep(1:12, each = nrow(mydata2))

三个维度的数据准备完毕,下面准备一下每个数据点的颜色。我们用rainbow()函数根据浓度数值的大小给数据点确定一个颜色:

n <- diff(range(myco2)) # 彩虹分割的颜色数量
mycolor <- rainbow(n)[myco2 - min(myco2) + 1]

一切准备就绪,可以作图了:

plot(x = mymonth, y = myyear, 
     col = mycolor, cex = 10, pch = 15)

图 3.11: plot()函数示例:三维图.

得到的图3.11里,沿着横向看就是CO2浓度的逐月变化,沿纵向看就是年际变化。我们的图升维了。

事实上,R 里有另外一个函数image(),可以一步做出类似的颜色图(图3.12)。

image(t(as.matrix(mydata2[1:12])), col = rainbow(n))

图 3.12: image()函数示例.

image()函数将在第5.4节再度露面,届时我们再做进一步介绍。

plot()函数的参数很多,那么就允许数据有更多维度。例如,把数据来源作为第四个维度,那么我们可以用数据点的不同大小来表示(cex参数),亚洲的数据用大号数据点,欧洲用中号等等。我们可以随意对图进行维度改造了!

要想对作图进行更精细的控制,可以使用plot()函数的其他参数、par()函数、axis()函数等。这个我们在后面会详细介绍,如果你迫不及待的话,请你自己找F1小助理问问吧。

练习3.1 请绘制1959年到1997年二氧化碳全年平均浓度的逐年变化散点图,线形为“p”,数据点形状为实心三角形,数据点颜色为黄色。