一图胜千言,一点不假。能用图不用表,能用表不用文字,这是我写文档的原则。图表传导信息更直接,也更具冲击力。本文试图尝试利用ggplot2包制作中国地图,同时将每个省的人口用柱状图标注在每个省的省会城市上,当然,我们还可根据每个省的人口密度映射不同的颜色进行填充,比如用较深的颜色表示人口密度大的省份,颜色浅的表示人口密度小,这样更加直观。

其实用基本绘图包的plot函数也可以做,只是稍复杂点,学完ggplot2包就不想用其他绘图包了,当然googleVis做地图也很棒,只是这个包做中国地图有缺陷,你懂的。谷歌ggmap(需要科学上网)和leaflet也可以做,好处是不依赖本地地图数据,不好的地方是必须有网才行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 加载做数据所需包
library(sp)
library(maptools)
library(tidyverse)

# 读取地图数据
china_map=readShapePoly("~/map/data/bou2_4p.shp")

# 生成做地图所需数据
china_map %>%
  fortify() %>%  # 地图数据转化为数据框,获得long、lat和id
  mutate(id = as.numeric(id)) %>%
  left_join(data.frame(china_map@data, id=seq(0:924)-1), by="id")->china_mapdata

# 读取人口信息NAME、pop、city
pop=read.csv("~/map/data/pop.csv",stringsAsFactors = FALSE)

# 读取省会城市经纬度数据city、jd、wd
position=read.csv("~/map/data/citylonlat.csv",stringsAsFactors = FALSE)

# 生成地图上作图所需信息
china_pop=left_join(pop, position, by="city")

# 利用ggplot2生成地图
ggplot()+
    geom_polygon(data = china_mapdata, alpha = 0.8,
                 aes(x = long,y = lat,group = group,fill = NAME))+
    geom_path(colour = "grey40")+
    scale_fill_manual(values=colours()[2:34],guide=FALSE)+
    geom_errorbar(data=china_pop,aes(x=jd, ymin=wd, ymax=wd+pop/3000000),
                  color="red",size=5, width=0,alpha=0.5)+
    geom_text(data =china_pop,aes(x=jd,y=wd,label=city),colour="black",size=3,
              vjust=0,nudge_y=0.5)+
    ggtitle("\n中华人民共和国人口分布图")+
    theme(axis.title = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank(),
          panel.background = element_blank(),
          plot.title = element_text(hjust = 0.5,
                                    size = 20,
                                    face = "bold",
                                    color = "black",
                                    family = "Times"))