星期四, 五月 03, 2012

日历中的夏天


看着有节,摸着无节--打一生活用品

不知不觉,夏日已慢慢临近。姑娘们飞扬的裙角,小贩叫卖的西瓜,蚊蝇嗡嗡的声音,以及翻过的一页日历,都提醒着你--夏天快来了。夏季有着不同的定义,根据中国人的日历,我们所俗称的夏季从“立夏”开始,到“立秋”结束。在气候学上,若连续五天平均温度超过22度,则算作夏季的开始,若五天平均温度低于22度则算作入秋。而天文学上的夏季一般是指6、7、8三个月。

我们想知道:哪一种夏季的定义更合乎我们的感觉?还是用数据可视化来说话吧。这项任务基本上有两个步骤,一是获取某城市的2011年日平均温度数据,二是根据数据绘制日历热图(Calendar Heatmap)


本文所采用的数据源是Wunderground提供的API。该API所提供的数据极为丰富,除了历史温度数据外,还有湿度、风向等大量信息可以利用,所以它被数据源手册所推荐。为了使用这个API我们先申请一个免费帐户,然后利用R语言中的RJSONIO包来解析所得到的天气数据。使用这个API要注意的是,其免费帐户每分钟限制10次调用,超出会中断连接。不知道别人怎么弄的,本人的笨办法是在程序中增加了暂停。这样就获得了365个日平均温度。

日历热图是一种有趣的工具,它可以在日历表中显示时间序列数据的变化。在2009年的The Data Expo中,获奖团队就是利用了SAS来生成日历热图。多才多艺的R语言当然也可以做到。在《R Graphs Cookbook》这本书中就提到了绘制日历热图的方法,第一种方法是Paul Bleicher所写的一个函数,它是基于grid,lattice,chron这三个扩展包来编写的。第二种方法是使用openair扩展包中的calendarPlot函数。生成的图形就象下面这个样子。
看起来不错,但是我们还没完。我们希望挑选出平均温度在22度以上的日子,突出显示出来。所以我们采用第三种方法,用ggplot2包来绘制日历热图,下面的图形参考了MarginTale的这篇文章
上图中数日子是竖着来数的,横轴表示每月的第几周,纵轴表示星期几。灰色部分表示当天平均温度在22度以下,有色彩的区块表示在22度以上。颜色越偏黄则表示温度越高。在2011年,立夏的时间是5月6日,立秋是8月8日,但可以观察到立秋之后仍有很多时间温度在22度以上。这就是我们所俗称的“秋老虎”。如果按照气候学的定义来看,四月末就出现了连续五天的高温,所以夏天应该在四月末就开始了,一直延续到十月初结束。而天文学上的夏季则是六、七、八三个月,这三个月基本上全是22度以上。看起来天文学的夏季是比较符合我们人体的感觉的。其它的要么偏短,要么偏长。

写到这里,想起了梁静茹的一首歌:
宁静的夏天
天空中繁星点点
心里头有些思念
思念着你的脸
我可以假装看不见
也可以偷偷的想念
直到让我摸到你那温暖的脸

(最后要说的是,本人不是气象专家,本文也没有考虑到湿度对体感温度的影响等其它因素。主要还是向各位介绍R语言中日历热图的绘制。)

R代码在此

12 条评论:

  1. 感谢博主,刚学R,只会用各种统计...发现replicate你的博客应该很有趣!:) 谢谢分享

    回复删除
  2. 这个日历热图是不是也可以把气温和适度换成别的数据?比如风速等等?只要是数据就可以还是必须是温度?

    回复删除
  3. 用OPENAIR那个包做出来的是中文月份?

    回复删除
  4. Error in calendarPlot(dataset, pollutant = "so2", year = 2011) :
    No data to plot - check year chosen
    In addition: Warning message:
    In match(x, table, nomatch = 0L) : NAs introduced by coercion

    博主我执行openair的calendarPlot之后显示上面的信息,什么原因啊?我的数据一共两列,第一列是全年时间:yyyy-mm-dd,第二列是数据(numeric格式),包括了NA。是不是那个时间的格式有问题?

    回复删除
  5. require(quantmod)
    为什么用这个包呢?貌似是一个金融分析包吧?

    回复删除
    回复
    1. 貌似写错了,应该是加载plyr包,否则后面的ddply函数没法运行。

      删除
  6. openair中Calendar函數所繪製圖形下面一堆星星星星可以轉換成一、二、三、四?還是得去下載歐美區的R來用?

    回复删除