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

时间:2022-05-08
本文章向大家介绍你绝对想不到,数据地图还能这么玩~,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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