Viz.js 之二分图 BiPartite(一)

本文对于 Viz.js 的二分图示例进行简单分析,并介绍图论中关于二分图的一些简单知识。

前置知识

在计算机科学中,图 Graph顶点(Vertex) 集合及顶点间的关系集合(称为 边Edge ) 组成的一种数据结构。一个图 G 可表示为: 。

二分图

二分图是图论中一种特殊的图。二分图的顶点 V 可分成两个独立的集合 V1与 V2,所有边都连结着 V1 与 V2 集合中的一个点。

其中, 是一个无向图。V1 集合与 V2 无交集。

Viz.js + D3.js

Viz.js 是一个基于 D3.js 的可视化布局方案,里面提供了 BiPartite(二分图) 的示例实现。如下:

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
  </head>
<style>
.viz-biPartite-subBar{
	shape-rendering:crispEdges;
}
.viz-biPartite-mainBar rect{
  fill-opacity: 0;
  stroke-width: 0.5px;
  stroke: rgb(0, 0, 0);
  stroke-opacity: 0;
}
.viz-biPartite-mainBar .perc{
  fill:white;
  text-anchor:middle;
  font-size:12px;
}
</style>
<body>
<svg width="960" height="700">
<g transform="translate(250,50)"></g>
</svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="http://vizjs.org/viz.v1.3.0.min.js"></script>
<script>

data=[
['A','X', 2]
,['A','Y', 3]
,['B','X', 5]
,['B','Y', 8]
,['C','X', 2]
,['C','Y', 9]
];

// 流程1
var bP = viz.biPartite()
	.data(data)

// 流程2
var bPg = d3.select("g").call(bP)

// 流程3
bPg.selectAll(".viz-biPartite-mainBar")
	.append("text")
	.attr("class","perc")
	.text(function(d){ return d3.format(".0%")(d.percent) })

// 流程 4
bPg.selectAll(".viz-biPartite-mainBar")
	.on("mouseover",mouseover)
	.on("mouseout",mouseout)
	
function mouseover(d){
	bP.mouseover(d)
	
	bPg.selectAll(".viz-biPartite-mainBar")
		.select(".perc")
		.text(function(d){ return d3.format(".0%")(d.percent) })
}

function mouseout(d){
	bP.mouseout(d)
	
	bPg.selectAll(".viz-biPartite-mainBar")
		.select(".perc")
		.text(function(d){ return d3.format(".0%")(d.percent) })
}
	
// adjust the bl.ocks frame dimension. Not part of example.
d3.select(self.frameElement).style("height", "700px"); 
</script>
</body>
复制代码

示例分析

  • 数据格式

    data = [
         ['A','X', 2]
        ,['A','Y', 3]
        ,['B','X', 5]
        ,['B','Y', 8]
        ,['C','X', 2]
        ,['C','Y', 9]
    ];
    复制代码

    data 是一个数组,其元素也是数组。数组元素中,第一个元素代表的是二分图的 V1 集合的点,第二个元素是二分图 V2 集合的点,第三元素可理解为对应点所连接线段的权重/值。

  • 代码流程

    1. 创建 viz.biPartite() 实例 bp ,并传递 data 数据。
    2. 选中 classviz-biPartite 下的所有 g 元素的集合,为 bPg。
    3. bPg 集合中的每个 p 元素设置依据 data 数据计算出来的百分比。
    4. bPg 集合中每个 p 元素添加鼠标移入/移出事件监听。
  • 结果

图 A : 图 A 是默认初始化的效果,左侧依次是 data 数据中第一元素中 A、B、C 各部分边值权重占全部权重的比例。右侧是第二元素 X,Y 占全部权重的比例,上半部分为 X 权重比,下半部分为 Y 权重比。

图 B:图 B 是 A 部分 mouseover 的效果,右侧分别是 A 部分 X,Y 及对应的权重比。

参考

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章