可视化篇:R可视化--迁徙/通勤图

写在最前

下面是《可视化篇:效果图》中第1、4、5、6、7张的实现说明



使用工具为R语言



工作后经常要做一些比较贴合用户级别的可视化,R的ggplot2在做一些学术或者理论研究上的可视化时,效果是非常好,基本上能想到的图ggplot都能画出(不要纠结双坐标和3D)

在作静态图时,ggplot2+AI可以展现出印刷级别的效果,具体可以查看:http://theinformationcapital.com/ 这里要感谢数据人网一位朋友,是他介绍的这本书。

在作动态图或者可交互的图表时,R+js是一个高阶的展示路径,下文展示的图表,都是R调用echart的API,用js画的,当然在使用的过程中我修改了部分源码,因为公司展示效果的需要。

下面图表我会把制作过程以及图背后的业务背景一一说一下,代码及数据均会附上。

图1数据:http://pan.baidu.com/s/1sjX42Nr

图2数据:http://pan.baidu.com/s/1i4wNlVf

图3,4数据:http://pan.baidu.com/s/1eRfYIDs 该部分数据是用R代码模拟,复制可运行。



开始前先安装一下REmap包,由于该包没有挂靠在cran上,所以要从GitHub 上下载:

library(devtools)
install_github("Lchiffon/REmap")

devtools包可按照正常方法下载,如果提示没有安装digest包,则再下载digest包即可。

一、2016年的广州春运

下图展示的是2016年2月6日广州人口迁往省外的情况,颜色越深表示迁往该省的人数越多,图中的线表示top10省份,即迁出的目标省份中人数最多的10个,广西湖南前二,还有一些统计数据的展示我没放上来,主要是那个直接在最终展示里画即可,这边负责的是迁徙的效果图。



实现代码:

这部分主要是设置文件可以保存于其他路径,方便之后的传输使用:

library(REmap)
options(remap.js.web = T)
#该函数在echart3.0更新时有bug,后来联系作者改了,如果是很久前下的REmap包,记得重新卸载该包后重新下载。

读取数据,上面提供了数据的下载地址

library(xlsx)
destin <- read.xlsx(file="C:/Users/Administrator/Desktop/destination.xlsx",1,encoding="UTF-8",header=F)
head(destin)

下面是一些数据的处理:

1.markLine_data有三列,第一列是出发地,第二列是目的地,第三列可有可无,建议设置成颜色。

2.此外该三列均为字符型,对应下文geoData数据框中的第三列,而geoData前两列分别lon(经度),lat(维度),第三列为字符型的地点名(可自己命名)。

3.格式不能乱。

markLine_data <- data.frame(origin=rep("广州",10),
                            destination=destin[1:10,1],
                            color=rep("#fff",10)
                            )
markPoint_data <- markLine_data[markLine_data!=""]
markPoint_data1 <- markPoint_data[which(markPoint_data!="广州")]    #作图时除去广州这个点
remapC(gz_to_other3,
       title="2016年2月6日 广州人口迁出图",
       subtitle="前10目标省份",
       theme=get_theme(
           #get_theme是调整背景颜色
           theme="Dark",
           lineColor = "#FFFFFF",
           titleColor = "#fff",
           borderColor = "#FFFFFF",
           regionColor = "#000000",
           pointShow = F,
           pointColor = "gold"
           ),
       color=c("#CD0000","#FFEC8B"),   #这里是颜色渐变方案

#这里的linedata,和下文的pointdata都是图中点线数据,线的主要是origin和destination两列,第三列可以设置颜色,
#个人建议在数据里设好好颜色,不要到参数里面设置,否则容易报错。

       markLineData=markLine_data,    #两列,第一origin,第二destination,第三可设置颜色

#这里的linetheme,和下文的pointtheme都是图中点线样式调整,参数不多,查看帮助文档可以明白
       markLineTheme=markLineControl(
           color="white",  #调整颜色
           lineWidth=2,    #调整线条宽度
           lineType="dashed"  #调整线条形状,dashed为虚线
           ),
       markPointData=markPoint_data1,   #三列,第一列经度,第二维度,第三点名,第四可设置颜色
       markPointTheme=markPointControl(
           symbolSize=13,   #调整点大小
           effect=T,              #调整点是否显示动态效果
           effectType="scale",    #调整点的形状
           color="white"
           )
       )

二、每早拥堵的上班线路

下图是某日早晨广州天河城周边的交通导图,该图主要是为了展示上班时期天河城周边交通效果,进一步的做一些人群标签画像等以及展示公司位置系统的交通监控能力等。



实现代码:

该图用的是REmap包里面的remapB函数,该函数的背景参数画不出下图效果,画出的是最后一幅图的背景,由于展示需要,只能手动修改该包源码,下面会贴出详细过程。

##中心点,天河城
thc_center <- c(113.328755,23.137588)

##read the data
lonlat_thc <- read.csv(file="C:/Users/Administrator/Desktop/lonlat_thc.csv",header=T)                                                            #已模拟数据,可下载,下面为对模拟数据做一些合并处理

#前三列为源点及经纬度,后三列为目标点及经纬度
head(lonlat_thc)
gdata1 <- lonlat_thc[,1:3]
names(gdata1) <- c("lon","lat","city")
gdata2 <- lonlat_thc[,5:7]
names(gdata2) <- c("lon","lat","city")
gdata <- rbind(gdata1,gdata2)
head(gdata)

markLine_data <- data.frame(origin=gdata1[,3],
                             destination=gdata2[,3],
                             color=rep("gold",length(gdata1[,3]))
                             )
markLine_Control <- markLineControl(symbolSize=c(0,0.1),
                                    smoothness=0,
                                    effect=T,
                                    lineWidth=3,
                                    lineType="dashed"
                                    )
remapB(center=thc_center,
       zoom=17,
       color="Blue",   #调整背景,此部分修改了源码,详见下文
       markLineData=markLine_data,
       markLineTheme=markLine_Control,
       geoData=gdata    #三列,第一列为经纬,第二维度,第三对应的点名
       )

对于remapB中的color参数,源码是在map.setMapStyle({styleJson: […]})函数中调用的,该段源码是一段json格式的数据,对应为百度地图的背景及标志等。

由于公司展示需要,我重新调整了整体配色方案,隐藏了各交通干道的标志和一些街道小建筑标志,留下一些标志性的建筑,使得可以比较清晰看清楚用户来源去向。调整的代码如下:

styleJson: [
          {
                    ‘featureType‘: ‘land‘,     #调整土地颜色
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#081734‘
                    }
          },
          {
                    ‘featureType‘: ‘building‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#04406F‘
                    }
          },
         {
                    ‘featureType‘: ‘building‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘highway‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘color‘: ‘#015B99‘
                    }
          },
          {
                    ‘featureType‘: ‘highway‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘arterial‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘color‘:‘#003051‘
                    }
          },
          {
                    ‘featureType‘: ‘arterial‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘green‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘water‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#044161‘
                    }
          },
          {
                    ‘featureType‘: ‘subway‘,
                    ‘elementType‘: ‘geometry.stroke‘,
                    ‘stylers‘: {
                    ‘color‘: ‘#003051‘
                    }
          },
          {
                    ‘featureType‘: ‘subway‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘railway‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘railway‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘all‘,
                    ‘elementType‘: ‘labels.text.stroke‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#313131‘
                    }
          },
          {
                    ‘featureType‘: ‘all‘,
                    ‘elementType‘: ‘labels.text.fill‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#FFFFFF‘
                    }
          },
          {
                    ‘featureType‘: ‘manmade‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘manmade‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘local‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘local‘,
                    ‘elementType‘: ‘labels‘,
                    ‘stylers‘: {
                    ‘visibility‘: ‘off‘
                    }
          },
          {
                    ‘featureType‘: ‘subway‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                              ‘lightness‘: -65
                    }
          },
          {
                    ‘featureType‘: ‘railway‘,
                    ‘elementType‘: ‘all‘,
                    ‘stylers‘: {
                              ‘lightness‘: -40
                    }
          },
          {
                    ‘featureType‘: ‘boundary‘,
                    ‘elementType‘: ‘geometry‘,
                    ‘stylers‘: {
                              ‘color‘: ‘#8b8787‘,
                              ‘weight‘: ‘1‘,
                              ‘lightness‘: -29
                    }
          }
    ]

!上面那段百度地图背景调整函数都比较浅显易懂,修改后记得运行markPointStr和markLineStr两个函数,remap函数也要手动运行一次。

PS:上面代码注释部分为R格式,放到网页里会出错,我删除掉了,多谢 杭州螃蟹 那个朋友的提醒。

三、愉快的购物人群多点

下图是天河城附近的购物场景图(多点),主要展示的是一个购物通勤效果,人流来源与聚焦点的情况,展示几大人流密集点,同时配合公司标签库在系统上展示人群特征情况,这可以为商铺做销售选择提供不小的帮助。



实现代码:

line_origin <- rbind(thc_df,zj_df,tgh_df,tyzx_df,wdl_df)
line_dest <- rbind(thc_ct,zj_ct,tgh_ct,tyzx_ct,wdl_ct)
#数据下载链接在文章开头,其中数据为R代码,复制到R命令行执行即可
markLine_data <- data.frame(origin=line_origin[,3],
                            destination=line_dest[,3],
                          color=rep("grey",length(line_origin[,3])
                            )
gdata <- rbind(line_origin,line_dest)

markLine_Control <- markLineControl(symbolSize=c(0,0.1),
                                    smoothness=10,
                                    effect=T,
                                    lineWidth=1.5,
                                    lineType="dashed"
                                    )
remapB(center=thc_center,
       zoom=17,
       color="Blue",
       # markPointData=markPoint_data,
       markLineData=markLine_data,
       # markPointTheme=markPoint_Control,
       markLineTheme=markLine_Control,
       geoData=gdata
       )

四、愉快的购物人群多点

下图是单点轨迹的购物场景,和上图目的差不多,实现方法类似,主要是中心点的选择。


五、通勤效果

下图通勤效果与上面两图目的差不多,只是效果展示不同,改图是是REmap包下remapB函数,color参数设置为blue即可,注意:此处为没有修改源码下的remapB函数。

时间: 2024-10-04 08:16:53

可视化篇:R可视化--迁徙/通勤图的相关文章

D3.js数据可视化(二)——绘制弦图(Chord Layout)

树图网可视化实验 1. 实验要求 要求通过树,或者图.网的可视化聚类,分析某个公司的邮件社交网络.根据要求设计可视化方案,并利用D3工具实现可视化效果. 2. 过程 2.1. 可视化方案的设计思路 2.1.1. 可视化要求 1) 可视化该邮件社交网络. 2) 该可视化中的每个Edge都对应着一个权重(Emails per month或者weight),要求将该权重属性映射到一个图形化的属性,比如,color,types of line,size or shapes. 3) 可视化方案中要体现每个

陈为著《数据可视化》书评及思维导图

在确定数据可视化为自己研究主题之初,我经常上网搜寻相关资料.但是初期的收集经常是杂乱无章,缺乏系统规划的.以至于我产生了三个困扰我的问题,分别是: 1. 信息可视化与数据可视化,到底有什么区别?或者说infographics 与visualization之间有何区别? 2.data visualization就是数据挖掘之后的用于显示结果的统计图吗? 3.曾经在知乎上看见某资深程序员直言,数据可视化在国内除了折腾一下社交网络外,没什么好做的,是这样吗? 今年4月以来,我终于有时间仔细研究相关问题

【数据可视化】数据可视化分类

数据可视化分为:科学可视化.信息可视化,可视化分析学这三个主要分支. 科学可视化,处理科学数据,面向科学和工程领域的科学可视化,研究带有空间坐标和几何信息的三维空间测量数据.计算模拟数据和医疗影像数据等,重点探索如何有效地呈现数据中几何.拓扑和形状特征.信息可视化,处理对象是非结构化.非几何的抽象数据,如金融交易.社交网络和文本数据,其核心挑战是如何针对大尺度高维数据减少视觉混淆对有用信息的干扰.可视分析学,由于数据分析的重要性,将可视化与分析结合,形成的新的学科. 科学可视化(Science

数据可视化(9)--数据可视化6步法

在当前互联网,各种数据可视化图表层出不穷,本文尝试对数据可视化的方法进行归纳,整理成6步法.一般的数据图表都可以拆分成最基本的两类元素: 所描述的事物及这个事物的数值,我们暂且将其分别定义为指标和指标值.比如一个性别分布中,男性占比30%,女性占比70%,那么指标就是男性.女性,指标值对应为30%.70%. 1. 将指标值图形化 一个指标值就是一个数据,将数据的大小以图形的方式表现.比如用柱形图的长度或高度表现数据大小,这也是最常用的可视化形式.传统的柱形图.饼图有可能会带来审美疲劳,可尝试从图

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding?Horror上有一篇文章,通过文氏图?Venn?diagrams?解释了SQL的Join。我觉得清楚易懂,转过来。

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同. A表 id na

科学计算三维可视化---TVTK库可视化实例

一:TVTK库可视化实例 Plot3D文件知识:PLOT3D 数据格式 PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件).网格文件中可加入所谓的IBlank参数. (一)标量数据可视化(等值面) generate_values()创建等值面 from tvtk.api import tvtk from Tvtkfunc import ivtk_scene,event_loop def read_data(): #导入数据

ggplot2包--R可视化

1.ggplot2发展历程 ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley写软件的特 征,熟悉他的人就知道这不是他第一个“2”版本的包了(还有reshape2).带2的包和原来的包在语法上会有很大的改动,基本上不兼容.尽管如此,他的R代码风格在R社区可谓独树一帜,尤其是他的代码结构很好,可读性很高,ggplot2是R代码抽象的一个杰作.读者若感兴趣,可以在GitHub网站

D3.js数据可视化(一)——绘制热图(heat map)

二维标量可视化 1. 实验名称 二维标量的可视化. 2. 实验目的 使用d3以及提供的NBA篮球上个赛季的数据(basketball statics.xlsx),绘制一个热图(heat map). 3. 技术基础 Web, HTML, DOM, CSS, JavaScript, SVG. 核心技术为D3 —— Data-Driven Documents(数据驱动的文档).数据来源于你,而文档就是基于Web的文档(或者网页),代表可以在浏览器中展现的一切,比如HTML,SVG.D3扮演的是一个驱动

Python交互图表可视化Bokeh:5 柱状图| 堆叠图| 直方图

柱状图/堆叠图/直方图 ① 单系列柱状图② 多系列柱状图③ 堆叠图④ 直方图 1.单系列柱状图 import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline import warnings warnings.filterwarnings('ignore') # 不发出警告 from bokeh.io import output_notebook output_notebook(