你绝对想不到,数据地图还能这么玩~
这个周末刷微信的时候,偶然看到一篇关于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
- 微信小程序获取用户信息签名解密C#
- Docker的核心概念,镜像操作
- RabbitMQ的基本使用到高级特性
- RabbitMQ的应用场景以及基本原理介绍
- JournalNode的edits目录没有格式化异常分析
- 聊一聊Javasript继承
- Git基础命令使用(个人总结)
- Centos搭建Docker环境
- Consul Config 使用Git做版本控制的实现
- 让XP支持4G内存
- Consul微服务的配置中心体验篇
- 如何使用Sentry实现Hive/Impala的数据脱敏
- 如何使用Oozie API接口向Kerberos环境的CDH集群提交Shell作业
- Docker下redis的主从、持久化配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring学习(2):Spring Bean管理(上)
- 聊聊dubbo-go的TpsLimitFilter
- spring,springBoot事件
- LeetCode-3.无重复字符的最长子串 利用一个整形数组+ASCII码实现滑动窗口
- 算法不想学(二): 堆排序和top k
- 利用python读取EXCEL文档中的创建者信息
- R语言工具变量与两阶段最小二乘法
- 贼好用的Java工具类库,GitHub星标13k+,很是厉害!
- CPU密集型任务会阻塞 Node.js 吗
- Let's Encrypt 配置 HTTPS 免费泛域名证书
- 如何删除重复数据(二)
- 如何删除重复数据
- SQL 生成斐波那契数列
- SQL 计算小计和总计
- SQL 的执行顺序