D3.js,也叫 D3,表示数据驱动文档。

D3 是一个在浏览器里创建动态可视化数据的 JavaScript 库。它基于 web 标准,即 HTML、CSS 和 SVG 技术。

D3 获取输入数据并且映射到相应的可视化内容里。它支持不同的数据格式。

D3 允许将数据绑定到 DOM 上。你可以使用 D3 的内建方法通过 HMTL 或者 SVG 元素实现数据可视化。

D3 提供了大量控制数据的方法。

1.用D3给文档添加元素。
首先要选择select()这个标签元素,可用链式向标签里添加html节点append(),在往节点添加文本text(),
全选 d3.selectAll(“li”).text(‘list item’),选择所有的li标签,将其文本改为list item。
2.使用D3中的数据。

const dataset = [12, 31, 22];
d3.select('body').selectAll('h2').data(dataset).enter().append('h2').text('New Title')
选择不存在的 h2 元素。事实上,这段代码先选择页面上的 body元素,再选择所有的h2,它将返回空。
然后data()方法接收数组作为参数,并运行三次后面的代码,每次对应数组中的一个对象。
enter()方法发现页面中没有 h2 元素,但是需要 3 个(每个对应dataset中的一个对象)。
它将在body中添加带有文本 "New item" 的 h2 元素。

D3的动态数据。
d3.select('body').selectAll('h2').data(dataset).enter().append('h2').text(m=> (m+'nnn'))

d3.select('body').selectAll('h2').data(dataset).enter().append('h2').text(m=> (m+'nnn')).style('color','red')

3.给元素添加内联样式。就如上

4.根据数据更改样式

d3.select('body').selectAll('h2').data(dataset).enter().append('h2').text(m=> (m+'nnn')).style('color',d=>{
 if(d<20){return 'red'}
})

5.用D3添加样式 。~.attr(‘class’,‘red’)
6.动态更新元素的高度。 ~.style(“height”,d=>d+“px”)
7.了解 D3 中的 SVG.

const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9];
    const w = 500;
    const h = 100;
    const svg = d3.select("body")
                .append('svg')
                .style('height',h)//attr
                .style('weight',w) //attr

8.用svg显示形状。在svg区域中创建图形。SVG 支持多种图形,比如矩形和圆形,并用它们来显示数据。例如,在条形图中一个矩形(rect )SVG 图形可以创建一个组。SVG 的rect有四个属性。x和y坐标指定图形放在svg区域的位置,height和width指定图形大小。
rect元素和div有一些不同,rect必须添加在svg元素内,而不能直接添加在body内。同时,你需要告诉 D3 将rect放在svg区域的哪个位置。
rect图形用fill属性着色, ~.attr(“fill”, ‘red’)

const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9];
    const w = 500;
    const h = 100;
    const svg = d3.select("body")
                  .append("svg")
                  .attr("width", w)
                  .attr("height", h)
                  .append('rect')
                  .attr("width", 25)
                  .attr("height", 100)
                  .attr("x", 0)
                  .attr("y", 10)
  或者
   const svg = d3.select("body")
                  .append("svg")
                  .attr("width", w)
                  .attr("height", h)
 svg.selectAll("rect").data(dataset).enter().append('rect')
   				  .attr("fill", 'red')
                  .attr("width", 25)
                  .attr("height", (d,i)=>{return d*3})
                  .attr("x", (d,i)=>{return i*30})
                  .attr("y", 10)
                  //8888反转svg//.attr('y',(d,i)=>h-3*d)
   d 指的是数据,dataset,而i指的是索引
   //9999添加标签
   svg.selectAll("text")
       .data(dataset)
       .enter()
       .append("text")
       .attr("x", (d, i) => i * 30)
       .attr("y", (d, i) => h - 3 * d-3) //-3 意思向上偏移
       .text(d=>d)//dataset
   //11111  添加title节点      
   svg.selectAll("title")
       .data(dataset)
       .enter()
       .append("title")
       .text((d) => d)

8.反转svg,y坐标为y = heightOfSVG - heightOfBar会将条形图向上放置。例如上代码
9.给D3元素添加标签。(柱状图 的标注),例如上代码
10.添加悬停效果。 先给rect添加class类,然后.bar:hover { fill: brown;}
11.添加title节点,例如上代码

12 .使用svg创建闪点图,Circles。他和rect条形图很类似。
但是数据应该是坐标,数组形式。柱状图有两个坐标x,y。但是闪点图有三个,cx-坐标的第一个数,cy- 坐标的第一个数,r-点的半径。

const dataset = [[ 34, 78 ],  [ 109,280 ], [ 310, 120 ],];  
    const w = 500;
    const h = 500;
    const svg = d3.select("body").append("svg").attr("width", w).attr("height", h); 
    svg.selectAll("circle")
       .data(dataset)
       .enter()
       .append("circle")
       .attr("cx", d=>d[0])
       .attr("cy", d=>d[0])
       .attr("r", 1)

13 .用D3创建线性比例。如果一组的高或者其中一个数据点比 SVG 的高或宽更大,它将跑到 SVG 区域外。D3 中,比例尺可帮助布局数据。Scales是告诉程序如何将一组原始数据点映射到 SVG 画布上像素的函数。
D3 有几种缩放类型。对于线性缩放(通常使用于定量数据),使用 D3 的scaleLinear()方法:
可以按比例设置域和范围。
缩放的输入信息,domain。
输入信息-范围range。
简单来讲就是 将输入信息 --映射 --输出信息

const scale = d3.scaleLinear().domain([250,500]).range([10,150])
    const output = scale(500);输入500的话就对应10-150的150.
    d3.select("body")
      .append("h2")
      .text(output);
找出最大值  或最小值min()和max()
const positionData = [[1, 7, -4],[6, 3, 8],[2, 8, 3]]
const output = d3.max(positionData, (d) => d[2]);
d3.select("body")
      .append("h2")
      .text(output);

14.根据数据集,设置比例尺,再画出适合svg容器的宽和高。并且添加到坐标轴,D3 有两种方法来渲染 y 轴和 x 轴,分别是axisLeft和axisBottom。const xAxis = d3.axisBottom(xScale);const yAxis = d3.axisLeft(yScale)

const dataset = [
                  [ 420,   220 ],
                  [ 233,   145 ],
                  [ 333,   96 ],
                  [ 222,    333 ],
                ];
    
    const w = 500;
    const h = 500;
    const padding = 30;
    const xScale = d3.scaleLinear()
                     .domain([0, d3.max(dataset, (d) => d[0])])
                     .range([padding, w - padding]);
    const yScale = d3.scaleLinear()
                     .domain([0, d3.max(dataset, (d) => d[1])])
                     .range([h - padding, padding]);
    
    const svg = d3.select("body")
                  .append("svg")
                  .attr("width", w)
                  .attr("height", h);
    
    svg.selectAll("circle")
       .data(dataset)
       .enter()
       .append("circle")
       .attr('cx',(d) => xScale(d[0]))
        .attr('cy',(d) => yScale(d[1]))
        .attr('r',10)
       .text(yScale(100))
 
    svg.selectAll("text")
       .data(dataset)
       .enter()
       .append("text")
       .text((d) =>  (d[0] + ", "
 + d[1]))
       .attr('x',(d) => xScale(d[0]+10))
        .attr('y',(d) => yScale(d[1]+10))
  const xAxis = d3.axisBottom(xScale);
    svg.append("g")
       .attr("transform", "translate(0," + (h - padding) + ")")
       .call(xAxis);
  const yAxis = d3.axisLeft(yScale)
     svg.append("g")
       .attr("transform", "translate(" + (  padding) + ",0)")
       .call(yAxis);