玩转数据地图系列之——地图上的迷你条形图
时间:2022-05-08
本文章向大家介绍玩转数据地图系列之——地图上的迷你条形图,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近忙的厉害,产量下降的有点严重,感谢各位还没取关的小伙伴儿。
一周前更新了一篇数据地图上的气泡散点图的内容,不知怎地,这段时间就是跟地图死磕上了,今天还是数据地图,不过是在数据地图上呈现条形图、柱形图。
之前的一篇因为有现成的作图包支持,geom_scatterpie函数不用花费太大力气就解决了数据地图上的气泡散点图问题。
可是到目前为止我还没有发现支持对应坐标位置的条形图、柱形图,这一篇是参考了知乎上大神提供的思路。
加载包:
library(maptools)
library(ggplot2)
library(plyr)
library(ggmap)
导入地图素材及省会城市经纬度数据
china_shp <-readShapePoly("c:/rstudy/bou2_4p.shp")
china_map <- fortify(china_shp)
province_city <- read.csv("c:/rstudy/chinaprovincecity.csv") #城市经纬度数据
#新建三个指标,2015年和2016年的某经济度量指标(虚构)N15、N16和环比增长率Ratio。
province_city1<-mutate(province_city,N15=runif(34,min=500,max=1000),N16=runif(34,600,1100),Ratio=round((N16-N15)/N15,3))
province_data<-province_city1[sample(nrow(province_city1),10),]
合并后的数据结构如下,随即选取了10个城市的14、15年度某项经济指标(虚构)以及同比增长率。
ggplot的现有图层图形中是没有直接根据点坐标生成条形图、柱形图的,所以这里我们只能曲线救国,使用线条图和误差线来进行模拟。
首先来画底图:
ggplot()+
geom_polygon(aes(x=long, y=lat, group=group), data=china_map, fill="white", colour="grey60")
接下来使用geom_linerange函数(也就是条线图函数)进行各个坐标点的模拟柱形绘制。
线画出14年的指标值:
ggplot()+
geom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+
geom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+N15/max(N15,N16)*5),size=5,color="orange",alpha=0.8)
再叠加一次16年的指标值
ggplot()+
geom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+
geom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",alpha=0.8)+
geom_linerange(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",alpha=0.8)
接下来我们来对已经塑造好的双柱条形图进行美化操作,
windowsFonts(myFont = windowsFont("微软雅黑"))
ggplot()+
geom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+
geom_linerange(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",alpha=0.8)+
geom_linerange(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",alpha=0.8)+
geom_text(aes(x=jd,y=wd-0.6,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+
theme_nothing()+
annotate("text", x=105, y=52, label="● 2015", color= "#5B88A0", size=8)+
annotate("text", x=105, y=49, label="● 2016", color= "#FB882C", size=8)
其实最初在网上看到该图(大概是刘万祥老师的博客,在此感谢老师的启发),他的做法是使用geom_errbar图层函数,也就是误差线图层函数,其实理念是一致的。这里给出原方法。
ggplot()+
geom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+
geom_errorbar(data=province_data,aes(x=jd-0.5,ymin=wd,ymax=wd+0.7*N15/max(N15,N16)*5),size=3,color="#5B88A0",width=0,alpha=0.8)+
geom_errorbar(data=province_data,aes(x=jd+0.5,ymin=wd,ymax=wd+0.7*N16/max(N15,N16)*5),size=3,color="#FB882C",width=0,alpha=0.8)+
geom_text(aes(x=jd,y=wd-0.6,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+
theme_nothing()+
annotate("text", x=105, y=52, label="● 2014", color= "#5B88A0", size=8)+
annotate("text", x=105, y=49, label="● 2015", color= "#FB882C", size=8)
其实如果能换个思路,使用geom_errorh函数,想必一定了以做出横向的条形图。
ggplot()+
geom_polygon(aes(x=long, y=lat,group=group),data=china_map, fill="white", colour="grey60")+
geom_errorbarh(data=province_data,aes(x=jd,y=wd,xmin=jd-3,xmax=jd+3*N15/max(N15,N16)),size=3,color="#5B88A0",height=0,alpha=0.8)+
geom_errorbarh(data=province_data,aes(x=jd,y=wd-0.8,xmin=jd-3,xmax=jd+3*N16/max(N15,N16)),size=3,color="#FB882C",height=0,alpha=0.8)+
geom_text(aes(x=jd+0.2,y=wd+1,label=paste0(province_data$province,ifelse(Ratio>0,"▲","▼"),Ratio*100,"%")), data=province_data,family="myFont",size=2.5)+
theme_nothing()+
annotate("text", x=105, y=52, label="● 2015", color= "#5B88A0", size=7)+
annotate("text", x=105, y=50, label="● 2016", color= "#FB882C", size=7)
以上思路仅供大家大家参考,就像伟大的哈德利.威科姆所说的一样,ggplot只是给你了一个发挥想象力的空间,无拘无束的发挥想象力,总能创造出令人惊讶的作品。
- 如何在mac本上安装android sdk
- Fityk-曲线拟合工具
- maven: 打包可运行的jar包(java application)及依赖项处理
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
- 恶心的0.5四舍五入问题
- 乐视金融更名 相关域名引关注
- weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native librar
- hadoop 2.6伪分布安装
- ssh 免密码设置失败原因总结
- C++服务器开发之基于对象的编程风格
- The jQuery UI CSS Framework
- hadoop:将WordCount打包成独立运行的jar包
- Hadoop: MapReduce2多个job串行处理
- UE4新手引导之下载和安装虚幻4游戏引擎
- 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 数组属性和方法
- Android MediaPlayer 播放音频的方式
- Android切圆角的几种常见方式总结
- Android DSelectorBryant 单选滚动选择器的实例代码
- Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)
- Android Canvas的drawText()与文字居中方案详解
- JeecgCloud版,部署项目。
- docker(镜像常用命令)
- [- Flutter基础篇 -] 聊聊那些弹框
- 聊一聊Android中的StateListAnimator
- Linux KeyLogger
- [- Flutter 数据&状态篇 -] InheritedWidget
- Android实现图片一边的三角形边框效果
- Android使用SoundPool播放短音效
- 用Jquery做一个进度条
- Android SoundPool实现简短小音效