多维放射状流向图的最佳布局方案

最近,有很多小伙伴儿跟我咨询一个比较复杂的地图图表画法。

需求是这样的,一个国家各省或者全球各国之间存在的贸易关系、或者其他经济往来。想要用线条来表达这些指标的流向,同时使用线条粗细来表达指标流向的量级,我给他们的建议是,虽然你很明确要表达的意思,但是实际上这种形式所呈现的最终结果,可能并非你想要的。

如果在一个地图中这些线条都是从一个点发散出来的,这种表达形式虽说不妥,但是不算糟糕,但是倘若你的数据中是多个发散中心,即每个城市都会向其他各个城市发散出一组放射线条,同时线条还有粗细之分,那么最终的效果简直惨不忍睹。

当然我还是会用案例来把这种常规的想法用代码演示一遍,同时给出自己觉得最优的两种解决思路:

#加载包: library(ggplot2) library(dplyr) library(rgdal) library(shiny) library(shinythemes)

##转换为数据框并合并城市数据: china_map <- fortify(china_map) province_city <- read.csv("D:/R/rstudy/Province/chinaprovincecity.csv",stringsAsFactors = FALSE,check.names = FALSE)

###构造线条起始点数据: city<-c("北京","上海","重庆","天津","武汉","南京","广州","沈阳","西安","郑州") city_data<-merge(city,city)%>%rename(Start=x,End=y)%>%arrange(Start) city_data<-city_data%>%merge(province_city[,c("city","jd","wd")],by.x="Start",by.y="city",all.x=TRUE)%>%rename(Start_long=jd,Start_lat=wd) city_data<-city_data%>%merge(province_city[,c("city","jd","wd")],by.x="End",by.y="city",all.x=TRUE)%>%rename(End_long=jd,End_lat=wd) city_data<-transform(city_data,zhibiao1=runif(nrow(city_data),0,100),zhibiao2=runif(nrow(city_data),0,100),zhibiao3=runif(nrow(city_data),0,100))

###理所当然的普通做法1: ggplot()+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_segment(data=city_data,aes(x=Start_long,y=Start_lat,xend=End_long,yend=End_lat,size=zhibiao1),colour="black")+ coord_map("polyconic") + scale_size_area(max_size=2)+ theme_void()

###最合适的做法1:图形分面: ggplot()+

geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_segment(data=city_data,aes(x=Start_long,y=Start_lat,xend=End_long,yend=End_lat),colour="black")+ geom_point(data =city_data,aes(x=End_long,y=End_lat,size=zhibiao1),shape=21,fill="#8E0F2E",colour="black",alpha=0.4)+ scale_size_area(max_size=6)+ coord_map("polyconic") + facet_wrap(~Start,nrow = 2)+ theme_void()

###最合适的做法2:

Shiny动态交互图:

city_list<-list("北京"="北京","上海"="上海","重庆"="重庆","天津"="天津","武汉"="武汉","南京"="南京","广州"="广州","沈阳"="沈阳","西安"="西安","郑州"="郑州") ui <-shinyUI(fluidPage( theme=shinytheme("cerulean"), titlePanel("Population Structure Data"), sidebarLayout( sidebarPanel( radioButtons("var1","City",city_list,inline=FALSE), selectInput("var2","Value",c("zhibiao1"="zhibiao1","zhibiao2"="zhibiao2","zhibiao3"="zhibiao3"),selected="zhibiao1") ), mainPanel(h2("Trade Stream"),plotOutput("distPlot")) ) ))

server<-shinyServer(function(input,output){ output$distPlot <- renderPlot({ mydata=filter(city_data%>%filter(Start==input$var1)) argu<-switch(input$var2,zhibiao1=mydata$zhibiao1,zhibiao2=mydata$zhibiao2,zhibiao3=mydata$zhibiao3) ggplot(mydata)+ geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+ geom_segment(aes(x=Start_long,y=Start_lat,xend=End_long,yend=End_lat),colour="black")+ geom_point(aes(x=End_long,y=End_lat,size=argu),shape=21,fill="#8E0F2E",colour="black",alpha=0.4)+ scale_size_area(max_size=6)+ coord_map("polyconic") + theme_void() }) }) shinyApp(ui=ui,server=server)

本文分享自微信公众号 - 数据小魔方(datamofang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-27

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App

王瀚宸 编译自 Hackernoon 量子位 报道 | 公众号 QbitAI 上周末,量子位翻译了一份MobileNet教程,其中讲述了怎样在一个新的数据集上重...

54560
来自专栏量子位

“你的深度学习框架包含15个漏洞”,360说 | 附论文

允中 李林 编译整理 量子位 出品 | 公众号 QbitAI ? 注意!你的深度学习框架有漏洞! 这个警告来自360安全实验室(Qixue Xiao、Deyue...

35230
来自专栏DHUtoBUAA

基于电子海图的水面无人艇全局路径规划

  该论文已经在ICMIR2017会议上发表,附上springer的文献地址 Research and Implementation of Global Pat...

33850
来自专栏人工智能LeadAI

关于深度学习框架Hamaa与Python API文档生成工具Sophon

当时我学习Deep Learning已有两个月,看了很多论文、教程与博客,于是尝试着去阅读Keras的源代码来学习别人是怎么实现的,尤其是back propa...

14130
来自专栏新智元

【Science】破解密码“AlphaGo”诞生,训练Gan破解27%LinkedIn测试集密码

【新智元导读】一项新的研究旨在使用生成对抗网络(GAN) 来加快密码破解的速度。斯蒂文斯理工学院的研究人员用类似“AlphaGo”的方法,利用超过 4300 万...

36960
来自专栏DHUtoBUAA

基于电子海图的水面无人艇全局路径规划

Research and Implementation of Global Path Planning for Unmanned Surface Vehicle...

43250
来自专栏AI2ML人工智能to机器学习

All-in-one! 深度学习的Docker套装

跑深度学习Deep Learning已经快成为程序员必备技能了。 那么, 一个随手可得测试环境将是很必要的。 如果有时间有精力, 那么自己安装编译一个也不错。...

39220
来自专栏量子位

众筹项目能否成功?用机器学习预测可以早知道

安妮 编译自 Shrikar Archak 量子位出品 | 公众号 QbitAI Kickstarter是一家美国的众筹平台。自2009年成立至今,已经有36万...

40450
来自专栏机器之心

教程 | 如何用TensorFlow在安卓设备上实现深度学习推断

43750
来自专栏张红林的专栏

大规模机器学习框架的四重境界(下)

同步协议本节假设读者已经对随机梯度优化算法比较熟悉,如果不熟悉的同学请参考吴恩达经典课程机器学习中对SGD的介绍,或者我之前多次推荐过的书籍《最优化导论》。

1.2K00

扫码关注云+社区

领取腾讯云代金券