星期三, 二月 15, 2012

用ggplot2包绘制风向风速玫瑰图

风向风速玫瑰图(wind rose)是气象学家常用的图形工具,描述了在一个特定的地点,其风速和风向是如何分布的。风向风速图实际上是一种条形图的扩展,它使用网格化的极坐标系统,用不同的方位来汇集风向及其频数,频率最大的方位,表示该风向出现次数最多。并且还用不同的颜色带来区别风速的大小。在本例中我们首先使用ggplot2包来绘制如下的风向风速图,再用专门工具进行示例。

#首先加载ggplot2扩展包
library(ggplot2)
set.seed(1234)
#随机生成100次风向,并汇集到16个区间内
dir <- cut_interval(runif(100,0,360),n=16)
#随机生成100次风速,并划分成4种强度
mag <- cut_interval(rgamma(100,15),4) 
sample <- data.frame(dir=dir,mag=mag)
#将风向映射到X轴,频数映射到Y轴,风速大小映射到填充色,生成条形图后再转为极坐标形式即可
p <- ggplot(sample,aes(x=dir,y=..count..,fill=mag))
p + geom_bar()+ coord_polar()
在R中绘制风向风速图也有两种专门的工具,一个是circular包中的windrose函数,另一个是climatol包中的rosavent函数。

library(circular)
dir <- circular(runif(100,0,360),units='degrees')
mag <- rgamma(100,15)
sample <- data.frame(dir=dir,mag=mag)
res <- windrose(sample,template='geographics')



library(climatol)
data(windfr)
rosavent(windfr, 4, 4, ang=-3*pi/16, main="Annual windrose")


4 条评论:

  1. 不知博主认为蜘蛛网一样的方形图是不是也可以用ggplot包制作的呢? 您的图很神奇!学习了!

    回复删除
    回复
    1. ggplot几乎可以做任何图形,除了作者的那本书外,还有一个关于ggplot的博客也很棒,http://learnr.wordpress.com 但是那个博客好象已经不更新了。

      删除
  2. google无意间发现的blog,很佩服你对R的熟练掌握。羡慕嫉妒恨。本人是临到可视化数据的时候,才会看下R有没有什么炫图。。。请教下,用windrose可以做0到pi之间的图么?想作图显示所有可能性的方向(0到180度)和每个方向出现的频率。尝试了几种不同的,先用historgram算出频率,再用那个频率作为windrose的mag值,不过不知道怎么显示半圆,已经显示不同方向角度的百分比在图上。。。请提点。

    回复删除
    回复
    1. 可以试着将不需要显示的半圆处的值设置为0
      dir <- cut(runif(1000,0,360),breaks=seq(0,360,by=10))
      data <- as.data.frame(table(dir))
      data[19:36,2]<-0
      p <- ggplot(data,aes(x=dir,y=Freq))
      p + geom_bar()+ coord_polar()

      删除