用ggmap包进行地震数据的可视化

June 28, 2012
By

This post was kindly contributed by 数据科学与R语言 - go there to comment and to read the full post.

最近又发现了一个比较好玩的包ggmap。从名字上可以猜测出来,它的作用就是将ggplot2和map相结合。这样R语言用户能方便的获取各种静态地图数据,并在其基础上使用强大的ggplot绘图工具。ggmap包整合了四种地图资源,分别是Google、OpenStreetMaps、Stamen和Cloudmade。为了演示ggmap的作用,本例是从地震信息网获取最近一周的地震数据,得到其经纬度,然后以散点形式绘制在google地图上,另外也显示地震发生的密度估计。这个思路本质上和之前的一篇博文是一致的,但用ggmap包实现起来更为简单。

# 加载扩展包
library(ggmap)
library(animation)
library(XML)
# 从网页上抓取数据,并进行清理
webpage <-'http://data.earthquake.cn/datashare/globeEarthquake_csn.html'
tables <- readHTMLTable(webpage,stringsAsFactors = FALSE)
raw <- tables[[6]]
data <- raw[-1,c('V1','V3','V4')]
names(data) <- c('date','lan','lon')
data$lan <- as.numeric(data$lan)
data$lon <- as.numeric(data$lon)
data$date <- as.Date(data$date, "%Y-%m-%d")
# 用ggmap包从google读取地图数据,并将之前的数据标注在地图上。
ggmap(get_googlemap(center = 'china', zoom=4,maptype='terrain'),extent='device')+
geom_point(data=data,aes(x=lon,y=lan),colour = 'red',alpha=0.7)+
stat_density2d(aes(x=lon,y=lan,fill=..level..,alpha=..level..),
size=2,bins=4,data=data,geom='polygon')+
opts(legend.position = "none")
 
更好玩的作法就是根据地震发生的日期生成不同的静态图,然后用animaiton包将其整合为一个gif动画。

# 为了生成动画,先准备好一个绘图函数
plotfunc <- function(x) {
df <- subset(data,date <= x)
df$lan <- as.numeric(df$lan)
df$lon <- as.numeric(df$lon)
p <- ggmap(get_googlemap(center = 'china', zoom=4,maptype='terrain'),,extent='device')+
geom_point(data=df,aes(x=lon,y=lan),colour = 'red',alpha=0.7)
}
# 获取地震的日期
time <- sort(unique(data$date))
# 生成并保存动画
saveMovie(for( i in time) print(plotfunc(i)))

ggmap包中还有其它一些非常有用的函数。例如geocode函数可以根据地名字符串来查询经纬度,gglocator类似于基本包中的locator,它根据鼠标的点选来返回其坐标值。另外一个是mapdist函数,可以返回两点之间的地图距离和行驶时间。结合这几个函数可以直接在R中绘制地图,选择你的出发地和目标地,然后获得两地之间的距离。当然你还可以配合GPS等其它数据,创造出其它有意思的图形。

Tags: ,

Comments are closed.