• Icicle partition


    <!DOCTYPE html>
    <html>
     <head>
       <title>Icicle</title>
     
       <script type="text/javascript" src="../d3.min.js"></script>
       <script type="text/javascript" src="Icicle.json"></script>
       <style type="text/css">
    rect {
      stroke: #fff;
    }
    
       </style>
     </head>
     <body>     
       <script type="text/javascript">
    //svg
    var w=900,h=500;
    var svg=d3.select('body')
              .append('svg')
              .attr({
                'width':w
                ,'height':h
              })
              ;
    //scale
    var x=d3.scale.linear()
                  .range([0,w])
                  ;
    var y=d3.scale.linear()
                  .range([0,h])
                  ;
    
    //color
    var color=d3.scale.category20c();
    
    //partition
    var partition=d3.layout.partition()
                           .children(function(d){
                            return isNaN(d.value)?d3.entries(d.value):null;//d.value是object,isNaN 为 true;var entry = d3.entries({ foo: 42 }); returns [{key: "foo", value: 42}];
                           })
                           .value(function(d){
                            return d.value;  //此d与之上的d不同,
                           })
                           ;
    
    //rect
    var rect=svg.selectAll('rect');
    var root=json;
    rect=rect.data(partition(d3.entries(root)[0]))   //d3.entries(root) return all entry;partition()转为分区函数。一定要赋值
        .enter()
        .append('rect')
        .attr({
            'x':function(d){
                return x(d.x);
            }
            ,'y':function(d){
                return y(d.y);
            }
            ,'width':function(d){
                return x(d.dx);
            }
            ,'height':function(d){
                return y(d.dy);
            }
            ,'fill':function(d){
                return color((d.children ? d : d.parent).key);
            }        
        })
        .on('click',clicked)
        ;
    
    function clicked(d) {
      x.domain([d.x, d.x + d.dx]);  
      y.domain([d.y, 1]).range([d.y ? 20 : 0, h]);
    
      rect.transition()
          .duration(750)
          .attr("x", function(d) { return x(d.x); })
          .attr("y", function(d) { return y(d.y); })
          .attr("width", function(d) { return x(d.x + d.dx) - x(d.x); })
          .attr("height", function(d) { return y(d.y + d.dy) - y(d.y); });
    }  
       </script>
     </body>
    </html>

    注:我用的是最简化的数据。

    如果想加text,也很简单,只是在clicked中会重新定义y,所以在更新text时需要x(d.x+d.dx/2);(大概),刚开始定义时也可这样写,因为没有变scale,所以x(d.x)+x(d.dx)/2;也行。

  • 相关阅读:
    ASP.NET存储过程自定义分页详解
    ajax php POST 提交例子
    一个用存储过程的基本分页及其调用
    DataGrid 存储过程的分页
    无刷新无限级菜单联动
    asp.net URL多参数傳值以及特殊符号传值问题
    ASP.NET页面间参数的传递
    Android动画开发——Animation动画效果
    android surface
    Android控件属性——android:cacheColorHint=“#00000000”
  • 原文地址:https://www.cnblogs.com/wang-jing/p/3702820.html
Copyright © 2020-2023  润新知