楼主: moonstone
64143 109

[作图问题求助] R 绘制中国地图不同方法的比较   [推广有奖]

讲师

74%

还不是VIP/贵宾

-

威望
0
论坛币
10442 个
通用积分
336.6055
学术水平
160 点
热心指数
169 点
信用等级
124 点
经验
263096 点
帖子
237
精华
1
在线时间
520 小时
注册时间
2007-4-27
最后登录
2024-4-11

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近关注R绘制地图的方法,跟大家分享一下。总体来说,有很多种绘制地图的方法,常用的方法主要是基于以下三种方法来绘制地图:(1)ggplot2;(2)maps;(3)googleVis;还有一个程序包值得推荐:REmap

当然还有很多其他的方法可以绘制地图,详见: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年中国各省份对应的平均每千人医护人员数

编码如下:
  1. library(maptools)   # A package for building maps
  2. library(ggplot2)    # To have ggplot2 graphic interface
  3. library(plyr)       # To manipulate data
  4. library(graphics)   # Set par()
  5. library(REmap)      # Get the longitude and latitude of regions

  6. setwd("D:/R practice/R for map")

  7. # Prepare your epidemiological data
  8. mydata <- read.csv("D:/R practice/R for map/example.csv")

  9. # Method 1: Remap

  10. province <- as.character(mydata$NAME)
  11. province <- data.frame(get_geo_position (province))
  12. str(province)
  13. names(province)[3] <- c("NAME" )

  14. china_data_REmap <- join(mydata,province,type="full",by="NAME")  

  15. provinceC_REmap <- china_data_REmap[
  16.   names(china_data_REmap) %in% c("NAME1", "Dct_nur")]

  17. remapC(provinceC_REmap)


  18. # Method 2: ggplot2

  19. china_map <- readShapePoly("D:/R practice/R for map/CHN map/2004/province_2004.shp")      
  20. china_map1 <- china_map@data         
  21. china_map1 <- data.frame(china_map1,id=seq(0:36)-1)
  22. china_map2 <- fortify(china_map)
  23. china_map3 <- join(china_map2, china_map1, type="full",by="id")  
  24. names(china_map3) [13]<- c("NAME")
  25. china_map4 <- join(china_map3, mydata, type="full",by="NAME")

  26. # example 1
  27. ggplot ()+
  28.   geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
  29.   scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
  30.   geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
  31.             vjust=0,nudge_y=0.5)+
  32.   labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
  33.   coord_map ("polyconic")+
  34.   ylim (18, 54)+
  35.   theme(
  36.     panel.grid = element_blank(),
  37.     panel.background = element_blank(),
  38.     plot.title = element_text(size = 25),
  39.     axis.title.x = element_blank(),
  40.     axis.title.y = element_blank(),
  41.     axis.text = element_blank(),
  42.     axis.ticks = element_blank(),
  43.     axis.title = element_blank(),
  44.     legend.position = c(0.15,0.2)
  45.   )

  46. # example 2-1 : Bubble chart on map
  47. ggplot ()+
  48.   geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
  49.   scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
  50.   geom_point(data=china_data_REmap,aes(x=lon,y=lat,size=Population),fill="blue",colour="red",
  51.              alpha=0.6,shape=21)+
  52.   geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
  53.             vjust=0,nudge_y=0.5)+
  54.   labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
  55.   coord_map ("polyconic")+
  56.   ylim (18, 54)+
  57.   theme(
  58.     panel.grid = element_blank(),
  59.     panel.background = element_blank(),
  60.     plot.title = element_text(size = 25),
  61.     axis.title.x = element_blank(),
  62.     axis.title.y = element_blank(),
  63.     axis.text = element_blank(),
  64.     axis.ticks = element_blank(),
  65.     axis.title = element_blank()
  66.   )

  67. # example 2-2 : Bar chart on map
  68. ggplot ()+
  69.   geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=Dct_nur),colour="gray40")+
  70.   scale_fill_gradient(name="Numbers of doctor \nand nurse, 1/1000",low="white",high="red")+
  71.   geom_errorbar(data=china_data_REmap,aes(x=lon, ymin=lat, ymax=lat + Population/1500 ),
  72.                 colour="blue",size=5, width=0,alpha=0.5)+
  73.   geom_text(data =china_data_REmap,aes(x=lon,y=lat,label=province),colour="black",size=5,
  74.             vjust=0,nudge_y=0.5)+
  75.   labs(title ="Numbers of doctor nand nurse per 1000 persons in China")+
  76.   ylim (18, 54)+
  77.   theme(
  78.     panel.grid = element_blank(),
  79.     panel.background = element_blank(),
  80.     plot.title = element_text(size = 25),
  81.     axis.title.x = element_blank(),
  82.     axis.title.y = element_blank(),
  83.     axis.text = element_blank(),
  84.     axis.ticks = element_blank(),
  85.     axis.title = element_blank()
  86.   )

  87. library(googleVis)

  88. # Method 3: googleVis

  89. G1 <- gvisGeoMap(mydata,
  90.                  locationvar='NAME2',
  91.                  numvar='Dct_nur',
  92.                  options=list(region='CN'))
  93. plot(G1)

  94. G2 <- gvisGeoChart(mydata,
  95.                    locationvar='NAME2',
  96.                    colorvar='Dct_nur',
  97.                    options=list(region='CN',
  98.                                 displayMode="regions",
  99.                                 resolution="provinces",
  100.                                 colorAxis="{colors: ['yellow','red']}" ))
  101. plot(G2)
复制代码


REmap输出图形:
REmap.png
ggplot2示例1输出图形:
ggplot2-1.png
ggplot2示例2-1输出图形:
ggplot2-2.png

ggplot2示例2-2输出图形:
ggplot2-1.png
因为无法显示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

欢迎交流,^_^






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:中国地图 中国地 Population interface R-Project 中国地图

已有 12 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
cheetahfly + 50 + 3 + 3 + 3 精彩帖子
qwertyqwertu + 1 + 1 + 1 精彩帖子
iRolly + 5 精彩帖子
kaidou1412 + 5 + 5 + 5 精彩帖子
20041910120 + 5 + 5 精彩帖子
dixiahe + 5 精彩帖子
kongqingbao280 + 20 精彩帖子
aclyang + 40 精彩帖子
英雄lxz + 1 + 1 精彩帖子
swordsmen + 4 精彩帖子

总评分: 经验 + 100  论坛币 + 130  学术水平 + 30  热心指数 + 20  信用等级 + 14   查看全部评分

本帖被以下文库推荐

沙发
prince315 在职认证  发表于 2016-1-18 11:14:54 |只看作者 |坛友微信交流群
赞一个!赶紧也试试
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

藤椅
nkunku 发表于 2016-1-18 15:21:26 |只看作者 |坛友微信交流群
非常感谢,学习了
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

板凳
moonstone 发表于 2016-1-18 15:27:09 |只看作者 |坛友微信交流群
prince315 发表于 2016-1-18 11:14
赞一个!赶紧也试试
注意REmap程序包的安装方法,注意#里面的备注信息
  1. install.packages("devtools")  # Choose "No" to restart R prior to installing
  2. library(devtools)
  3. install_github('lchiffon/REmap')
复制代码
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

报纸
hduzqq 发表于 2016-1-19 14:24:55 |只看作者 |坛友微信交流群
RGoogleMaps 也可以画地图的
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

地板
moonstone 发表于 2016-1-19 16:16:30 |只看作者 |坛友微信交流群
hduzqq 发表于 2016-1-19 14:24
RGoogleMaps 也可以画地图的
基于google地图的程序包很多,ggmap等,但是在如果google不能在国内正常使用,这些程序包的输出都看不了。
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

7
hduzqq 发表于 2016-1-20 09:55:58 |只看作者 |坛友微信交流群
moonstone 发表于 2016-1-19 16:16
基于google地图的程序包很多,ggmap等,但是在如果google不能在国内正常使用,这些程序包的输出都看不了。 ...
嗯 一开始怎么都运行不了 后来找同学帮忙翻墙了 就可以了
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

8
moonstone 发表于 2016-1-20 12:40:35 |只看作者 |坛友微信交流群
hduzqq 发表于 2016-1-20 09:55
嗯 一开始怎么都运行不了 后来找同学帮忙翻墙了 就可以了
深入比较不同方法之后,还是觉得ggplot2是正解,利用google地图绘制的地图,相对来说因为受到地图本身的限制,比如:无法只显示中国地图,而不显示中国地图之外的内容,再比如:无法根据不同省份指标的大小直接在不同省份的地图上填充渐变颜色,而只能在原有地图基础上通过添加点、柱状图(需借助其他程序包)等来显示指标的大小,等等,同时还需要不断翻墙才能获得基础的google地图,这些都是一些限制。个人感受,仅供参考。
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

9
hduzqq 发表于 2016-1-20 13:18:30 |只看作者 |坛友微信交流群
moonstone 发表于 2016-1-20 12:40
深入比较不同方法之后,还是觉得ggplot2是正解,利用google地图绘制的地图,相对来说因为受到地图本身的限 ...
ggplot2能画杭州市内各个区的填充图吗? 论坛里有个浙江省各个市的填充图,我依样画葫芦的画了下杭州市的,但是受到shp这个文件的限制,画出来的地区不太正确,比如萧山、余杭还没有并入杭州市,有什么方法进行改进吗?
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

10
moonstone 发表于 2016-1-20 13:23:57 |只看作者 |坛友微信交流群
hduzqq 发表于 2016-1-20 13:18
ggplot2能画杭州市内各个区的填充图吗? 论坛里有个浙江省各个市的填充图,我依样画葫芦的画了下杭州市的 ...
要想画完善的填充图,必须要有完善的shp文件,当然这不是ggplot2的问题,而是国家基础地理信息的问题
已有 1 人评分热心指数 收起 理由
dixiahe + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 17:48