起点:
终点:
权重:
虽然只有三列数据,但是桑基图可以做出多级节点,在数据整合上,我们需要事前现将所有节点对应的起点、终点和权重值都顺序的纵向合并为三列字段。
第一个图是我们要呈现的原始数据,这样看来有两组对应关系,即大区对应地区、地区对应省份,我们如果要呈现这两组信息,只筛选出大区与地区对应关系及其权重值、地区与省份对应关系及其权重值,并将两组三变量数据表进行列对齐合并。(说的有点绕了,其实就是图表上有多少节点对,那么数据就有多少个三变量观测值)。
以下是R语言代码的实现过程:
library(Networkd3)
library("d3Network")
library(xlsx)
library(Networkd3)
library("d3Network")
library(xlsx)
setwd("D:/R/File/")
Sankey<-read.xlsx("D:/R/File/SankeyData.xlsx",sheetName="Data",header=T,encoding='UTF-8',stringsAsFactors=FALSE,check.names=FALSE)
Sankeylinks<-Sankey
Sankeynodes<-data.frame(name=unique(c(Sankeylinks$Source,Sankeylinks$Target)),stringsAsFactors=FALSE)
Sankeynodes$index<-0:(nrow(Sankeynodes) - 1)
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Source",by.y="name")
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Target",by.y="name")
setwd("D:/R/File/")
Sankey<-read.xlsx("D:/R/File/SankeyData.xlsx",sheetName="Data",header=T,encoding='UTF-8',stringsAsFactors=FALSE,check.names=FALSE)
Sankeylinks<-Sankey
Sankeynodes<-data.frame(name=unique(c(Sankeylinks$Source,Sankeylinks$Target)),stringsAsFactors=FALSE)
Sankeynodes$index<-0:(nrow(Sankeynodes) - 1)
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Source",by.y="name")
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="Target",by.y="name")
Sankeydata<-Sankeylinks[,c(4,5,3)];names(Sankeydata)<-c("Source","Target","Value")
Sankeyname<-Sankeynodes[,1,drop=FALSE]
Sankeydata<-Sankeylinks[,c(4,5,3)];names(Sankeydata)<-c("Source","Target","Value")
Sankeyname<-Sankeynodes[,1,drop=FALSE]
使用d3Network包中的桑基图函数实现:
d3Sankey(Links=Sankeydata,Nodes=Sankeyname,Source="Source",Target="Target",Value="Value",NodeID="name",
fontsize=12,nodeWidth=30,file="TestSankey.html")
使用d3Network包中的桑基图函数实现:
d3Sankey(Links=Sankeydata,Nodes=Sankeyname,Source="Source",Target="Target",Value="Value",NodeID="name",
fontsize=12,nodeWidth=30,file="TestSankey.html")
遗憾的是该包对中文支持不够友好~
#------------------------------------------
使用Networkd3包里面的桑基图函数实现:
sankeyNetwork(Links=Sankeydata,Nodes=Sankeyname, Source ="Source",
Target = "Target", Value = "Value", NodeID = "name",
units = "TWh", fontSize = 12, nodeWidth = 30)
使用Networkd3包里面的桑基图函数实现:
sankeyNetwork(Links=Sankeydata,Nodes=Sankeyname, Source ="Source",
Target = "Target", Value = "Value", NodeID = "name",
units = "TWh", fontSize = 12, nodeWidth = 30)
这次出来的结果还是挺满意的:
以上两种方式做出来的动态图表(调用了D3的在线图形库,格式是html格式的,如果你需要将HTML嵌入PPT中使用,那么本公众号早前曾经推送过一篇此类文章,讲解如何在PPT中嵌入HTML对象)。
http://mp.weixin.qq.com/s/_mDogi4G6LRTRiaAZIWaRw
PowerBI版讲解:
接下来讲解如何在PowerBI中实现以上桑基图效果,因为改图表并未包含在PowerBI的内置基础图表库中,所以我们需要在他的在线社区中下载该图表的可视化插件。
https://store.office.com/en-us/appshome.aspx?productgroup=PowerBI
关于如何下载PowerBI图形可视化插件,如何导入、加载和使用,此前的另一篇文章中也介绍的很详细。
然后导入你的桑基图数据源:
拖入对应字段:(仍然是三个字段,起点,终点,权重)
保存本地文件,并发布到PowerBI的云空间:
如果你还没有申请PowerBI的账户,那么最好去他的平台申请一个(提示需要使用教育邮箱或者工作邮箱,即.com.edu结尾的)。
发布成功之后,你的PowerBI控件中就存在此图表对象,以后你更新本地的那个PowerBI文件的时候,只需点击发布,空间中的对象也会同步更新。
然后打开你的PPT(需13及16版以上才可以)的应用商店内找到PowerBIFile插件。
点击添加,输入之前申请的账号密码,就会出现你的已存储的仪表盘对象,点击对应的桑基图对象,就可以完成导入。
导入后的桑基图无论是在PPT的编辑状态还是PPT的放映状态都可以保留所有的动态效果。(这就是微软的PowerBI与office平台对接后带来的强大优势,非常适合作为大屏幕交互演示来蹭亮点)
最后好像再强调一遍,Sankey是特定场景下呈现流量关系与结构对比所使用的,不要觉得这种图表很炫酷就各种乱用,数据可视化的要义很重要的一条就是,不可乱用图表,适当的场景使用合适的图表。
数据源会分享在魔方学院QQ群中:
欢迎关注魔方学院QQ群返回搜狐,查看更多