【D3.js数据可视化系列教程】(三十六)-- 冰柱图

原创 2013年12月06日 07:29:27

1. 冰柱图简介

冰柱图使用D3的分区布局实现,主要用来展现数据的层次和包含关系。实际上使用笛卡尔排列的分区布局数据绘制的就是冰柱图,径向排列就是旭日图。

下图给出的是笛卡尔排列方式。

  2. 冰柱图示例

冰柱图示例

  3. 实现冰柱图

  • (1) 定义冰柱图布局
var partition = d3.layout.partition()//递归分割节点树到一个旭日或冰柱。
    .size([width, height])//在x和y指定的布局大小。
    .value(function(d) { return d.size; });
  • (2) 用冰柱图布局转换数据
var nodes = partition.nodes(root);//计算分区布局并返回节点的数组。
  • (3) 绑定新数据添加节点和文字

略。详见代码~

  4. 完整代码

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>testD3-34-icicle.html</title>
<style>

.node {
  fill: #ddd;
  stroke: #fff;
}

.label {
  font: 10px sans-serif;
  text-anchor: middle;
}

</style>
</head>
<body>
<script src="d3.js" charset="utf-8" ></script>

<script>

var width = 960,
    height = 500;

var color = d3.scale.category20();

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);
// (1)冰柱布局
var partition = d3.layout.partition()//递归分割节点树到一个旭日或冰柱。
    .size([width, height])//在x和y指定的布局大小。
    .value(function(d) { return d.size; });

d3.json("Icicle.json", function(error, root) {
  // (2) 用冰柱图布局转换数据
  var nodes = partition.nodes(root);//计算分区布局并返回节点的数组。

  // (3) 设置文字和节点
  svg.selectAll(".node")
      .data(nodes)
      .enter().append("rect")
      .attr("class", "node")
      .attr("x", function(d) { return d.x; })
      .attr("y", function(d) { return d.y; })
      .attr("width", function(d) { return d.dx; })
      .attr("height", function(d) { return d.dy; })
      .style("fill", function(d) { //颜色:有孩子则返回自己的颜色,无孩子则返回爸爸的颜色
        return color((d.children ? d : d.parent).name);
       });

  svg.selectAll(".label")
      .data(nodes.filter(function(d) { 
         return d.dx > 6; 
      }))
      .enter().append("text")
      .attr("class", "label")
      .attr("dy", ".35em")
      .attr("transform", function(d) { 
        return "translate(" + (d.x + d.dx / 2) + "," + (d.y + d.dy / 2) + ")rotate(90)"; 
      })
      .text(function(d) { return d.name; });
});

</script>

</body>

  5. 数据:Icicle.json


{
    "name": "AAA", 
    "children": [
        {
            "name": "BBB", 
            "children": [
                {
                    "name": "CCC", 
                    "children": [
                        {
                            "name": "DDD", 
                            "children": [
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }, 
                                {   "name": "EEE", "size": 73   }
                            ]
                        }, 
                        {   "name": "DDD", "size": 73   }, 
                        {   "name": "DDD", "size": 39   }, 
                        {   "name": "DDD", "size": 67   }, 
                        {   "name": "DDD", "size": 73   }, 
                        {   "name": "DDD", "size": 39   }, 
                        {   "name": "DDD", "size": 67   }, 
                        {   "name": "DDD", "size": 73   }, 
                        {   "name": "DDD", "size": 39   }, 
                        {   "name": "DDD", "size": 67   }, 
                        {   "name": "DDD", "size": 73   }, 
                        {   "name": "DDD", "size": 39   }, 
                        {   "name": "DDD", "size": 67   }, 
                        {   "name": "DDD", "size": 73   }, 
                        {   "name": "DDD", "size": 39   }, 
                        {   "name": "DDD", "size": 67   }, 
                        {   "name": "DDD", "size": 73   }
                    ]
                }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }, 
                {   "name": "CCC", "size": 39   }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }, 
                {   "name": "CCC", "size": 39   }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }, 
                {   "name": "CCC", "size": 39   }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }, 
                {   "name": "CCC", "size": 39   }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }, 
                {   "name": "CCC", "size": 39   }, 
                {   "name": "CCC", "size": 67   }, 
                {   "name": "CCC", "size": 73   }
            ]
        }, 
        {   "name": "BBB", "size": 39   }, 
        {   "name": "BBB", "size": 67   }, 
        {   "name": "BBB", "size": 73   }
    ]
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【D3.js数据可视化实战】--(3)桑基图(sankey)的绘制

桑基图是流图(flow diagram)的一种,用来描述能量,人口,经济等的流动情况。 桑基图主要关注能量、物料或资本等在系统内部的流动和转移情况。起始流量和结束流量相同;在内部,不同的线条代表了不同...

【D3.js数据可视化系列教程】--(二)最简单的开始:添加元素

添加元素

【D3.js数据可视化系列教程】(二十八)--弦图

弦布局

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

d3.js+json-Python2014大会主题旭日图

原文地址:http://wow.techbrood.com/fiddle/2668javascriptvar margin = { top: 20, right: 0,...

桑基图(sankey)的绘制

转载自:http://blog.csdn.net/tianxuzhang/article/details/49624701 什么是桑基图用D3绘制简单的Sankey图添加文字圆形节点添加交互效果 ...

浅谈桑基图(Sankey diagram):理论、技巧与经典案例分析

原文地址:diagram):理论、技巧与经典案例分析" href="http://blog.sina.com.cn/s/blog_4a32ee3b0102duvw.html" target="_bla...

使用R画桑基图(流程图)

桑基图可以用来表示各个节点之间转换 在R中可以直接定义点点之间的关系后使用相应的package画桑基图: 方法一: riverplot library(riverplot) # 构造连接节点的...
  • xwydq
  • xwydq
  • 2015年04月09日 17:32
  • 8608

用旭日图展示数据的三种方法

本文介绍了用旭日图展示数据的三种方法,供大家学习了解。

【D3.js数据可视化系列教程】(三十五)-- 矩形树

TreeMap由Ben Shneiderman于1991年推出,TreeMap递归细分面积成矩形。与邻接图相比,树中任何节点的大小迅速显现出来。树形图是使用颜色区分类别,用嵌套的方形表示层次关系的布局...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【D3.js数据可视化系列教程】(三十六)-- 冰柱图
举报原因:
原因补充:

(最多只允许输入30个字)