前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >地图可视化之——移花接木

地图可视化之——移花接木

作者头像
数据小磨坊
发布2018-04-11 15:48:52
9870
发布2018-04-11 15:48:52
举报
文章被收录于专栏:数据小魔方数据小魔方

本文所使用的代码是之前一篇关于航线图的数据,之所以要从新写一遍,是为了让大家体会借助在线地图制作地图可视化在代码效率上的便利(当然,也会有损失,你不能像操纵shapefile那样对地图的细节元素进行自定义了)。

本文调用得ggmap包,该包封装了包含Googlemap、openstreetmap、stamenmap等强大在线开源地图的地图素材背景,如果能仔细甄别、精心挑选,还是可以淘到不少好的背景的。

因为ggmap是哈神参与创建的包,专门为了拓展ggplot对于地图源的支持,弥补其制作数据地图方面的缺陷,所以我们从ggmap中get到的所有地图素材,都是可以直接供ggplot的图层函数调用的,只是之后的投影参数什么的部分会失效。(其实说起来,它相当于我们在之前的数据地图语法中,可以直接弃用ggplot()+geom_polygon()这两个部分,看过之前使用shp素材制作数据地图的小伙伴儿一定都知道,我们写代码的过程中,一般代码量都贡献给了shp素材的导入、抽取、整理、合并等过程,而调用ggmap的在线地图背景,确实可以省去不少功夫,代码量也小了很多!)。

library("plyr") library("dplyr") library("ggplot2") library("ggmap") library("maptools") library("maps") library("Cairo") library("baidumap")

这是从ggmap包中调用自定义范围和缩放级别的地图素材:

bbox_everest <- c(left =60, bottom =10, right =150, top =60) mapdata<-get_stamenmap(bbox_everest, zoom =5)

城市经纬度素材:

city_list<-c("西安","西宁","郑州","重庆","成都","石家庄","兰州","济南","大同","咸阳","包头") address<-getCoordinate(city_list, formatted = T) address<-data.frame(address,city=row.names(address),stringsAsFactors = FALSE)

del<-getCoordinate("长沙", formatted = T) del<-as.character(del) lonx<-as.numeric(rep(del[1],11)) laty<-as.numeric(rep(del[2],11))

address<-data.frame(address,lonx,laty) address$lonx<-as.numeric(address$lonx) address$laty<-as.numeric(address$laty)

names(address)[1:2]<-c("lon","lat") address$Num<-round(runif(11,50,100),2)

#-------------------------------------------------------------------------------------------------------------

图形代码:(气泡图+放射线图)

CairoPNG(file="C:/Users/Administrator/Desktop/航线图1.png",width=1000,height=670) ggmap(mapdata)+ geom_segment(data=address,aes(x=lon,y=lat,xend=lonx,yend=laty),size=0.3,colour="#FF6833")+ geom_point(data=address,aes(x=lon,y=lat,size=Num),shape=21,fill="#ED7D31",col="#E02939",alpha=.6)+ geom_point(data=NULL,aes(x=112.97935,y=28.21347),shape=21,size=8,fill=NA,col="steelblue")+ scale_size_area(max_size=8)+ theme_nothing() dev.off()

#####################################################################

气泡图+迁徙路径图

city_list<-c("海口","广州","长沙","武汉","郑州","石家庄","北京","沈阳","长春","哈尔滨") addA<-getCoordinate(city_list, formatted = T) addA<-data.frame(addA,city=row.names(addA),stringsAsFactors = FALSE)

data1<-addA[-1,] names(data1)[1:2]<-c("lonx","latx") data2<-addA[-length(row.names(addA)),] names(data2)[1:2]<-c("lony","laty")

addB<-cbind(data2,data1)[,-3]

addA$Num<-round(runif(10,50,100),2) names(addA)[1:2]<-c("lon","lat")

#-------------------------------------------------------------------------------------------------------

CairoPNG(file="C:/Users/Administrator/Desktop/航线图2.png",width=1000,height=670) ggmap(mapdata)+ geom_segment(data=addB,aes(x=lonx,y=latx,xend=lony,yend=laty),size=0.3,colour="#FF6833")+ geom_point(data=addA,aes(x=lon,y=lat,size=Num),shape=21,fill="#ED7D31",col="#E02939",alpha=.6)+ theme_nothing() dev.off()

#------------------------------------------------------------------------------------------------------

气泡图+闭环路径迁徙图

city_list3<-c("兰州","成都","重庆","贵阳","昆明","南宁","海口","广州","福州","上海","青岛","石家庄","呼和浩特","银川") addC<-getCoordinate(city_list3, formatted = T) addC<-data.frame(addC,city=row.names(addC),stringsAsFactors = FALSE) names(addC)[1:2]<-c("lon","lat")

datac1<-addC[2:14,] datac2<-addC[1,] addCC<-rbind(datac1,datac2) adddata<-cbind(addC,addCC) names(adddata)<-c("lonx","latx","city","lony","laty","city") adddata<-adddata[,-3] addC$Num<-round(runif(14,50,100),2)

#-------------------------------------------------------------------------------------------------------------

CairoPNG(file="C:/Users/Administrator/Desktop/航线图3.png",width=1000,height=670) ggmap(mapdata)+ geom_segment(data=adddata,aes(x=lonx,y=latx,xend=lony,yend=laty),size=0.3,colour="#FF6833")+ geom_point(data=addC,aes(x=lon,y=lat,size=Num),shape=21,fill="#ED7D31",col="#E02939",alpha=.6)+ scale_size_area(max_size=8)+ theme_nothing() dev.off()

#-------------------------------------------------------------------------------------------------------------

矩形气泡图:

CairoPNG(file="C:/Users/Administrator/Desktop/航线图4.png",width=1000,height=670) ggmap(mapdata)+ geom_point(data=address,aes(x=lon,y=lat,size=Num,fill=Num),shape=22,col="#E02939",alpha=.6)+ scale_fill_gradient2(low="#8E0F2E", mid="#BFBEBE", high="#0E4E75", midpoint=median(na.omit(address$Num)))+ scale_size_area(max_size=8)+ theme_nothing() dev.off()

#-------------------------------------------------------------------------------------------------------------矩形气泡图:

CairoPNG(file="C:/Users/Administrator/Desktop/航线图5.png",width=1000,height=670) ggmap(mapdata)+ geom_point(data=address,aes(x=lon,y=lat,size=Num,fill=Num),shape=23,col="#E02939",alpha=.6)+ scale_fill_gradient2(low="#8E0F2E", mid="#BFBEBE", high="#0E4E75", midpoint=median(na.omit(address$Num)))+ scale_size_area(max_size=8)+ theme_nothing() dev.off()

最后总结一下关于ggplot调用ggmap制作数据地图的几点建议:

  • 弄清业务分析场景:ggmap中的在线地图素材大多是特定场景素材,有道路图、河流图、交通图、卫星图、等高线图、地貌图植被图等,只有明确自己的图表使用场景才能选好素材。
  • 明白图形使用场景:ggmap的地图更适合用于电子屏幕演示,接近实景,比较震撼观众,但是也因素接近实景,背景太过噪杂,不适宜出版物级别的用途,想要做成的简洁、清新,还是使用诸如shapefile这素材导入,一点一点儿的调参美容,就跟绣花一样,效率低,但是效果好。
  • 语法上的差别:单纯使用ggplot结合shp素材制作,语法复杂,而借助ggmap,语法简洁,其中最重要的差异,我觉得是投影参数,在ggmap中请勿使用地图投影参数,因为在线地图本身自带投影,你不知情的情况下使用的投影格式很可能与素材的投影格式不一致,导致坐标错位。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档