当然还有很多其他的方法可以绘制地图,详见:https://rstudio-pubs-static.s3.a ... 8efc0a07d67208.html
简单总结几种常用程序包绘制地图的优缺点:
(1)ggplot2:优点,可灵活调整图形的任意组成成分,同时可在图形上添加2个或多个维度的数据(如在地图上同时显示总人口数和每千人卫生人口数,详见下面的示例2),其他程序包通常只能绘制一个维度的数据(总人口数或每千人卫生人口数,详见下面的示例1);缺点,参数较多,较难短时掌握。同时绘制地区前需先下载shp文件,如果想获得省市级地区的最新二级地图的shp文件,通常很难。
强烈推荐ggplot2官方学习网址:http://docs.ggplot2.org/current/。
另外推荐余光创的两篇博文:http://guangchuangyu.github.io/2014/05/use-ggplot2/ 及 http://guangchuangyu.github.io/2 ... ing-started-with-r/
(2)maps:优点,相对灵活,不加赘述;缺点,中国的基础地图中,没有将四川和重庆区分开,这是被无数maps的中国地图使用者最为诟病的地方。其他地区的基础地图是否有类似问题,不得而知。
(3)googleVis:优点,功能由起初的主要绘制地图的功能,逐步扩展,已经演变成非常强大的可视化工具,推荐学习网址:http://cran.r-project.org/web/pa ... leVis_examples.html 。缺点:绘制基础地图方法,仍然只能绘制一维的数据。同时绘制的地图依赖google地图,所以如果不能显示google地图,也就不能绘制地图。
(4)REmap:国人开发的基于百度地图Echart。优点,绘制地图方便快捷,省市级地区的二级地图非常精准,并可绘制炫酷的迁徙图和热图,推荐学习网址:http://lchiffon.github.io/REmap/ ;缺点,同googleVis一样,只能绘制一维的数据,同时地图上只能显示中文地名,所以想让它来发英文文章,估计就不行了。目前主要用它来获取精细的经纬度信息,在获取经纬度信息上,中文地名能很好识别,部分英文省市级名称也能识别,但有限。
回到正题,以下分别介绍ggplot2和REmap绘制中国地图的方法代码:
在绘制地图前准备以下数据:
1、中国省级行政区划地图矢量图shp格式(province_2004.shp),下载网址:
https://yunpan.cn/crZmPQr38N6mt 访问密码 773c
同时需要配套数据province_2004.dbf和province_2004.shx
province_2004.dbf 文件下载网址
https://yunpan.cn/cYgzwyvghBGte 访问密码 b135
province_2004.shx 文件下载网址
https://yunpan.cn/cYgzqSG9Fk8Qu 访问密码 d771
其他比较代表性的下载来源是GDM网站,网址:http://gadm.org/download,但是从GDM网站下载的中国地图没有台湾。
2、流行病学样本数据(example.csv),下载网址:
https://yunpan.cn/crZm3wWUfVfaU 访问密码 8fe7
说明:NAME,shp地图对应的中国省份名称
NAME1,REmap绘制中国地图对应的省份名称
NAME2,googleVis绘制中国地图对应的省份名称编码
Population:2012年中国各省份对应人口数,单位:10000人
Dct_nur:2012年中国各省份对应的平均每千人医护人员数
编码如下:
- library(maptools) # A package for building maps
- library(ggplot2) # To have ggplot2 graphic interface
- library(plyr) # To manipulate data
- library(graphics) # Set par()
- library(REmap) # Get the longitude and latitude of regions
- setwd("D:/R practice/R for map")
- # Prepare your epidemiological data
- mydata <- read.csv("D:/R practice/R for map/example.csv")
- # Method 1: Remap
- province <- as.character(mydata$NAME)
- province <- data.frame(get_geo_position (province))
- str(province)
- names(province)[3] <- c("NAME" )
- china_data_REmap <- join(mydata,province,type="full",by="NAME")
- provinceC_REmap <- china_data_REmap[
- names(china_data_REmap) %in% c("NAME1", "Dct_nur")]
- remapC(provinceC_REmap)
- # Method 2: ggplot2
- china_map <- readShapePoly("D:/R practice/R for map/CHN map/2004/province_2004.shp")
- china_map1 <- china_map@data
- china_map1 <- data.frame(china_map1,id=seq(0:36)-1)
- china_map2 <- fortify(china_map)
- china_map3 <- join(china_map2, china_map1, type="full",by="id")
- names(china_map3) [13]<- c("NAME")
- china_map4 <- join(china_map3, mydata, type="full",by="NAME")
- # example 1
- ggplot ()+
- geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
- scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
- geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
- vjust=0,nudge_y=0.5)+
- labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
- coord_map ("polyconic")+
- ylim (18, 54)+
- theme(
- panel.grid = element_blank(),
- panel.background = element_blank(),
- plot.title = element_text(size = 25),
- axis.title.x = element_blank(),
- axis.title.y = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- axis.title = element_blank(),
- legend.position = c(0.15,0.2)
- )
- # example 2-1 : Bubble chart on map
- ggplot ()+
- geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
- scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
- geom_point(data=china_data_REmap,aes(x=lon,y=lat,size=Population),fill="blue",colour="red",
- alpha=0.6,shape=21)+
- geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
- vjust=0,nudge_y=0.5)+
- labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
- coord_map ("polyconic")+
- ylim (18, 54)+
- theme(
- panel.grid = element_blank(),
- panel.background = element_blank(),
- plot.title = element_text(size = 25),
- axis.title.x = element_blank(),
- axis.title.y = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- axis.title = element_blank()
- )
- # example 2-2 : Bar chart on map
- ggplot ()+
- geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
- scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
- geom_errorbar(data=china_data_REmap,aes(x=lon, ymin=lat, ymax=lat + Population/1500 ),
- colour="blue",size=5, width=0,alpha=0.5)+
- geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
- vjust=0,nudge_y=0.5)+
- labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
- ylim (18, 54)+
- theme(
- panel.grid = element_blank(),
- panel.background = element_blank(),
- plot.title = element_text(size = 25),
- axis.title.x = element_blank(),
- axis.title.y = element_blank(),
- axis.text = element_blank(),
- axis.ticks = element_blank(),
- axis.title = element_blank()
- )
- library(googleVis)
- # Method 3: googleVis
- G1 <- gvisGeoMap(mydata,
- locationvar='NAME2',
- numvar='Dct_nur',
- options=list(region='CN'))
- plot(G1)
- G2 <- gvisGeoChart(mydata,
- locationvar='NAME2',
- colorvar='Dct_nur',
- options=list(region='CN',
- displayMode="regions",
- resolution="provinces",
- colorAxis="{colors: ['yellow','red']}" ))
- plot(G2)
REmap输出图形:
ggplot2示例1输出图形:
ggplot2示例2-1输出图形:
ggplot2示例2-2输出图形:
因为无法显示google地图,所以googleVis的输出无法查看
其他利用R绘制中国地图的重要参考学习网址:
http://yihui.name/cn/2008/10/china-map-and-city-locations-with-r/
http://www.kevjohnson.org/making-maps-in-r/
http://cos.name/2013/01/drawing-map-in-r-era/
http://cos.name/2014/08/r-maps-for-china/
http://cos.name/2009/07/drawing-china-map-using-r/
http://www.r-bloggers.com/lang/chinese/1010
欢迎交流,^_^