美文网首页
d3.js学习笔记

d3.js学习笔记

作者: 江湖小盛 | 来源:发表于2022-12-15 15:35 被阅读0次

使用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 )

相关文章

  • Moreal D3.js Wiki

    导读 此文乃的学习笔记(https://kb.moreal.co/d3/),...

  • D3.js学习笔记(一)

    大数据蓬勃发展的时代,每天都是海量的数据在人类社会中产生。怎样从中获取有用的信息,变得越来越重要。获得信息最佳方式...

  • D3.js

    D3.js 为什么学习D3 D3.js和threejs的应用场景完全不一样。threejs主要应用与基于webGL...

  • nvd3柱状图制作

    最近初次接触D3.js和nvd3.js。尝试过更改一些例子,再结合官方的文档以及网上一些教程,对D3.js学习越多...

  • [译] D3.js 之 d3-shap 简介

    [译] D3.js 之 d3-shap 简介 译者注 原文: 来自 D3.js 作者 Mike Bostock 的...

  • [译]D3.js 之 d3-selection 原理

    [译]D3.js 之 d3-selection 原理 译者注 原文: 来自 D3.js 作者 Mike Bosto...

  • D3.js学习笔记(5)--布局(构图)

    D3提供的布局有12种,具体见官网:https://d3js.org/布局不是要直接绘图而是获取绘图所需数据 Bu...

  • D3.js学习笔记(3)--过渡效果

    动态图表 transition() 代码示例: duration() 过渡时长: ease() 过渡方式: del...

  • 用D3.js 十分钟实现字符跳动效果

    用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子 原文分为...

  • D3.js学习笔记(6)--写个饼图

    SVG基础 g标签 作用:将相关元素组合在一起的容器 path标签 path标签可以说是svg中的精华所在,路径元...

网友评论

      本文标题:d3.js学习笔记

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