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

浏览: 1888

这个周末刷微信的时候,偶然看到一篇关于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)

Clipboard Image.png

除此之外,你可以可以使用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)

Clipboard Image.png

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

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

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

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

推荐 2
本文由 EasyCharts 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册