【D3.js 学习总结】5、D3 SVG图表示例

简介: 之前有说到“D3制作图表的过程就是将各种SVG图形拼接在一起的过程”,具体来说折线图表就是`折线图`+`坐标轴`的组合,面积图是`折线图`+`坐标轴`+`面积图` 一个完整的SVG图表,是包含了各种数据、SVG图形、样式、交互组成的组合体,我们以面积图表来做一个示例展示: ## CSS svg{ font-size: 12px; }

之前有说到“D3制作图表的过程就是将各种SVG图形拼接在一起的过程”,具体来说折线图表就是折线图+坐标轴的组合,面积图是折线图+坐标轴+面积图

一个完整的SVG图表,是包含了各种数据、SVG图形、样式、交互组成的组合体,我们以面积图表来做一个示例展示:

CSS

  svg{
    font-size: 12px;
  }
  .line{
    fill:none;
    stroke-width:1;
    stroke:#000;
  }
  .axis line{
    stroke: #000;
    stroke-width: 1;
  }
  .axis .domain{
    fill:none;
    stroke-width:1;
    stroke:#000;
  }
  .area{
    fill: #eee;
  }

JAVASCRIPT

数据

    var _data = [
      [
        {"x":0,"y":4},
        {"x":1,"y":4},
        {"x":2,"y":6},
        {"x":3,"y":0},
        {"x":4,"y":7},
        {"x":5,"y":6},
        {"x":6,"y":1},
        {"x":7,"y":1},
        {"x":8,"y":7},
        {"x":9,"y":5},
        {"x":10,"y":3}
      ]
    ]

创建SVG容器

    var _width = 600;
    var _height = 300;
    var _margin = {top:30,right:30,bottom:30,left:30};
    var _xStart = _margin.left;
    var _xEnd = _width - _margin.right;
    var _yStart = _height - _margin.bottom;
    var _yEnd = _margin.top;

    var _svg = d3.select('body').append('svg')
        .attr('width',_width)
        .attr('height',_height);
    var _bodyG = _svg.append('g')
        .attr('transform','translate('+ _xStart +','+ _yEnd +')');

设置数据比例尺

    var _quadrantWidth = _width - _margin.left - _margin.right;
    var _quadrantHeight = _height - _margin.top - _margin.bottom;
    var _x = d3.scale.linear().domain([0,10]).range([0,_quadrantWidth])
    var _y = d3.scale.linear().domain([0,10]).range([_quadrantHeight,0])

生成X轴SVG图

    var _xAxis = d3.svg.axis()
        .scale(_x)
        .orient('bottom');

    _svg.append('g')
        .classed('x axis',true)
        .attr('transform', 'translate('+ _xStart +', '+ _yStart +')')
        .call(_xAxis);

生成Y轴SVG图

    var _yAxis = d3.svg.axis()
        .scale(_y)
        .orient('left');

    _svg.append('g')
          .classed('y axis',true)
          .attr('transform','translate('+ _xStart +','+ _yEnd +')')
          .call(_yAxis);

生成折线SVG图

    var _line = d3.svg.line()
        .x(function(d){return _x(d.x)})
        .y(function(d){return _y(d.y)});
    var _linePath = _bodyG.selectAll('.line').data(_data);

    _linePath
        .enter()
        .append('path')
        .classed('line',true);

    _linePath
        .attr('d', function(d){
          return _line(d);
        });

生成面积SVG图

    var _area = d3.svg.area()
        .x(function(d){
          return _x(d.x);
        })
        .y0(function(d){
          return _quadrantHeight;
        })
        .y1(function(d){
          return _y(d.y);
        })
    var _areaPath = _bodyG.selectAll('.area').data(_data);

    _areaPath
        .enter()
        .append('path')
        .classed('area',true);

    _areaPath
        .attr('d', function(d){
          return _area(d);
        });

总结

在这个示例中完整的展现了一个D3图表是怎么将数据与图形做绑定,以及如何将不同的SVG组合成一个完整的图表,还用到了目前为止没讲过的D3比例尺,这个在下节中来学习;

查看在线示例

目录
相关文章
|
15天前
|
开发框架 数据可视化 .NET
在Blazor中使用Chart.js快速创建图表
在Blazor中使用Chart.js快速创建图表
|
1月前
|
XML 编解码 前端开发
编程笔记 html5&css&js 033 HTML SVG
编程笔记 html5&css&js 033 HTML SVG
|
8天前
|
JavaScript 前端开发 应用服务中间件
node.js之第一天学习
node.js之第一天学习
|
12天前
|
存储 JavaScript 前端开发
JavaScript复杂功能实现:实时数据可视化图表
JavaScript复杂功能实现:实时数据可视化图表
|
30天前
|
JavaScript
js开发:请解释什么是ES6的扩展运算符(spread operator),并给出一个示例。
ES6的扩展运算符(...)用于可迭代对象展开,如数组和对象。在数组中,它能将一个数组的元素合并到另一个数组。例如:`[1, 2, 3, 4, 5]`。在对象中,它用于复制并合并属性,如`{a: 1, b: 2, c: 3}`。
12 3
|
30天前
|
JavaScript
js开发:请解释什么是ES6的默认参数(default parameters),并给出一个示例。
ES6允许在函数参数中设置默认值,如`function greet(name = 'World') {...}`。当调用函数不传入`name`参数时,它将默认为'World',提升代码简洁性和可读性。例如:`greet()`输出"Hello, World!",`greet('Alice')`输出"Hello, Alice!"。
15 4
|
1月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
18 6
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`<li>`),实现对动态生成列表项的点击事件处理。
|
1月前
|
运维 JavaScript 前端开发
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
|
1月前
|
JavaScript
Vue.js学习详细课程系列--共32节(4 / 6)
Vue.js学习详细课程系列--共32节(4 / 6)
33 0