美文网首页
D3.js API 入门

D3.js API 入门

作者: Pretty_Boy | 来源:发表于2019-01-11 16:22 被阅读14次

    看完该API后,至少会画出一个简单的图形 D3.js 入门

    1. d3-selection: 【 选择作图区域 / 添加图形 】
    允许强大的数据驱动文档对象模型 (DOM): 设置attributes, styles,properties HTML 或 text 内容等等。使用 data join 的 enter 和 exit 选择集可以用来根据具体的数据 add 或 remove 元素。

    常用API

    • d3.select( selector ) 从文档中选取第一个元素 , 返回一个selection
    • d3.selectAll( selector ) 从文档中选取所有匹配元素, 返回一个selection
    • d3.selector( selector ) 返回一个函数 this 指向匹配到的元素
    • d3.selectorAll( selector ) 返回一个函数 this 指向匹配到的元素
    • d3.matcher( selector ) 测试一个元素是否符合某种选择器.
    • d3.style( node, name ) 返回指定 node 的 name 对应的 style 属性值.

    如果 ‘参数’ 为函数,则会在选择前执行对应的函数,并且会传递当前元素的关联数据 (d),当前的索引 (i) 以及当前分组 (nodes),在函数中 this 指向当前 DOM 元素(nodes[i]). 为函数时必须return一个元素,或者 null。

    选择集可继续进行链式操作

    • selection.select( selector )
    • selection.selectAll( selector )
    • selection.filter( filter ) // filter 可以是一个选择字符串也可以是一个函数
    • selection.merge( otherSelection )
      当前选择集中的任何空缺 (null) 都会被指定的 other 中的对应的元素填充(如果存在的话),
      如果 other 选择集有附加的组或者父元素,则将其忽略。
      如果原选择集与指定的 other 选择集在同样的索引下都有元素,
      则原选择集中的元素会被返回而 other 选择集中的元素会被忽略。
    • selection.attr(name[, value]) 设置属性,value 可为函数
    • selection.classed(names[, value])
      names 可为数组 指定类名
      value 可为 boolean类型,是否启用names,
      为function时,为每个元素指定, 返回boolean
      为空时,返回selection中第一个非空元素是否启用该names
    • selection.style(name[, value[, priority]]) // priority为优先级 null / important
    • selection.property(name[, value])
      有些 HTML 元素的属性比较特殊,不能直接使用 attr 和 style 操作,
      比如文本域的 value 属性以及 checkbox 的 checked 属性。使用本方法可以操作这些属性。
    • selection.text/html([value])
    • selection.append(type)
    • selection.insert(type[, before])
      如果 type 为字符串则为选择集中每个选中的插入一个指定类型(标签名)的元素,插入的位置为第一个匹配 before 选择条件的元素
    • selection.remove()
      从当前文档中移除选中的元素。返回的选择集(被移除的元素)已经与文档脱离
    • selection.clone([deep]) // boolean
    • selection.sort(function)
      划重点: 数据绑定和事件
    • selection.data([data[, key]])
      当数据分配给元素时,会被存储在元素的 _ data _ 属性上, 因此可以在重新选中元素时继续使用与元素对应的数据。
    • selection.enter()
      选择集通常在数据比节点多时用来创建缺失的节点
    var div = d3.select("body")
      .selectAll("div")
      .data([4, 8, 15, 16, 23, 42])
      .enter().append("div")
        .text(function(d) { return d; });
    // 如果 body 初始为空,
    // 则上述代码会创建 6 个新的 DIV 元素并依次添加到 body 中,
    // 并且将其文本内容设置为对应的数值
    
    • selection.exit()
      选择集通常用来移除多余的元素

    • selection.datum([value]) 单纯的改数据
      获取或设置每个选中元素上绑定的数据。与 selection.data不同, 这个方法不会进行数据链接计算并且不影响索引, 不影响 enterexit 选择集.

    • selection.on( typenames[, listener[, capture]] )
      typenames 可多个 'click mouseover ...'
      typenames后面可以跟一个由( . )分割的可选的 name可选的名称允许在同一个事件类型上注册多个回调. 'click.foo'

    • 其他事件

    对selection的控制

    • selection.each(function)
    • selection.call(function[, arguments…])
    • selection.empty() // 当且仅当当前选择集中没有任何元素时返回 true.
    • selection.nodes() // 返回选择集中被选中元素的元素数组。
    • selection.node() // 返回选择集中第一个非空元素。如果选择集为空则返回 null。
    • selection.size() // 返回选择集中包含的元素个数。

    2. d3-scale: 比例尺 【 计算x,y轴 】
    continuous scale: linear, power, log, identity, time, sequential color

    • continuous(value) 根据给定的位于 domain 中的 value 返回对应的位于 range 中的值
    • continuous.invert(value)
    var x = d3.scaleLinear()
        .domain([10, 130])
        .range([0, 960]);
    
    x(20); // 80
    x(50); // 320
    x.invert(80); // 20
    x.invert(320); // 50
    
    • continuous.domain([domain]) 指定多个值的话会生成一个分段的比例尺
    • continuous.range([range]) 指定多个值的话会生成一个分段的比例尺

    domain 和 range 长度不一致时,取交集

    • continuous.clamp( boolean )
      设置钳位,启用后 则能保证返回的值总是处于范围内。

    • continuous.ticks([count])

    • continuous.tickFormat([count[, specifier]])

    var x = d3.scaleLinear()
        .domain([-1, 1])
        .range([0, 960]);
    
    var ticks = x.ticks(5),
        tickFormat = x.tickFormat(5, "+%");
    
    ticks.map(tickFormat); // ["-100%", "-50%", "+0%", "+50%", "+100%"]
    
    • continuous.nice([count])
      比如计算后的 domain 为 [0.201479…, 0.996679…] 时,在经过取整之后会被扩展为 [0.2, 1.0] 取整 仅影响第一个和最后一个值

    Scales

    • d3.scaleLinear() // 线性比例尺 y = mx + b
    • d3.scalePow() // 指数比例尺 y = mx^k + b
      pow.exponent([exponent]) 特殊的方法,获得指数
    • d3.scaleLog() // 对数比例尺 y = m log(x) + b.
    • d3.scaleSqrt() 开方比例尺
    • ... (d3.scaleIdentity(), d3.scaleLog())
    • d3.scaleTime() // 需要注意时间类型
      默认的 domain : [2000-01-01, 2000-01-02], range[0, 1]构造一个新的时间比例尺。
      time.ticks([count]) // 间隔数
      time.ticks([interval]) // 间隔时间
    var x = d3.scaleTime()
        .domain([new Date(2000, 0, 1, 0), new Date(2000, 0, 1, 2)]);
    
    x.ticks(d3.timeMinute.every(15));
    // [Sat Jan 01 2000 00:00:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 00:15:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 00:30:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 00:45:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 01:00:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 01:15:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 01:30:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 01:45:00 GMT-0800 (PST),
    //  Sat Jan 01 2000 02:00:00 GMT-0800 (PST)]
    

    time.tickFormat([count[, specifier]])
    time.tickFormat([interval[, specifier]])

    %Y - 年份,比如 2011.
    %B - 月份,比如 February.
    %b %d - 周, 比如 Feb 06.
    %a %d - 天, 比如 Mon 07.
    %I %p - 时, 比如 01 AM.
    %I:%M - 分钟, 比如 01:23.
    :%S - 秒, 比如 :45.
    .%L - 毫秒, 比如 .012.
    //如果想自定义自己的时间格式,请参考 [d3-time-format]
    
    • d3.scaleUtc()
    • d3.scaleSequential(interpolator) // 序列比例尺 domain 仅两个数值
      使用跟定的 interpolator 函数构造一个新的序列比例尺。在应用比例尺时,可以传入的值 [0, 1]。其中 0 表示最小值,1表示最大值。例如实现一个 HSL 具有周期性的颜色插值器:
    var rainbow = d3.scaleSequential(function(t) {
      return d3.hsl(t * 360, 1, 0.5) + "";
    });
    
    • d3.scaleDiverging(interpolator) // 发散比例尺 domain 仅三个数值
    • d3.scaleQuantize() // 量化比例尺 【连续输入 => 非连续输出 】 y = m round(x) + b
    var width = d3.scaleQuantize()
        .domain([10, 100])
        .range([1, 2, 4]);
    
    width(20); // 1
    width(50); // 2
    width(80); // 4
    width.invertExtent(2); // [40, 70]
    
    • d3.scaleQuantile() // 分位数比例尺 【非连续输入 => 非连续输出 】
      quantile(value)
      quantile.invertExtent(value)
      quantile.quantiles()
    • d3.scaleThreshold()
    var color = d3.scaleThreshold()
        .domain([0, 1])
        .range(["red", "white", "green"]);
    
    color(-1);   // "red"
    color(0);    // "white"
    color(0.5);  // "white"
    color(1);    // "green"
    color(1000); // "green"
    color.invertExtent("red"); // [undefined, 0]
    color.invertExtent("white"); // [0, 1]
    color.invertExtent("green"); // [1, undefined]
    
    • d3.scaleOrdinal([range]) // 序数比例尺
      序数比例尺的输出域和输入域都是离散的。例如序数比例尺可以将一组命名类别映射到一组颜色。或者确定一组条形图在水平方向的位置等等。
      ordinal.unknown([value])
      如果指定了 value 则将未知输入的输出值设置为指定的值。如果没有指定 value 则返回当前的未知值

    • d3.scaleBand() // 分段比例尺
      使用空的 domain:[0, 1],不设置 padding, 不设置 rounding 以及 alignment 构造一个新的分段比例尺。

    • d3.scalePoint() // 标点比例尺
      使用空的 domain, 单位 range:[0, 1], 不指定 padding ,rounding 以及 alignment 构造一个新的标点比例尺.


    3. d3-axis: 坐标轴 【 根据计算的x,y轴创建坐标轴 】
    坐标轴组件可以将 scales 显示为人类友好的刻度标尺参考,减轻了在可视化中的视觉任务。

    • d3.axisTop(scale)
    • d3.axisBottom(scale)
    • d3.axisLeft(scale)
    • d3.axisRight(scale)

    以下 axis = d3.axisRight/..()

    • axis.ticks(arguments…)
    • axis.ticks([count[, specifier]])
    • axis.ticks([interval[, specifier]])
      针对不同比例尺,有不同的ticks
    g.append("g").call(d3.axisLeft(y).ticks(10, 'ms'))   // 通过这样的方式 可使用链式调用
    
    • axis.tickValues([values]) // 如果存在value 则更改传入的刻度
    • axis.tickFormat([format]) // 更改文本格式化
      控制内侧外侧刻度的大小, 默认为6
    • axis.tickSize([size])
    • axis.tickSizeInner([size])
    • axis.tickSizeOuter([size])
      外侧刻度大小控制着刻度线的长度。外侧刻度表示的是坐标轴最外侧两端的刻度线。内侧刻度和外侧刻度不同,内侧刻度是一个个单独的 line 元素,而外侧刻度则实际上是坐标轴线 path 的一部分。此外外侧刻度可能和第一个或最后一个内侧刻度重合。
    • axis.tickPadding([padding]) // 设置刻度和刻度文本之间的间距 默认为3

    相关文章

      网友评论

          本文标题:D3.js API 入门

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