R语言 热地图绘制

在 R 中绘制地图其实是十分方便的,ggplot2集成了很多画图的功能,但是由于对中国地图的支持还比较少,需要自行导入shp文件进行定制。

1.ggplot2直接绘制

ggplot2可以直接绘制各种类型的地图。如

以中国为中心视角的三维地图

library(ggplot2)
library(maps)
world <- map_data("world")
worldmap <- ggplot(world, aes(x = long, y = lat, group = group)) +
  geom_path() +
  scale_y_continuous(breaks = (-2:2) * 30) +
  scale_x_continuous(breaks = (-4:4) * 45)
worldmap + coord_map("ortho", orientation = c(41, 116, 0))

美国各州各类犯罪率

library(ggplot2)
library(maps)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
crimesm <- reshape2::melt(crimes, id = 1)
if (require(maps)) {
  states_map <- map_data("state")
  ggplot(crimes, aes(map_id = state)) +
    geom_map(aes(fill = Murder), map = states_map) +
    expand_limits(x = states_map$long, y = states_map$lat)
  
  last_plot() + coord_map()
  ggplot(crimesm, aes(map_id = state)) +
    geom_map(aes(fill = value), map = states_map) +
    expand_limits(x = states_map$long, y = states_map$lat) +
    facet_wrap( ~ variable)
}

2.用rgdal包和maptools包绘制中国地图

入门

首先可以点这里下载中国地图的shp配套文件。将文件放在工作路径下。

library(rgdal)
library(maptools)
x=readOGR('bou2_4p.shp')
plot(x)

在绘制地图时,每一个省市自治区或者岛屿都是用一个多边形来表示的。之前的 GIS 数据,其实就是提供了每一个行政区其多边形逐点的坐标,然后 R 软件通过顺次连接这些坐标,就绘制出了一个多边形区域。在上面的数据中,一共包含了 925 个多边形的信息,之所以有这么多是因为一些省份有很多小的附属岛屿。在这 925 个多边形中,每一个都对应一个唯一的 ID,编号分别从 1 到 925。plot命令中的col参数在本例中应该是一个长度为 925 的向量,其第 i 个分量的取值就代表了地图中第 i 个多边形的颜色。一个简单的尝试是运行下面这个命令看看效果:

head(x@data)#查看保存的多边形结构的前6行
plot(x,col=gray(924:0/924))#根据编号绘制灰度

对省份的颜色进行定制:

getColor = function(mapdata, provname, provcol, othercol){
  f = function(x, y) ifelse(x %in% y, which(y == x), 0)
  colIndex = sapply(mapdata@data$NAME, f, provname)
  fg = c(othercol, provcol)[colIndex + 1]
  return(fg)
}
provname = c("北京市", "天津市", "上海市", "重庆市")
provcol = c("red", "green", "yellow", "purple")
plot(x, col = getColor(x, provname, provcol, "white"))

根据人口绘制颜色深浅

as.character(na.omit(unique(x$att.data$NAME)))可以用来查看储存省份名称的向量。
provname = c("北京市", "天津市", "河北省", "山西省", "内蒙古自治区",
             "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省",
             "浙江省", "安徽省", "福建省", "江西省", "山东省",
             "河南省", "湖北省", "湖南省", "广东省",
             "广西壮族自治区", "海南省", "重庆市", "四川省", "贵州省",
             "云南省", "西藏自治区", "陕西省", "甘肃省", "青海省",
             "宁夏回族自治区", "新疆维吾尔自治区", "台湾省",
             "香港特别行政区")
pop = c(1633, 1115, 6943, 3393, 2405, 4298, 2730, 3824, 1858, 7625,
        5060, 6118, 3581, 4368, 9367, 9360, 5699, 6355, 9449,
        4768, 845, 2816, 8127, 3762, 4514, 284, 3748, 2617,
        552, 610, 2095, 2296, 693)
provcol = rgb(red = 1 - pop/max(pop)/2, green = 1-pop/max(pop)/2, blue = 0)
plot(x, col = getColor(x, provname, provcol, "white"), xlab = "", ylab = "")

 

绘制特定的单独地区

ADCODE99 是国家基础地理信息中心定义的区域代码,共有 6 位数字,由省、地市、县各两位代码组成。可以用x$ADCODE99进行查看。利用ADCODE99编号可以指定特定区域。也可以直接使用plot的col参数,只要将border设置为”white”,其余地址设置为白色填充即可。

1.
Shanghai = x[x$ADCODE99 == 310000,]
plot(Shanghai)
2. midchina = c("河南省", "山西省", "湖北省", "安徽省", "湖南省", "江西省")
plot(x, col = getColor(x, midchina, rep("green", 6),
"white"), border = "white")