你绝对想不到,数据地图还能这么玩~

这个周末刷微信的时候,偶然看到一篇关于R语言12月更新包的介绍,翻到底部看了一眼,刚好看到一个关于ggplot2的一个图层插件——geom_scatterpie。

这个包安装之后,可以提供给ggplot新的图层函数,并制作出气泡状饼图,饼图可以分类填色,饼图大小可以映射数值变量,特别是将这种图表形式引入地图之中,那么最终呈现的地图上的气泡饼图非常炫酷。

今天刚好整理了下完整思路,顺便分享。

library(ggplot2)
library(plyr)
library("maptools")
library(scatterpie)
world_map <-readShapePoly("c:/rstudy/wold_map/World_region.shp")


x <- world_map@data  
xs <- data.frame(x,id=seq(0:250)-1)  
world_map1 <- fortify(world_map)  
world_map_data <- join(world_map1, xs, type = "full") 
mydata<-read.xlsx("D:/R/File/WorldGDP.xlsx",sheetName="Sheet1",header=T,encoding='UTF-8',stringsAsFactors = FALSE) 

这里我使用2015年全球主要发达国家(15)的GDP、三大产业产比数据来演示此案例,GDP代表气泡图大小、三大产业占比用每一个气泡图的饼图份额占比来表示。

计算全球各国行政区划中心点:

midpos <- function(x) mean(range(x,na.rm=TRUE))
centres <- ddply(world_map_data,.(COUNTRY),colwise(midpos,.(long,lat)))

匹配目标国家行政区划中心点:

mapdata<-merge(centres,mydata,by.x="COUNTRY",by.y="FULLName",all.y=TRUE)

利用ggplot2函数结合scatterpie图层对象进行空间数据映射。

因为GDP数据量级太大,我将其折算成5~10之间的标准数,用于映射气泡半径。

mapdata$order<-as.factor(mapdata$order)
mapdata$point<-5*mapdata$GDP/max(mapdata$GDP)+5
value<-names(mapdata)[8:10]
mapdata[1,c("long","lat")]<-c(-77.013222,38.913611) #华盛顿
mapdata[2,c("long","lat")]<-c(2.329671,48.871029)    #巴黎
mapdata[3,c("long","lat")]<-c(-0.124969,51.516434)   #伦敦
mapdata[4,c("long","lat")]<-c(12.496336,41.91076)    #罗马
mapdata[5,c("long","lat")]<-c(4.882042,52.372936)    #阿姆斯特丹
mapdata[6,c("long","lat")]<-c(-3.704783,40.421502)   #马德里
mapdata[7,c("long","lat")]<-c(139.650947,35.833005)   #东京
mapdata[8,c("long","lat")]<-c(13.407002,52.527935)   #柏林
mapdata[9,c("long","lat")]<-c(8.45468,47.440827)     #苏黎世
mapdata[11,c("long","lat")]<-c(149.116199,-35.315167)  #墨尔本
mapdata[12,c("long","lat")]<-c(-43.264882,-22.895071) #里约热内卢
mapdata[15,c("long","lat")]<-c(-99.129758,19.449516)  #墨西哥城

因为有些国家的领土中含有远离本图的海洋小岛(可能是殖民时代的产物),导致所取的领土中心位置已经严重偏离本土,所以我更改了几个国家首府的经纬度。

   ggplot(world_map_data,aes(x=long, y=lat,group=group)) +
    geom_polygon(fill="white", color="grey")+
    geom_scatterpie(data=mapdata,aes(x=long, y=lat,group=order,r=point),cols=value,color=NA, alpha=.8) +
    coord_equal()+
    geom_scatterpie_legend(mapdata$point, x=-160, y=-55)+
    scale_fill_wsj()+
    theme_nothing(legend=TRUE)

除此之外,你可以可以使用maps包内置的世界地图,这样省去了自己自己加载并整理地图素材数据的麻烦:

world <- map_data('world')
    ggplot(world, aes(long, lat,group=group)) +
    geom_polygon(fill="white", color="grey")+
    geom_scatterpie(data=mapdata,aes(x=long, y=lat,group=order,r=point),cols=value,color=NA, alpha=.8) +
    coord_equal()+
    geom_scatterpie_legend(mapdata$point, x=-160, y=-55)+
    scale_fill_wsj()+
    theme_nothing(legend=TRUE)

使用maps包的地图好处是,地图数据是打包封装过的,处理效率比较高,自定义导入的shp格式地图数据需要手动进行各种操作,处理速度非常慢,建议大家尝试。

两幅图带图没有太大差别,导入的shp全球地图是不带南极洲的,但是maps中的世界地图是带有的。

该包的开发者是香港大学的Gangchuang Yu ,12月刚上线不久,下面网址是作者关于该包使用的一个小case,感兴趣可以参考。

https://cran.r-project.org/web/packages/scatterpie/vignettes/scatterpie.html

本文分享自微信公众号 - 数据小魔方(datamofang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏肖洒的博客

梁桥评分系统

虽然算法很简单,就是一个计算器。 但是,其本身逻辑思维很复杂。 就是一个桥它自己的学问,让我们这些门外汉实在是汗颜啊。 所以到最后就是完成了一个很臃肿的exe...

12230
来自专栏数据小魔方

用R语言复盘美国总统大选结果~

这两天各种社交媒体都被美国大选的消息刷屏,各种段子满天飞,把平时不怎么关注政治的小编都吸引了。 美国大选的投票数据,给小编的写作提供了非常宝贵的案例数据,毕竟四...

85750
来自专栏PPV课数据科学社区

【工具】用R软件绘制中国分省市地图

【注】新版本的maptools包对很多函数进行了修改,对于修改的内容,文章中用红色的文字进行了说明。 鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑...

58690
来自专栏PPV课数据科学社区

用python对汽车油耗进行数据分析

- 从http://fueleconomy.gov/geg/epadata/vehicles.csv.zip 下载汽车油耗数据集并解压 - 进入jupyte...

50780
来自专栏月色的自留地

就算会用python画颗心,可你依然还是只单身狗

24840
来自专栏龙行天下CSIEM

科学瞎想系列之八十四 永磁电机(6)

【图片部分来自网络如有侵权敬请邮箱联系。欢迎原文转发到朋友圈,未经许可的媒体平台谢绝转载,如需转载或合作请邮件联系。联系邮箱laolicsiem@126.com...

36920
来自专栏数据处理

Guess Number Higher or Lower II

15620
来自专栏数据小魔方

R语言可视化——数据地图应用(东三省)

今天是一个案例应用,采用东北三省地图进行离散颜色映射,让大家感受下R语言在地理信息空间可视化方面的强大功能,同时也会对之前强调过的地图配色技巧进行应用。 加载工...

1.1K50
来自专栏ATYUN订阅号

NLP项目:使用NLTK和SpaCy进行命名实体识别

命名实体识别(NER)是信息提取的第一步,旨在在文本中查找和分类命名实体转换为预定义的分类,例如人员名称,组织,地点,时间,数量,货币价值,百分比等。NER用于...

1.1K40
来自专栏逍遥剑客的游戏开发

有向无环图的自动布局算法

46550

扫码关注云+社区

领取腾讯云代金券