星期四, 五月 10, 2012

用ggplot2包来绘制地图


自从四月份进行重大升级之后,0.90版的ggplot2包更新了很多新功能。之前的博文谈到了升级版的二维直方图。今天我们要谈的是绘制地图的新功能。其图形元素主要是通过geom_map来实现,在它的帮助文档中只描述了如何绘制美国地图,而美国地图是系统内maps包所自带的地图数据。其它图家地图数据则要从外部导入,本文则尝试从 GADM 获取中国行政区域数据,然后用ggplot2包进行绘图。GADM是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。

本例的目的是结合地理数据和水资源数据,以说明中国人均水资源拥有量的分布情况。基本步骤是先导入地理信息数据,将其转为ggplot2可以处理的数据框格式,将水资源数据整合进来,最后绘制成图。在下图中,红色代表了人均水资源拥有量较低的地区,黄绿色代表较高的地区。多年以来,华北地区都是有名的缺水地区,而长江以南水资源相对较为丰富,这一点很容易观察出来。而西藏、青海人口数量少,使人均水资源偏高。此外,根据全国水资源公报的数字,全国平均的人均水资源量是2200立方米。我们可以根据这一数字,将低于平均数的省份单独显示出来。顺便说下,公鸡的另一只腿可不是我吃了,数据原本如此。

R代码如下:
# 加载所需扩展包
library(ggplot2)
library(gpclib)
library(maptools)
# 读取地理信息数据
load(url("http://gadm.org/data/rda/CHN_adm1.RData"))
# 人均水资源量
water <- c(1085,325,1473,3524,1079,2935,3989,2790,4147,358,2046,434
,1652,2490,451,3362,1467,871,2145,182,1000,12278,448,377,
182,1221,3135,152,4976,10000,5298,2005)
# 将数据转为数据框
gpclibPermit()
china.map <- fortify(gadm,region='ID_1')
vals <- data.frame(id =unique(china.map$id),val=water)
# 用ggplot命令绘图
ggplot(vals, aes(map_id = id)) + 
    geom_map(aes(fill = val), map =china.map) +
    expand_limits(x = china.map$long, y = china.map$lat) +
    scale_fill_continuous(low = 'red2',high ='yellowgreen',
        guide = "colorbar") + 
    opts(title='中国人均年水资源拥有量',
       axis.line=theme_blank(),axis.text.x=theme_blank(),
       axis.text.y=theme_blank(),axis.ticks=theme_blank(),
       axis.title.x=theme_blank(),
       axis.title.y=theme_blank()) +
    xlab("") + ylab("")

7 条评论:

  1. “公鸡的另一只腿可不是我吃了”,哈哈~~
    谢谢,通过你的博客学到很多知识。

    回复删除
  2. 请教water的值怎么跟省份对应的呢?谢谢!

    回复删除
    回复
    1. 呵呵,找到了, gadm$VARNAME_1,可惜是乱码,但凑合能看懂。

      删除
  3. 回复
    1. 关键是地图中没有台湾的数据,如果有数据的话,可以参照这个贴子 http://www.r-bloggers.com/a-brief-script-on-geographical-data-analysis-in-r/

      删除
  4. 评论才能看到程序吗?

    回复删除