d3.js学习笔记

使用D3查询SVG

  • d3.select(...)
d3.select('#rect1')
d3.select('#maingroup rect')
  • d3.selectAll(...)
d3.selectAll('.rect1')
d3..selectAll('rect')
d3.selectAll('#maingroup rect'')

使用D3设置SVG中的属性

  • element.attr(‘attr_name’, ‘attr_value’)
  • 常见的属性:
    id,class,
    x, y, cx, cy,
    fill, stroke,
    width,height,r,
    transform -> translate, rotate, scale
<rect id="test" class="test" stroke="black" width="60" height="60" fill="#000" x="300" y="300"></rect>
// 设置元素属性
d3.select('.test').attr('x', '100');
// 链式调用,.attr(…)返回的是选择的图元本身
d3.select('svg').attr('width', '100').attr('height', '100').attr('x', '300').attr('y', '300');
// 获取元素属性
const svgWidth = d3.select('svg').attr('width');
  • 修改组属性:
d3.select('#group').attr('transform', 'translate(100, 100)');

使用D3添加&删除SVG中的属性

  • element.append(...)
const myRect = d3.select('#test').append('rect').attr('x', '100');
const wrap = d3.select('#wrap').append('g').attr('id', 'group');
// 链式调用
const myRect = d3.select('.wrap').append('g').attr('id', 'group')
.append('rect').attr('fill', 'black').attr('width', '100').attr('height', '100');
  • element.remove(...)
d3.select('rect').remove()

D3数据读取- csv数据

  • d3.csv(...) 是异步函数
d3.csv('test.csv').then(res => {
  console.log(data)
})

D3数值计算

  • d3.max(array) // 返回数组中的最大值
  • d3.min(array) // 返回数组中的最小值
  • d3.extent(array) // 同时返回最小值与最大值,以数组的形式
d3.max([1, 2, 3, 5, 4]) // 5
d3.min([1, 2, 3, 5, 4]) // 1
d3.extent([1, 2, 3, 5, 4]) // [1, 5]
const arr = [
  {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  // 回调函数形式
  const maxAge = d3.max(arr, d => d.age) // 40
  const minAge = d3.min(arr, d => d.age) // 20
  const ageArange = d3.extent(arr, d => age) // [20, 40]

D3线性比例尺

  • 比例尺用于把实际数据空间映射到屏幕(画布)空间,即两个空间的转化
  • d3.scaleLinear():
    1、 定义一个线性比例尺,返回的是一个函数。
    2、eg: let scale = d3.scaleLinear(); // scale为函数
  • scale.domain([min_d, max_d]).range([min, max]):
    1、设置比例尺的定义域与值域。
    2、线性比例尺的定义域和值域都是连续的,需分别给出最大值与最小值。
    3、const scale = d3.scaleLinear().domain([0, 100]).range([0, 1000]);
  • 比例尺本质上是一个函数:
const scale = d3.scaleLinear().domain([0, 100]).range([0, 1000]);
console.log(scale(50)) // 500
console.log(scale(70)) // 700
  • 常结合读取的数据与d3.max等接口连用:
  const arr = [
    {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  const xScale = d3.scaleLinear()
    .domain([0, d3.max(arr, d => d.age)])
    .range([0, innerWidth])

D3Band比例尺

  • d3.scaleBand():
    1、定义一个‘条带’比例尺,返回的是一个函数。
    2、eg: let scale = d3.scaleBand();
  • scale.domain(array).range([min, max]):
    1、设置比例尺的定义域与值域。
    2、Band比例尺的定义域是离散的,值域是连续的。
const scale = d3.scaleBand().domain(['test1','test2', 'test3']).range([0, 120]);
console.log(scale('test2')) // 40
console.log(scale('test3')) // 80
  • 常结合array.map接口一起使用:
  const arr = [
    {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  const yScale = d3.scaleBand()
    .domain(arr.map(d => d.name))
    .range([0, innerHeight])
    .padding(0.1)

坐标轴

  • 定义坐标轴(获得结果仍是函数)
    1、const yAxis = d3.axisLeft(yScale);
    2、const xAxis = d3.axisBottom(xScale);
    3、axisLeft:左侧坐标轴
    4、axisBottom:底侧坐标轴。
    5、坐标轴的刻度对应比例尺的定义域。
    5、坐标轴在画布的绘制对应比例尺的值域。
  • 绘制坐标轴:
    1、const yAxisGroup = g.append('g').call(yAxis);
    2、const xAxisGroup = g.append('g').call(xAxis);
  • 任何坐标轴在初始化之后会默认放置在坐标原点,需要进一步的平移

引入坐标轴 - Margin

const margin = {top: 60, right: 30, bottom: 60, left: 200}
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const g = svg.append('g').attr('id', 'maingroup')
.attr('transform', `translate(${margin.left}, ${margin.top})`);

Data-Join

  • 本质上是将数据与图元进行绑定
  • data(…)只考虑数据和图元数目相同的情况
  • 调用形式:d3.selectAll(‘.class’).data(myData).join(‘图元’).attr(d => …).attr((d, i) => …)
  • .join(…)会根据数据的条目补全or删除图元。
  • 若有新增的数据,则会自动增加对应图元。
  • 若有修改的数据,则会自动更新对应图元。
  • 若有删除的数据,则会自动移除对应图元。

Data-Join – 用函数设置图元属性

  • 通过值设置属性
d3.select('rect').attr('attrbuteName', 'value')
  • 通过函数设置属性,函数的输入为绑定的数据,返回值为图元得到的属性值
d3.selectAll('rect').attr('width', (d, i) => d.age * 1000 )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简介 1. D3是什么? D3(或D3.js) 是一个用来使用Web标准做数据可视化的JavaScript库。...
    朝朝_c53e阅读 4,326评论 0 2
  • SVG基础 g标签 作用:将相关元素组合在一起的容器 path标签 path标签可以说是svg中的精华所在,路径元...
    黄清淮阅读 3,604评论 0 1
  • <u>D3中,比例尺和坐标轴是非常重要而且紧密相关的两个概念。</u> 比例尺: D3的比例尺:https://g...
    夜舞暗澜_3ea2阅读 5,096评论 1 1
  • D3.js 为什么学习D3 D3.js和threejs的应用场景完全不一样。threejs主要应用与基于webGL...
    强某某阅读 14,685评论 0 16
  • 近期在做线路图实时刷新的功能,用到的技术主要有d3、svg、websocket。整体思路就是解析线路图json,使...
    淼一___阅读 4,748评论 0 1