Let's Make a Bar Chart

作者: 雷朝建 | 来源:发表于2018-04-21 15:43 被阅读0次

    选择一个元素

    在d3中, 一般使用d3.select选择单个元素. 或者d3.selectAll选择匹配的所有元素.

    const body = d3.select('body');
    const div = body.append('div');
    div.html('Hello world!');
    
    const section = d3.selectAll('section');
    const div = section.append('div');
    div.html('Hello, world!');
    

    链式方法

    类似jQuery, 支持链式写法.

    d3.select('body').append('div').html('Hello, world!');
    

    SVG简介

    SVG中的<g>元素用来组合对象的容器. 添加到g元素上的变换会应用到其所有的子元素上.
    translate(x, y)用来移动对象, x/y分别对应坐标x/y轴.
    rect绘制矩形, 需要提供width和height.
    text绘制文本, 需要提供x/y坐标位置.

    绘制柱状图

    整体效果如下:


    image.png

    这里由四部分组成:

    • 柱状图部分(使用rect进行绘制)
    • 显示柱状图的值部分(使用text进行绘制)
    • x轴部分(使用d3.axisBottom进行绘制)
    • y轴部分(使用d3.axisLeft进行绘制)

    柱状图部分

        d3.select('.chart').attr('width', width + 50).attr('height', height + 50)
          .selectAll('rect').data(data)
          .enter().append('rect')
          .attrs({ x: (d, i) => x(i), y: d => y(d), width: barWidth, height: d => height - y(d) })
          .style('fill', 'green');
    

    这里先selectAll所有的rect(还未创建), 赋值其data, 然后通过enter后append(创建)多个rect. 通过设置其属性x, y, width, height进行rect的绘制.
    这里x(i), y(i)中的x, y分别为函数, 是从domain向range的转换.

    文本部分

        d3.select('.chart').selectAll('text').data(data)
          .enter().append('text')
          .attrs({ x: (d, i) => x(i) + 10, y: d => y(d) })
          .text(d => d)
    

    这里只需要简单的设置文本的x,y和text即可.

    x/y坐标轴代码

        const y = d3.scaleLinear().domain([0, d3.max(data)]).range([height, 0]);
        const x = d3.scaleBand().domain(d3.range(20)).range([0, width]);
    
        const gx = d3.select('.chart').append('g').attr('transform', `translate(0,${height})`);
        const xAxis = d3.axisBottom(x);
    
        const gy = d3.select('.chart').append('g').attr('transform', `translate(0,0)`);
        const yAxis = d3.axisLeft(y);
    
        gx.call(xAxis);
        gy.call(yAxis);
    
    • domain向range的转换: domain通常为实际数据的值, 例如区间为0~20, 而range为实际绘图区域的区间, 例如0~960px, 则设置后, 输入20定位到像素960px.
    • d3.axisBottom为d3封装的x轴坐标, d3.axisLeft为d3封装的y轴左侧坐标.

    源码

    https://github.com/leicj/d3/blob/master/src/components/bar.js

    相关文章

      网友评论

        本文标题:Let's Make a Bar Chart

        本文链接:https://www.haomeiwen.com/subject/mmcxlftx.html