当前位置:   article > 正文

知识图谱可视化前奏之d3.js

d3.js渲染知识图谱

640?wx_fmt=gif

知识图谱可视化前奏之d3.js

0.说在前面1.d3.js初识2.绘制完整的柱形图3.让图表动起来4.浅析Update、Enter、Exit5.交互式操作6.作者的话

0.说在前面

这两天一直在更机器学习及leetcode,今天来一篇知识图谱的核心知识,那就是数据可视化,可视化方面霸主地位的d3,从认识到绘图,你将学会d3基本操作以及前端可视化的套路。

1.d3.js初识

D3.js是一个用于根据数据操作文档的JavaScript库。D3可帮助您使用HTML,SVG和CSS将数据变为现实。D3强调Web标准,为您提供现代浏览器的全部功能,而无需将自己与专有框架联系起来,将强大的可视化组件和数据驱动方法结合到DOM操作中。

d3.js引用

<script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>

选择器

  1. <P>Hello World1</P>
  2. <P>Hello World2</P>
  3. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  4. <script>
  5.     /*
  6.     选择器:d3.select()或d3.selectAll()
  7.     像下面d3.select().selectAll().text()这种称为链式语法
  8.     */
  9.     //d3.select("body").selectAll("p").text("Hello D3js")
  10.     var c = d3.select("body")
  11.           .selectAll("p")
  12.           .text("您好,d3.js!")
  13.     c.style("color","red")
  14.       .style("font-size","72px")
  15. </script>

选择器进阶

  1. <p>Apple</p>
  2. <p id="sec" class="twlas">Pear</p>
  3. <p class="twlas">hah</p>
  4. <h1>Banana</h1>
  5. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  6. <script type="text/javascript">
  7.     /*
  8.   1.选择所有的p
  9.     var p = d3.selectAll("p")
  10.   */
  11.     /*
  12.   2.选择第一个p
  13.     var p = d3.select("p")
  14.   */
  15.     /*
  16.   3.选择第二个p元素 给第二个设置个id,通过id查找
  17.     var p = d3.select("#sec")
  18.   */
  19.   /*
  20.   4.选择最后两个p元素 给最后两个设置相同的class,在查找时通过记得加.
  21.     var p = d3.selectAll(".twlas")
  22.     p.style("color","red")
  23.      .style("font-size","32px")
  24.      .style("font-weight","bold")
  25.   */
  26.   /*
  27.   5.通过function(d,i)设置第一和第三个style
  28.     p.style("color", function(d, i) {
  29.         if(i!=1) {
  30.             return "red"
  31.         }
  32.     })
  33.   */
  34.     //插入元素
  35.     var body = d3.select("body")
  36.     body.append("p")
  37.         .text("append p element")
  38.     //在id为sec前面插入一个p标签
  39.     body.insert("p","#sec")
  40.         .text("insert p element")
  41.     // 删除元素
  42.     var p = body.select("#sec")
  43.     p.remove()
  44. </script>

选择元素和绑定数据

  1. <p>Apple</p>
  2. <p>Pear</p>
  3. <p>Banana</p>
  4. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  5. <script type="text/javascript">
  6.     /*
  7.         选择元素和绑定数据
  8.         选择元素
  9.             ---d3.select();d3.selectAll() 函数返回结果为选择集
  10.         绑定数据
  11.             ---datum() 绑定一个数据到选择集上
  12.             ---data()  绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定
  13.     */
  14.     var p = d3.select("body")
  15.               .selectAll("p")
  16.     //------datum()练习------
  17.     var str = "China"
  18.     p.datum(str)
  19.      .text(function(d, i){
  20.         return "第 " + (i+1) + " 个元素绑定的数据是 " + d
  21.     })
  22.     /*
  23.         第 1 个元素绑定的数据是 China
  24.         第 2 个元素绑定的数据是 China
  25.         第 3 个元素绑定的数据是 China
  26.     */
  27.     //------data()练习------
  28.     var dataset = ["I like dogs""I like cats""I like snakes"]
  29.     p.data(dataset)
  30.      .text(function(d, i) {
  31.         return "第 " + (i+1) + " 个元素绑定的数据是 " + d
  32.      })
  33.      /*
  34.         第 1 个元素绑定的数据是 I like dogs
  35.         第 2 个元素绑定的数据是 I like cats
  36.         第 3 个元素绑定的数据是 I like snakes
  37.      */
  38. </script>

绘制柱形图

  1. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  2. <script type="text/javascript">
  3.     var width = 300
  4.     var height = 300
  5.     var svg = d3.select("body")
  6.                 .append("svg")
  7.                 .attr("width",width)
  8.                 .attr("height",height)
  9.     var dataset = [25021017013090];  //数据(表示矩形的宽度)
  10.     var rectHeight = 25;   //每个矩形所占的像素高度(包括空白)
  11.     //在 SVG 中,x 轴的正方向是水平向右,y 轴的正方向是垂直向下的
  12.     svg.selectAll("rect")
  13.      .data(dataset) //绑定数组
  14.      .enter() //指定选择集的enter部分
  15.      .append("rect"// 添加足够数量的举行元素
  16.      .attr("x",20)
  17.      .attr("y",function(d,i){
  18.          return i * rectHeight;
  19.      })
  20.      .attr("width",function(d){
  21.          return d;
  22.      })
  23.      .attr("height",rectHeight-2//减去2表示每个柱子之间留空白
  24.      .attr("fill","#09F");
  25.      /*
  26.         svg.selectAll("rect")   //选择svg内所有的矩形
  27.            .data(dataset)  //绑定数组
  28.            .enter()        //指定选择集的enter部分
  29.            .append("rect") //添加足够数量的矩形元素
  30.         当有数据,而没有足够图形元素的时候,使用此方法可以添加足够的元素。
  31.      */
  32. </script>

比例尺

  1. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  2. <script type="text/javascript">
  3.   /*
  4.   var dataset = [ 250 , 210 , 170 , 130 , 90 ];
  5.   绘图时,直接使用 250 给矩形的宽度赋值,即矩形的宽度就是 250 个像素。此方式非常具有局限性,如果数值过大或过小。于是,我们需要一种计算关系,能够:将某一区域的值映射到另一区域,其大小关系不变。这就是比例尺(Scale)。
  6.   */
  7.   /*
  8.   1.线性比例尺
  9.   线性比例尺,能将一个连续的区间,映射到另一区间。要解决柱形图宽度的问题,就需要线性比例尺。
  10.   */
  11.   var  dataset = [1.22.30.91.53.3]
  12.   var min = d3.min(dataset)
  13.   var max = d3.max(dataset)
  14.   /*
  15.     比例尺的定义域 domain 为:[0.9, 3.3]
  16.     比例尺的值域 range 为:[0, 300]
  17.   */
  18.   var linear = d3.scaleLinear()
  19.            .domain([min,max])
  20.            .range(0,300)
  21.   linear(0.9);    //返回 0
  22.   console.log(linear(2.3));    //返回 175
  23.   console.log(linear(3.3));    //返回 300
  24.   /*
  25.   2.序数比例尺
  26.   有时候,定义域和值域不一定是连续的
  27.   */
  28.   var index = [01234];
  29.   var color = ["red""blue""green""yellow""black"];
  30.   var ordinal = d3.scaleOrdinal()
  31.           .domain(index)
  32.           .range(color);
  33.   ordinal(0); //返回 red
  34.   ordinal(2); //返回 green
  35.   ordinal(4); //返回 black
  36. </script>

给柱状图添加比例尺

  1. <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  2. <script>
  3. var width = 300;    //画布的宽度
  4. var height = 300;    //画布的高度
  5. var svg = d3.select("body")                //选择文档中的body元素
  6.       .append("svg")                //添加一个svg元素
  7.       .attr("width", width)        //设定宽度
  8.       .attr("height", height);    //设定高度
  9. var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
  10. var linear = d3.scaleLinear()
  11.         .domain([0, d3.max(dataset)])
  12.         .range([0250]);
  13. var rectHeight = 25;    //每个矩形所占的像素高度(包括空白)
  14. svg.selectAll("rect")
  15.     .data(dataset)
  16.     .enter()
  17.     .append("rect")
  18.     .attr("x",20)
  19.     .attr("y",function(d,i){
  20.       return i * rectHeight;
  21.     })
  22.     .attr("width",function(d){
  23.         return linear(d);
  24.     })
  25.     .attr("height",rectHeight-2)
  26.     .attr("fill","steelblue");
  27. </script>

svg中添加坐标轴

  1. /*第一种方式*/
  2. var xaxis = d3.axisBottom(linearx)
  3.       .ticks(7);            //指定刻度的数量
  4. svg.append("g")
  5.    .call(xaxis);
  6. /*第二种方式*/
  7. function xaxis(selection) {
  8.   selection
  9.       .attr("name1""value1")
  10.       .attr("name2""value2");
  11. }
  12. foo(d3.selectAll("div"))
  13. //因此
  14. xaxis(svg.append("g"))

添加x与y坐标轴

  1. ...
  2. <head>
  3.     ...
  4.     <style type="text/css">
  5.         .xaxis,.yaxis text {
  6.             font-family: sans-serif;
  7.             font-size: 10px;
  8.         }
  9.     </style>
  10. </head>
  11. <body>
  12.     <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  13.     <script type="text/javascript">
  14.         var width = 300;    //画布的宽度
  15.         var height = 300;   //画布的高度
  16.         var svg = d3.select("body")             //选择文档中的body元素
  17.                     .append("svg")              //添加一个svg元素
  18.                     .attr("width", width)       //设定宽度
  19.                     .attr("height", height);    //设定高度
  20.         var datasetx = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
  21.         var linearx = d3.scaleLinear()
  22.                 .domain([0, d3.max(datasetx)])
  23.                 .range([0250]);
  24.         var lineary = d3.scaleLinear()
  25.                 .domain([0125])
  26.                 .range([0125]);
  27.         var rectHeight = 25;    //每个矩形所占的像素高度(包括空白)
  28.         datasety = [25,50,75,100,125]
  29.         svg.selectAll("rect")
  30.             .data(datasetx)
  31.             .enter()
  32.             .append("rect")
  33.             .attr("x",30)
  34.             .attr("y",function(d,i){
  35.                 return i * rectHeight;
  36.             })
  37.             .attr("width",function(d){
  38.                 return linearx(d);
  39.             })
  40.             .attr("height",rectHeight-2)
  41.             .attr("fill","steelblue");
  42.     //若axisBottom改为axisTop()则横坐标的ticks朝上
  43.         var xaxis = d3.axisBottom(linearx)
  44.                     .ticks(7);          //指定刻度的数量
  45.         var yaxis = d3.axisLeft(lineary)
  46.                     .tickValues(datasety)
  47.                     .ticks(7)
  48.     //在 SVG 中添加一个分组元素 <g>,再将坐标轴的其他元素添加到这个 <g> 里即可
  49.         svg.append("g")
  50.             .attr("class","xaxis")
  51.             .attr("transform","translate(30,0)")
  52.             .call(xaxis);
  53.         svg.append("g")
  54.             .attr("class","yaxis")
  55.             .attr("transform","translate(30,-2)")
  56.             .call(yaxis);
  57.     </script>
  58. </body>
  59. </html>

原理分析

  1. <!--通过以上代码,在谷歌浏览器上可以看出svg里面
  2. 就添加好坐标轴的分组g元素,里面又含有line与text元素,
  3. 分组元素<g>,是 SVG 画布中的元素,意思是 group。
  4. 此元素是将其他元素进行组合的容器,在这里是用于将坐标轴的其他元素分组存放。如果需要手动添加这些元素就太麻烦了,为此,D3 提供了一个组件:d3.axisBottom()。它为我们完成了以上工作。-->
  5. <g>
  6. <!-- 第一个刻度 -->
  7. <g>
  8. <line></line>   <!-- 第一个刻度的直线 -->
  9. <text></text>   <!-- 第一个刻度的文字 -->
  10. </g>
  11. <!-- 第二个刻度 -->
  12. <g>
  13. <line></line>   <!-- 第二个刻度的直线 -->
  14. <text></text>   <!-- 第二个刻度的文字 -->
  15. </g>
  16. ...
  17. <!-- 坐标轴的轴线 -->
  18. <path></path>
  19. </g>
640?wx_fmt=jpeg

scaleOrdinal使用

  1. //在上述代码中添加下面即可
  2. var xTexts = [ "我""你""他" ];
  3. var oridnal = d3.scaleOrdinal()
  4.                 .domain(xTexts)
  5.                 .range([0,100,250])
640?wx_fmt=jpeg

2.绘制完整的柱形图

  1. <body>
  2.     <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  3.     <script type="text/javascript">
  4.         //画布大小
  5.     var width = 400;
  6.     var height = 400;
  7.     //在 body 里添加一个 SVG 画布
  8.     var svg = d3.select("body")
  9.         .append("svg")
  10.         .attr("width", width)
  11.         .attr("height", height);
  12.     //画布周边的空白
  13.     var padding = {left:20right:30top:50bottom:20};
  14.     //定义一个数组
  15.     var dataset = [102030403324125];
  16.     //x轴的比例尺
  17.     var xScale = d3.scaleBand()
  18.         .domain(d3.range(dataset.length))
  19.         .rangeRound([0, width - padding.left - padding.right]);
  20.     //y轴的比例尺
  21.     var yScale = d3.scaleLinear()
  22.         .domain([0,d3.max(dataset)])
  23.         //[height - padding.top - padding.bottom, 0]这样可以使得y轴正方向向上
  24.         .range([ 0,height - padding.top - padding.bottom]);
  25.     //定义x轴
  26.     var xAxis = d3.axisTop(xScale)
  27.     //定义y轴
  28.     var yAxis = d3.axisLeft(yScale)
  29.     //矩形之间的空白
  30.     var rectPadding = 4;
  31.     //添加矩形元素
  32.     var rects = svg.selectAll(".MyRect")
  33.         .data(dataset)
  34.         .enter()
  35.         .append("rect")
  36.         .attr("class","MyRect")
  37.     //
  38.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  39.         /*
  40.         柱子绘制位置
  41.         */
  42.         .attr("x"function(d,i){
  43.             return xScale(i) + rectPadding/2;
  44.         } )
  45.         .attr("y",function(d){
  46.             return 0;
  47.         })
  48.         .attr("width", xScale.bandwidth() - rectPadding)
  49.         .attr("height"function(d){
  50.             return yScale(d);
  51.         });
  52.     //添加文字元素
  53.     var texts = svg.selectAll(".MyText")
  54.         .data(dataset)
  55.         .enter()
  56.         .append("text")
  57.         .attr("class","MyText")
  58.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  59.         .attr("x"function(d,i){
  60.             return xScale(i) + rectPadding/2;
  61.         } )
  62.         .attr("y",function(d){
  63.             return yScale(d);
  64.         })
  65.         .attr("dx",function(){
  66.             return (xScale.bandwidth() - rectPadding)/2;
  67.         })
  68.         .attr("dy",function(d){
  69.             return 20;
  70.         })
  71.         .text(function(d){
  72.             return d;
  73.         });
  74.     //添加x轴
  75.     svg.append("g")
  76.         .attr("class","axis")
  77.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  78.         .call(xAxis);
  79.     //添加y轴
  80.     svg.append("g")
  81.         .attr("class","axis")
  82.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  83.         .call(yAxis);
  84.     </script>
  85. </body>
640?wx_fmt=jpeg

图形修改及润色

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Document</title>
  6.     <style type="text/css">
  7.         .MyText {
  8.             fill: #37C743FF;
  9.             text-anchor: middle;
  10.         }
  11.         /*css修改柱子颜色*/
  12.         .MyRect {
  13.             fill: steelblue;
  14.         }
  15.     </style>
  16. </head>
  17. <body>
  18.     <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script>
  19.     <script type="text/javascript">
  20.         //画布大小
  21.     var width = 400;
  22.     var height = 400;
  23.     //在 body 里添加一个 SVG 画布
  24.     var svg = d3.select("body")
  25.         .append("svg")
  26.         .attr("width", width)
  27.         .attr("height", height);
  28.     //画布周边的空白
  29.     var padding = {left:20right:30top:20bottom:20};
  30.     //定义一个数组
  31.     var dataset = [102030403324125];
  32.     //x轴的比例尺
  33.     var xScale = d3.scaleBand()
  34.         .domain(d3.range(dataset.length))
  35.         .rangeRound([0, width - padding.left - padding.right]);
  36.     //y轴的比例尺
  37.     var yScale = d3.scaleLinear()
  38.         .domain([0,d3.max(dataset)])
  39.         //[height - padding.top - padding.bottom, 0]这样可以使得y轴正方向向上
  40.         .range([height - padding.top - padding.bottom0]);
  41.     //定义x轴
  42.     var xAxis = d3.axisBottom(xScale)
  43.     //定义y轴
  44.     var yAxis = d3.axisLeft(yScale)
  45.     //矩形之间的空白
  46.     var rectPadding = 4;
  47.     //添加矩形元素
  48.     var rects = svg.selectAll(".MyRect")
  49.         .data(dataset)
  50.         .enter()
  51.         .append("rect")
  52.         .attr("class","MyRect")
  53.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  54.         .attr("x"function(d,i){
  55.             return xScale(i) + rectPadding/2;
  56.         } )
  57.         .attr("y",function(d){
  58.             return yScale(d);
  59.         })
  60.         .attr("width", xScale.bandwidth() - rectPadding)
  61.         .attr("height"function(d){
  62.             //y轴朝上写法与上述y轴比例尺的.range([height - padding.top - padding.bottom, 0])配合使用
  63.             return height - padding.top - padding.bottom - yScale(d);
  64.         });
  65.     //添加文字元素
  66.     var texts = svg.selectAll(".MyText")
  67.         .data(dataset)
  68.         .enter()
  69.         .append("text")
  70.         .attr("class","MyText")
  71.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  72.         //text的x
  73.         .attr("x"function(d,i){
  74.             return xScale(i) + rectPadding/2;
  75.         } )
  76.         //text的y
  77.         .attr("y",function(d){
  78.             return yScale(d);
  79.         })
  80.         //dx为text的位移,向左为负,向右为正
  81.         .attr("dx",function(){
  82.             return (xScale.bandwidth() - rectPadding)/2 ;
  83.         })
  84.         //根据图形自己调整,dy为text相对于柱子的位移,向下为正,向上为负号
  85.         //当y坐标向下时,为默认情况,此时这里dy为正值时,则正常显示,但当y坐标为上,由于height - padding.top - padding.bottom - yScale(d),此时会出现覆盖情况,text不显示,需手动调整
  86.         .attr("dy",function(d){
  87.             return -5;
  88.         })
  89.         .text(function(d){
  90.             return d;
  91.         });
  92.     //添加x轴
  93.     svg.append("g")
  94.         .attr("class","axis")
  95.         .attr("transform","translate(" + padding.left + "," + (height - padding.bottom) + ")")
  96.         .call(xAxis);
  97.     //添加y轴
  98.     svg.append("g")
  99.         .attr("class","axis")
  100.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  101.         .call(yAxis);
  102.     </script>
  103. </body>
  104. </html>
640?wx_fmt=jpeg

3.让图表动起来

图表动起来

  1. 动态的图表,是指图表在某一时间段会发生某种变化,可能是形状、颜色、位置等,而且用户是可以看到变化的过程的。
  2. transition() 启动过渡效果
  3. duration() 指定过渡的持续事件 单位为毫秒
  4. ease() 指定过渡的方式 d3.easeBounce d3.easeLinear
  5. 调用:ease(d3.easeBounce)
  6. delay() 指定延迟的时间,表示一定时间后才开始转变,单位同样为毫秒。此函数可以对整体指定延迟,也可以对个别指定延迟。
  7. 对整体指定时:
  8.   .transition()
  9.   .duration(1000)
  10.   .delay(500)
  11. 如此,图形整体在延迟 500 毫秒后发生变化,变化的时长为 1000 毫秒。因此,过渡的总时长为1500毫秒。
  12. 又如,对一个一个的图形(图形上绑定了数据)进行指定时:
  13. .transition()
  14. .duration(1000)
  15. .delay(funtion(d,i){
  16.     return 200*i;
  17. })
  18. 如此,假设有 10 个元素,那么第 1 个元素延迟 0 毫秒(因为 i = 0),第 2 个元素延迟 200 毫秒,第 3 个延迟 400 毫秒,依次类推….整个过渡的长度为 200 * 9 + 1000 = 2800 毫秒。

为上述图形添加动态效果

640?wx_fmt=gif
  1. //添加矩形元素
  2.     var rects = svg.selectAll(".MyRect")
  3.         .data(dataset)
  4.         .enter()
  5.         .append("rect")
  6.         .attr("class","MyRect")
  7.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  8.         .attr("x"function(d,i){
  9.             return xScale(i) + rectPadding/2;
  10.         } )
  11.         .attr("width", xScale.bandwidth() - rectPadding)
  12.         .attr("y",function(d){
  13.             var min = yScale.domain()[0];
  14.             return yScale(min);
  15.         })
  16.         .attr("height"function(d){
  17.             return 0;
  18.         })
  19.         .transition()
  20.         .delay(function(d,i){
  21.             return i * 200;
  22.         })
  23.         .duration(2000)
  24.         .ease(d3.easeBounce)
  25.         .attr("y",function(d){
  26.             return yScale(d);
  27.         })
  28.         .attr("height"function(d){
  29.             return height - padding.top - padding.bottom - yScale(d);
  30.         });
  31.     //添加文字元素
  32.     var texts = svg.selectAll(".MyText")
  33.         .data(dataset)
  34.         .enter()
  35.         .append("text")
  36.         .attr("class","MyText")
  37.         .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  38.         //text的x
  39.         .attr("x"function(d,i){
  40.             return xScale(i) + rectPadding/2;
  41.         } )
  42.         //dx为text的位移,向左为负,向右为正
  43.         .attr("dx",function(){
  44.             return (xScale.bandwidth() - rectPadding)/2 ;
  45.         })
  46.         //根据图形自己调整,dy为text相对于柱子的位移,向下为正,向上为负号
  47.         //当y坐标向下时,为默认情况,此时这里dy为正值时,则正常显示,但当y坐标为上,由于height - padding.top - padding.bottom - yScale(d),此时会出现覆盖情况,text不显示,需手动调整
  48.         .attr("dy",function(d){
  49.             return -5;
  50.         })
  51.         //text的y
  52.         .attr("y",function(d){
  53.             //获取y的最小值
  54.             var min = yScale.domain()[0];
  55.             return yScale(min);
  56.         })
  57.         .transition()
  58.         .delay(function(d,i) {
  59.             return i*200
  60.         })
  61.         .duration(2000)
  62.         .ease(d3.easeCubic)
  63.         .attr("y",function(d){
  64.             return yScale(d)
  65.         })
  66.         //必须放在最后,否则报错!
  67.         .text(function(d){
  68.             return d;
  69.         });

4.浅析Update、Enter、Exit

what is Update and Enter?

  1. 如果数组为 [3691215],将此数组绑定到p的选择集上。
  2. 以下分为两种:
  3.   -第一种:数组元素(数据)大于p标签元素个数
  4.   -第二种:数组元素(数据)小于p标签元素个数
  5.   第一种情况中会有几个数组元素没有对应的p标签元素,此时这部分称为enter,而有数据与p元素相对应的称为update。
  6.   第二种情况中会有几个空余的p元素未能与数据相对应,此时没有数据绑定的部分被称为 Exit
640?wx_fmt=png

Update和Enter使用

给定一个元素个数为6的数组,3个p标签,分别处理Update与Enter

  1. <p></p>
  2. <p></p>
  3. <p></p>
  4. <script type="text/javascript" src="d3.min.js" charset="utf-8"></script>
  5. <script type="text/javascript">
  6.     var dataset = [3,6,9,15,18,20]
  7.     // 选择body中的p元素
  8.     var p =d3.select("body")
  9.              .selectAll("p")
  10.     //获取enter部分
  11.     var update = p.data(dataset)
  12.     //update部分的处理:更新属性值
  13.     update.text(function(d,i) {
  14.         return "index " + i +" update " + d
  15.     })
  16.     var enter = update.enter()
  17.     //enter部分的处理:添加元素后赋予属性值
  18.     enter.append("p")
  19.          .text(function(d, i){
  20.             return "index " + i +" enter " + d
  21.     });
  22. </script>

output

  1. index 0 update 3
  2. index 1 update 6
  3. index 2 update 9
  4. index 3 enter 15
  5. index 4 enter 18
  6. index 5 enter 20

Update 和 Exit 的使用

当对应的元素过多时 ( 绑定数据数量 < 对应元素 ),需要删掉多余的元素。

  1. &lt;p&gt;&lt;/p&gt;
  2. &lt;p&gt;&lt;/p&gt;
  3. &lt;p&gt;&lt;/p&gt;
  4. &lt;script type="text/javascript" src="d3.min.js" charset="utf-8"&gt;&lt;/script&gt;
  5. &lt;script type="text/javascript"&gt;
  6.     var dataset = [3];
  7.     //选择body中的p元素
  8.     var p = d3.select("body").selectAll("p");
  9.     //获取update部分
  10.     var update = p.data(dataset);
  11.     //获取exit部分
  12.     var exit = update.exit();
  13.     //update部分的处理:更新属性值
  14.     update.text(function(d){
  15.         return "update " + d;
  16.     });
  17.     //exit部分的处理:修改p元素的属性
  18.     exit.text(function(d){
  19.             return "exit";
  20.         });
  21.     //exit部分的处理通常是删除元素
  22.     // exit.remove();
  23. &lt;/script&gt;

output

  1. update 3
  2. exit
  3. exit

5.交互式操作

640?wx_fmt=png

用户用于交互的工具一般有三种:鼠标、键盘、触屏

  1. //添加矩形元素
  2. var rects = svg.selectAll(".MyRect")
  3.     .data(dataset)
  4.     .enter()
  5.     .append("rect")
  6.     .attr("class","MyRect")   //把类里的 fill 属性清空
  7.     .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  8.     .attr("x"function(d,i){
  9.         return xScale(i) + rectPadding/2;
  10.     } )
  11.     .attr("y",function(d){
  12.         return yScale(d);
  13.     })
  14.     .attr("width", xScale.bandwidth() - rectPadding )
  15.     .attr("height"function(d){
  16.         return height - padding.top - padding.bottom - yScale(d);
  17.     })
  18.     .attr("fill","steelblue")       //填充颜色不要写在CSS里
  19.     .on("mouseover",function(d,i){
  20.         console.log("MouseOver");
  21.         d3.select(this)
  22.             .attr("fill","yellow");
  23.     })
  24.     .on("click",function (d,i) {
  25.         console.log("Click!");
  26.     })
  27.     .on("mouseout",function(d,i){
  28.         console.log("MouseOut")
  29.         d3.select(this)
  30.             .transition()
  31.             .duration(500)
  32.             .attr("fill","steelblue");
  33.     });

6.作者的话

最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢!

640?wx_fmt=jpeg

我今天才知道,我之所以漂泊就是在向你靠近。

--《廊桥遗梦》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/489459
推荐阅读
相关标签
  

闽ICP备14008679号