R语言可视化——中心放射状路径图

最近一直在研究ggplot剩余还没有涉略过的图表类型,试图挖掘出一些新的图表形式,就像是该包的作者所暗示的那样,ggplot2只是给你搭建了一个图层语法环境,至于具体能创造出何种图形,全凭自己的想象力。

慢慢的我发现还有一类geom_segment对象自己一直没有尝试过,于是满心欢喜的尝试了一下,果然还是有收获的,我发现通过这个segment图层,可以批量的创建放射状线条图,也就是路径图,这解决了我一直以来的难题,今天顺便分享给大家。

加载包:

library(ggplot2) library(ggmap) library(plyr) library(maptools)

加载中国省份行政地图:

china_map<-readShapePoly("c:/rstudy/bou2_4p.shp") x <- china_map@data xs <- data.frame(id=row.names(x),x)

转换为数据框并合并城市数据:

china_map1 <- fortify(china_map) china_map_data <- join(china_map1, xs, type = "full") mydata <- read.csv("c:/rstudy/geshengzhibiao.csv") china_data <- join(china_map_data, mydata, type="full") province_city <- read.csv("c:/rstudy/chinaprovincecity.csv")

拆分兰州数据:

newdata<-subset(province_city,city=="兰州") newdata1<-subset(province_city,city!="兰州") sourcex<-rep(newdata$jd,33) sourcey<-rep(newdata$wd,33)

制作以兰州为中心的点对点作图数据:(可以类比之前REmap路径图数据源)

tagetx<-newdata1$jd tagety<-newdata1$wd dataA<-data.frame(sourcex,sourcey,tagetx,tagety) dataB<-newdata1[,1:2] dataC<-cbind(dataB,dataA) dataC$point<-round(runif(33,10,50))

利用geom_segment()图层制作放射路径图:

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ coord_map("polyconic") + geom_segment(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"))+ theme_nothing()

这里再稍微的扩展一下,其实以上你看到的放射状线条是兰州与其他城市之间的直线,之所以变的有弧度,只是因为加了地图投影的缘故,这里我可以取消投影参数,看下效果。

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ geom_segment(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"))+ theme_nothing()

这里取消投影参数之后,线条变成了点间直线,但是默认的不带投影的地图看起来与我们认知中的中国地图形状有些不一样,好像被压扁了一样。

其实这里还有一个图层函数也可以做出来这种放射状线条,geom_curve(),图层,不过它本身就是有弧度的曲线,曲率可以通过参数进行微调。

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ geom_curve(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"))+ theme_nothing()

曲率调整:

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ geom_curve(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"),curvature = 0.8)+ #用于调整曲率,范围在-1~1之间。 theme_nothing()

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ geom_curve(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"),curvature =-0.5)+ theme_nothing()

当然,通过图形叠加,我们还可以重复多次这样的放射状线条图。

以下以北京为例:

newdataA<-subset(province_city,city=="北京") newdataB<-subset(province_city,city!="北京") soux<-rep(newdataA$jd,33) souy<-rep(newdataA$wd,33) tagx<-newdataB$jd tagy<-newdataB$wd dataD<-data.frame(soux,souy,tagx,tagy) dataE<-newdataB[,1:2] dataF<-cbind(dataD,dataE) dataF$point<-round(runif(33,10,50))

两个中心的路径图(兰州、北京)

ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ coord_map("polyconic") + geom_segment(data=dataC,aes(x=sourcex,y=sourcey,xend=tagetx,yend=tagety,colour="red"))+ geom_segment(data=dataF,aes(x=soux,y=souy,xend=tagx,yend=tagy,colour="blue"))+ geom_point(data =province_city,aes(x=jd,y=wd),colour="red")+ theme_nothing()

当然,根据实际需要,你也可以将图层叠加N次,从而制作出与业务需求一致的多中心放射状路径图,这里只给出思路和大致步骤,感兴趣的小伙伴可以自己尝试。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2016-12-31

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

体育竞技游戏的团队AI

很多人问游戏AI该怎么做?随着游戏类型的多元化,非 MMO或者卡牌的游戏越来越多,对AI的需求也越来越强了。而市面上关于 AI的书,网上找得到的文章,也都流于一...

1864
来自专栏安富莱嵌入式技术分享

【安富莱二代示波器教程】第1章 示波器基础知识

本章的内容整理自网络,主要讲解示波器的基础知识。如果初学的话非常有必要对这部分知识有一个了解。因为示波器是硬件调试必不可少的设备。

1053
来自专栏Jerry的SAP技术分享

机器学习在SAP Cloud for Customer中的应用

关于机器学习这个话题,我相信我这个公众号1500多位关注者里,一定有很多朋友的水平比Jerry高得多。如果您看过我以前两篇文章,您就会发现,我对机器学习仅仅停留...

1532
来自专栏生信技能树

芯片数据分析,so easy?

我最早接触的高通量数据就是RNA-seq,后来接触的也基本是高通量测序结果而不是芯片数据,因此我从来没有分析过一次芯片数据,而最近有一个学员在看生信技能树在腾讯...

2593
来自专栏编程微刊

通过select下拉框里的value控制div显示与隐藏

1938
来自专栏WOLFRAM

多范式数据科学的应用:ThrustSSC超音速汽车工程

本文译自Wolfram技术沟通与战略总监Jon McLoone于2018年9月11日的博客文章:Thrust Supersonic Car Engineerin...

1362
来自专栏新智元

品质超高!超火的漫画线稿上色AI最新版来了(视频教程)

还记得那个给本子上色的Style2paints吗?这是目前最好的线稿上色AI工具,没有之一。

1192
来自专栏目标检测和深度学习

SCI论文快速翻译,免费无限制!OCR识别,阅读文献必备!

科研人员在阅读外文文献时,经常会碰到看不懂的专业词汇或语句,需要将其复制到在线词典翻译。

4262
来自专栏AI研习社

博客 | Github开源人体姿态识别项目OpenPose中文文档

人体姿态识别与估计的应用场景:抖音尬舞机、体育动作教学、3D健身教练、3D试衣、绘画辅助、游戏人物动作采集。

1.3K4
来自专栏媒矿工厂

TICO : UHD生产系统中的Mezzanine Codec

本帖参考M. Miyazaki等人发表在SMPTE Motion Imaging Journal的文章UHDTV-2 Mezzanine Compression...

2802

扫码关注云+社区

领取腾讯云代金券