zoukankan      html  css  js  c++  java
  • D3 数据可视化实战 笔记

    学习真是件奇妙的事情。这本书我之前都看过,有些的知识点却完全没有印象。

    总结:把用到的知识好好研究;平时可以了解其他技术的基础,把相关的资料和难点记录下来。

    javascript陷阱

    1、变量类型
    var myName = 'sfp';
    typeOf myName;          //'String'
    2、变量提升
    for(var i=0; i<100; i++){
       //...
    }
    //i在for循环开始之前就有了定义
    3、全局命名空间
    比较好的做法:只在函数里面声明变量;只声明一个全局对象。
    var local_name = {}   //声明空得全局变量,这样的话,只会给window增加一个变量。
    

    SVG

    <svg width='50' height='50'>
          <circle cx='25' cy='25' r='22' fill='blue' stroke='olive' stroke-width='1' />
    </svg> 

    需要给svg指定width,height;元素的属性值都不带单位

    //基础元素,path用于绘制复杂的图形
    <svg width='500' height='500'> <circle cx='25' cy='25' r='22' fill='blue' stroke='olive' stroke-width='1'></circle> <rect x='50' y='50' width='100' height='100'/> <ellipse cx='275' cy='75' rx='100' ry='25'/> <line x1='0' y1='200' x2='500' y2='200' stroke='red'/>
        //y为基线,注意文字不要被切掉 <text x='0' y='220' font-size='25'>sfp</text> </svg>

    为SVG元素添加样式:opacity

    比较好的做法:可以区分svg和css的样式

    svg .pumpkin{
      /*...*/
    }
    

    绘制顺序:数轴和数值标签,最后加到svg中

    为fill,stroke指定颜色的时候使用rgba(),可以设置透明度

    D3

    HTML文件中加上<meta charset='utf-8'>

    d3.select(''body).append('p'): 创建一个<p>,加到<body>末尾

    加载数据的最佳实践:csv, tsv, json

    var dataset;
    d3.json('data.json', function(error, data){
        if(error){
            console.log(error);
        }else{
            dataset = data;
            console.log(data);
            otherfunction();
        }
    });   
    //在callback也能使用返回的数据
    //加载文件遇到问题时,会有提示     
    

    绑定数据

    var dataset = [5, 10, 15, 20, 25];
    
    d3.select('body')
    	.selectAll('p')
         //此后所有的方法都将执行5遍 .data(dataset)
         .enter() .append('p') .text(function(d){ return d; });

    attr()设置dom属性的值;style()直接给元素添加css样式

    添加类.classed('bar', true);
    删除类.classed('bar', false);
    //.attr('class', 'bar')只能添加,不能删除,所以还是不用这种方法了。
    

    HTML属性width,<img>中就有,<div>中就没有,所以设置属性使用attr还是style的具体看看

    在DOM中创建一个元素,都用一个变量表示,方便以后使用。

    var dataset = [5, 10, 15, 20, 25];
    var w = 500;
    var h = 50;
    
    var svg = d3.select('body').append('svg');
    svg.attr('width', w)
        .attr('height', h)
        ;
    
    var circles = svg.selectAll('circle')
    					.data(dataset)
    					.enter()
    					.append('circle')
    					;
    circles.attr('cx', function(d, i){
    			return i*50+25;
    		})
    	    .attr('cy', function(d, i){
    	    	return h/2;
    	    })
    	    .attr('r', function(d, i){
    	    	return d;
    	    })
    

    一个svg元素只使用一个attr()和style(), 使用多值映射的方式

    比例尺:把输入域 映射为 输出范围

    dataset = [5, 10, 15, 20, 25];
    
    // 改为d3.scaleLinear() var scale = d3.scale.linear();
    // 定义域 scale.domain([100, 500]);
    // 值域 scale.range([10, 350]); //动态范围 d3.max(dataset); //25 var dataset_1 = [ [5, 20], [480, 90] ]; //二维数组 d3.max(dataset_1, function(d){ return d[0]; }) //480
    //.nice():把两端的值扩展到最接近的整数
    //.rangeRound():输出的值舍入
    //.clamp():超出范围的值,取整到最值

    数轴:生成轴线,标签,刻度

    dataset = [5, 10, 15, 20, 25];
    var format = d3.format('.1%'); var svg = d3.select('body').append('svg'); svg.attr({ 500, height:100 }) var scale = d3.scale.linear(); scale.domain([100, 500]); scale.range([10, 350]);
    // 改为axisBottom() var axis = d3.svg.axis() .scale(scale) .orient('bottom')
                       .tickFormat(format) ; svg.append('g') //把<g>交给axis() .classed('axis', true)
         //平移
         // 改为.attr('transform', 'translate(0, 50)') .attr({ transform: "translate(0, 50)" }) .call(axis) ;
    svg{
    	margin-top:100px;
    }
    
    .axis path{
    	fill:none;
    	stroke:black;
    	stroke-2px;
         //保证数轴和刻度线精确到像素级 shape-rendering:crispEdges; } .axis line{ fill:none; stroke:red; stroke-2px; shape-rendering:crispEdges; } .axis text{ color:red; }

    数轴会放在<g>中,有<line><text><path>三部分组成,可以各自设置样式

    指定刻度个数:ticks(5)

    垂直数轴:orient('left')

    动画

    使用序数比例尺生成条形图:更加简洁

    var w = 600;
    var h = 250;
    var dataset = [5,10,15,20,25];
    
    var svg = d3.select('body').append('svg');
    svg.attr({
       w,
      height:h
    });
    
    var xScale = d3.scale.ordinal()
                          //d3.range(2)--[0,1]
                          .domain(d3.range(dataset.length))
                          //将值域分为2档,输出值舍入,档间距为每档宽度的5%
                          .rangeRoundBands([0, w], .05)
                          ;
    
    svg.selectAll('rect')
        .data(dataset)
        .enter()
        .append('rect')
        .attr({
          //更新,根据i返回x的位置
          x: function(d, i){
            return xScale(i);
          },
          y: function(d, i){
            return h-d*10;
          },
          //直接得到width
           xScale.rangeBand(),
          height: function(d, i){
            return d*10;
          }
        })
    
    //过渡动画
    .transition()
    //延迟时间 .delay()
    //持续时间 .duration(1000)
    //缓动函数 .ease('linear')
    //过渡开始执行的操纵
    .each('start', function(){
      d3.select(this)
        .attr('', '')
        ;
    })
    .attr({})
    //过渡结束执行的操作
    .each('end', function(){
      ...
    }) ;

    9.3.7 剪切路径?

    忽略鼠标事件:pointer-events:none

    排序

    d3.selectAll('rect')
      .sort(function(a, b){
        return d3.ascending(a, b);
      })
    

    提示条

    .on('mouseover', function(d){
          console.log(d3.select(this).attr('x'));
    })
    

     

    以上有些修改,是因为之前使用的是V3,现在换为V4了。 

     

      

  • 相关阅读:
    产品设计理应遵循哪些原则?
    产品经理必读的九步法
    exec
    Class convert
    Connecting method
    ASP.NET读写操作
    Encrypt Decrypt
    EventHandler, EventArgs
    Convert using code
    Dictionary List
  • 原文地址:https://www.cnblogs.com/wang-jing/p/4629468.html
Copyright © 2011-2022 走看看