资讯专栏INFORMATION COLUMN

D3的一点理解

ideaa / 1308人阅读

摘要:的一点理解用其官网的话来说是一个用于数据可视化的库。其将数据与绑定,通过建立数据与元素样式之间的关系,来表现数据,实现可视化。它也是上星第多的库。

D3的一点理解 D3

用其官网的话来说:

D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to life using HTML, SVG, and CSS.

D3是一个用于数据可视化的JS库。其将数据与DOM绑定,通过建立数据与DOM元素样式之间的关系,来表现数据,实现可视化。它也是github上星第4多的JS库。

不用工具绘制一个柱状图

成果图如下

代码如下


  ...
  
  
整理思路如下

选择画布

let chart = document.getElementsByClassName("chart")[0]

创建元素,通过元素的样式来表现数据

let div = document.createElement("div")
div.style.width = `${d}px`
div.textContent = d

将元素添加到画布上

chart.appendChild(div)

用D3绘制一个柱状图

整个思路中,首先要注意数据与元素数量之间的关系

有多少组数据,就应该对应有多少个元素

其次就是建立数据与元素样式之间的函数关系

例如数据与元素宽度之间的函数关系

function (data) {
  return data + "px";
}

数据与元素文本内容之间的函数关系

function (data) {
  return data;
}

我个人觉得,d3的 Data-Driven Documents,主要体现就是以上两点

用d3实现同样效果如下


  
理解数据与元素数量之间的关系

数据

let data = [30, 86, 168, 281, 303, 365]
本身就有对应数量的元素

如果在 .chart 中有对应数量的 div

那么就不需要额外添加 div 元素

d3.select(".chart")
      .selectAll("div")
      .data(data)
      .style("width", function (d) {
        return d + "px";
      })
      .text(function (d) {
        return d;
      });
本身就没有元素

如果没有 div 元素,就需要通过 enter().append("div") 来添加相应数量的元素

其中 enter()

Returns the enter selection: placeholder nodes for each datum that had no corresponding DOM element in the selection. (The enter selection is empty for selections not returned by selection.data.)
d3.select(".chart")
      .selectAll("div")
      .data(data)
      .enter().append("div")
      .style("width", function (d) {
        return d + "px";
      })
      .text(function (d) {
        return d;
      })
本身有过多数量的元素

如果在 .chart 中有过多数量的 div

那么就需要将多余的 div 移除,通过 exit().remove() 来实现

其中 exit()

Returns the exit selection: existing DOM elements in the selection for which no new datum was found. (The exit selection is empty for selections not returned by selection.data.)
d3.select(".chart")
      .selectAll("div")
      .data(data)
      .style("width", function (d) {
        return d + "px";
      })
      .text(function (d) {
        return d;
      })
      .exit().remove()
更新数据与元素数量之间的关系

首先要知道在 d3 中,数据与 DOM 元素并不是双向绑定的,在将数据绑定到元素之后,再次修改数据,元素并不会产生对应的变化

所以数据更新要手动完成

function update(data) {
      d3.select(".chart")
        .selectAll("div")
        .data(data)
        .style("width", function (d) {
          return d + "px";
        })
        .text(function (d) {
          return d;
        })
     // 如果元素不够,补足
      d3.select(".chart")
        .selectAll("div")
        .data(data)
        .enter().append("div")
        .style("width", function (d) {
          return d + "px";
        })
        .text(function (d) {
          return d;
        })
    // 如果元素多余,移除
      d3.select(".chart")
        .selectAll("div")
        .data(data)
        .exit().remove()
    }

完整实验代码





  
  
  
  D3.js
  



  
小结

d3提供的选择方法,能处理数据与元素数量不匹配的情况

当元素数量不够时,通过enter()能选择到那些用于补足的元素

当元素数量过多时,通过exit()能选择那些过剩的元素

d3方便了通过元素的样式来展现数据的过程,用户自己定义数据与元素样式之间的函数关系

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90481.html

相关文章

  • d3.js 创建完整柱形图

    摘要:之前只是各个部分的,现在将各部分整合起来,发现还是学到了不少东西主要是加深了对比例尺的理解代码样式及数据样式接着是数据及柱状图宽高等留白用创建比例尺实践之后对比例尺与坐标轴的理解加深了一点轴使用线性比例尺,注意输入域轴使用比例尺用于柱形 d3js.org v5.9.2 之前只是各个部分的demo,现在将各部分整合起来,发现还是学到了不少东西 主要是加深了对scale(比例尺)的理解...

    snowLu 评论0 收藏0
  • D3 源代码解析(二)

    摘要:第一节点位于第二节点内。例如,返回意味着在在内部,并且在之前。这个函数返回一个函数,返回的函数绑定了当前对象并执行。 这是继上一篇D3源码解构文章后的对D3的研究笔记,笔者的能力有限,如有哪里理解错误,欢迎指正。 对集合的操作 关于d3.attr 一个可以处理很多情况的函数,当只传入一个参数时,如果是string,则返回该属性值,如果是对象,则遍历设置对象的键值对属性值,如果参数大于等...

    tainzhi 评论0 收藏0
  • 声明式与响应式——前端新一代数据可视化方案

    摘要:数据可视化图表图表作为数据可视化最常见的表现形式之一,往往被以偏概全的认为图表就是数据可视化。严格来说,数据可视化应该是连接数据与视觉的一个映射关系,将数据映射成人更容易感知其规律的可视化结果。 题目中的新一代是个相对的概念,事实上本文即将介绍的方法已经有了生产环境可用的实现方案(这也侧面佐证了其可行性),但考虑到此方法与现在大部分前端项目中所使用的数据可视化方案相比仍有一些优势,因此...

    xuhong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<