D3.js version4教程(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26025363/article/details/78697204

D3.js version4教程(3)

比例尺

比例尺在数学上是个函数,是将一段范围的数根据某种映射关系转换成另一段范围的数.
主要应用场景:将原生的数据转换成图表上合适的数据.有的数据层次不齐,有的数据是范围不合适,这就需要将数据进行一次处理,转换成合适图表的数据.相当于对数据的一次加工.并且比例尺与坐标轴息息相关,坐标轴需要绑定比例尺.


比例尺的类型

比例尺在可视化中实现了一个基本的功能:将抽象的数据转换为可表示的视觉元素。经常使用位置来表达数据信息,比如将数据中的米映射为像素,比例尺可以方便的完成视觉转码,比如颜色,边线宽度或者符号尺寸等


连续性比例尺

(Linear, Power, Log, Identity, Time)
Continuous 是一个统称,描述的是同一类比例尺,具体的使用要通过linear, power, log, identity, time 或 sequential color 来创建。
连续型比例尺可以将连续的,可量化的输入 domain 映射到另一个一个连续区间 range.如果 range 也是数值类型,则映射可以 inverted(逆计算). 连续比例尺不会直接创建,而是使用 linear, power, log, identity, time 或 sequential color 来创建.

连续性比例尺共有API
  • continuous(value)
    给定domain范围中的一个value, 返回对应的range中的值。如果value超过了domain范围并且clamping没有设置,则返回的value也会超出设置的范围。例如:

  • continuous.invert(value)
    给定一个range范围内的value, 返回对应的domain中的值,相当于比例尺的逆计算。逆计算在交互中是很有用的,比如根据鼠标的位置计算对应的数据值。例如:
    如果给定的value超过了预设值的range,并且没有启用clamping 则会正确返回domain值,但是也是超出预设值的domain范围。逆计算只支持数值计算,如果range是非数值类型的,则返回NaN.
    因为浮点类型精度的限制所以逆计算是近似的。

  • continuous.domain([domain])
    如果指定了domain,则设置比例尺的domain为指定的数组。domain数组比如有两个或两个以上的元素。如果给定的数组元素非数值,则将其强制转换为数值类型。如果没有指定domain则返回当前的domain。
    一般情况下,domain和range都会设置两个值,表示起止范围。如果指定了多个值的话,会创建一个分段的比例尺。例如,创建一个负值在白色和红色之间插值,正值在白色和绿色之间插值的比例尺:
    在内部,分段比例尺使用binary search(二分查找)对给定domain和range进行查找。也就是说domain必须有序。如果domain和range的长度不同,分别为 N 和 M,那么取小的那一个。

  • continuous.range([range])
    如果指定了range则将比例尺的输出范围设置为range,给定的数组元素必须大于等于2个。和 domain不同,range的数组元素不一定为数值类型。任何支持interpolator都可以使用。要注意,如果要使用invert 那range的元素要为数值类型。如果没有指定 range则返回当前的range.

  • continuous.rangeRound([range]) <>
    将比例尺的range 设置为指定的数组。与countinuous.range([range])的插值方式不同,等于将比例尺的插值方式由 interpolator 设置为 interpolateRound.
    取整的插值方式有时候在避免锯齿方面是有效的。当然也可以使用 shape-rendering的 “crispEdges” 样式来进行反锯齿. 要注意这种插值方式只支持数值类型.

  • continuous.clamp(clamp)

如果指定了clamp,则启用或禁用clamp操作。clmap操作用来规定当输入数据超出domain或range时要如何计算。如果设置为true,那么当输入值超过domain时,输出值不会超出预定义的range范围。默认为false。例如:
如果没有指定,则返回当前的clmap设置。

  • continuous.interpolate(interpolate)

如果指定了interpolate ,则设置比例尺range的插值方式。插值方式会应用到每个比例尺片段(可能有多个片段)。这些插值方式会将domain映射到[0,1]之间,那么domain和range之间就通过[0,1]关联起来。然后根据插值器计算domain在[0,1]上对应的值,然后根据插值器计算这个值对应的range值。

扫描二维码关注公众号,回复: 3789746 查看本文章
  • continuous.ticks([count])

返回count个元素的数组,数组的取值是在domain中获。count是个参考值,使用时可能会做出调整。

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

返回一个number format(格式化)刻度显示方法,能对刻度进行格式转换。count应该根据实际的刻度值格式设置。

可选的 specifier(说明符) 可以对值进行custom format(格式化) .

  • continuous.nice([count])
    对domain 进行适当的扩展,以使其起始值是一个“整数”。当然如果本来就是整的,那就不做任何变化。比如如果你设置的domain为[0.201479…, 0.996679…], 在进行nice操作后就成了 [0.2, 1.0]. 如果domain有多个值,则只对第一个和最后一个进行取整操作.

  • continuous.copy()
    返回当前比例尺一个精确的拷贝。原比例尺和返回的比例尺之间互不影响。

线性比例尺

  • d3.scaleLinear()
    创建一个默认的线性比例尺。domain 默认为 [0, 1], range 默认为 [0, 1], 默认的插值类型为 interpolator, 默认clamping 不启用.

指数比例尺(Power Scales)

指数比例尺与线性比例尺类似,但是计算方法不同,比如对于x,计算对应y的方法为 y = mx^k + b, k is the exponent(指数).
- d3.scalePow()
创建一个默认的指数比例尺。默认的 domain 为 [0, 1], range 为 [0, 1], exponent 1.

平方根比例尺

  • d3.scaleSqrt()
    平方根比例尺,与power scale类似,但是exponent 为 0.5, 这是 d3.scalePow().exponent(0.5) 的一个快捷方式.

log比例尺(Log Scales)

Log比例尺也是连续性比例尺的一种。只不过以对数的方式计算domain和range之间的对应关系。对于输入x,计算输出y的公式为: y = m log(x) + b.
因为log(0) = -∞, 所以log比例尺的domain必须严格的正递增或负递减,不能跨越0.
- d3.scaleLog()
构建一个默认的log比例尺,默认 domain 为 [1, 10], range 为 [0, 1], base(对数低) 为 10, clamping 不启用.

(恒等比例尺)Identity Scales

恒等比例尺是一种特殊的线性比例尺,domain和range是一样的;这种比例尺的scale方法和invert方法时同一个方法。这种比例尺在使用像素坐标系统时会偶尔用,不支持rangeRound, clamp 或 interpolate.
- d3.scaleIdentity()
构建一个默认的恒等比例尺, 默认的domain 为 [0, 1], range为 [0, 1].

Time Scales

Time比例尺是linear scales 的一个变种: domain 和 invert 值为dates而不是简单的数值类型。Time比例尺的刻度实现基于 calendar intervals.


顺序比例尺(Sequential Scales)

顺序比例尺与continuous scales类似,都是将连续区间的值映射到另一个连续区间。但是与continuous scales不同的是,顺序比例尺的range是固定且不可配置的。Sequential Scales不提供invert, range, rangeRound 和 interpolate 方法.

  • d3.scaleSequential(interpolator)
    使用指定的interpolator构建一个顺序比例尺。插值函数是必须的。插值器在内部使用时参数是[0,1], 0对应domain的第一个值,1对应domain的最后一个值。
    也就是顺序比例尺在内部首先将 domain映射到[0,1],然后根据最后输入的domain对应的值传给插值器计算出整个比例尺输出结果.

  • sequential.interpolator([interpolator])
    根据一个[0,1]之间的值t,返回对应的 “viridis”颜色值。 这种颜色模式由 van der Walt, Smith and Firing 为 matplotlib设计,返回形式为RGB字符串.

  • d3.interpolateInferno(t)
    根据一个[0,1]之间的值t,返回对应的 “inferno” 颜色值。 这种颜色模式由 van der Walt, Smith and Firing 为 matplotlib设计,返回形式为RGB字符串.

    量化比例尺(Quantize Scales)

    Quantize(量化) 比例尺与linear scales相似,不一样的是输出range不是连续的,而是离散的。量化比例尺根据输出范围将输入分割成不同的片段,每个片段内的值都会对应同一个range值。这样就完成了连续到离散的转换。输入x与输出y之间的换算公式:y = m round(x) + b.

  • d3.scaleQuantize()
    构造一个新的使用默认设置的量化比例尺,domain默认为 [0, 1],range 默认为 [0, 1]. 默认的量化比例尺功能与Math.round 方法类似.
  • quantize(value)
    根据输入的value返回对应的range值

  • quantize.invertExtent(value)
    逆计算。与其他的”一对一”比例尺不同,因为量化比例尺是”多对一”的,即多个输入对应同一个输出,因此在做逆计算时,就成了”一对多”. 因此返回的是一个区间.


分位数比例尺(Quantile Scales)

Quantile(分位数)比例尺可以将一组样本输入映射到一组离散的值。分位数比例尺会对domain进行排序,然后将其映射到range上。可以根据输入的domain值计算出在range上的分位数。与d3-array的quantile类似
- quantile(value)
根据指定的domain值返回对应的range值.
- quantile.invertExtent(value)
逆计算出range值对应的domain区间.
- quantile.domain([domain])
设置或获取domain,如果设置domain会忽略NaN,null,undefined值。这些值不作为样本计算。在内部会对domain值进行转换(如果是非数值类型的话)并进行排序.
- quantile.range([range])
设置或获取range.
- quantile.quantiles()
返回分位数阈值。如果range 包含 n个值, 则会返回包含 n - 1 个值的阈值. 相当于从domain中提取参考点.


阈值比例尺(Threshold Scales)

Threshold(阈值)比例尺与quantize scales类似,只不过阈值比例尺允许将任意子集映射到离散区间。输入区间依然是连续的,但是会根据range被分割成一些切片.
- d3.scaleThreshold()
构建一个新的阈值比例尺,默认的 domain 为 [0.5] ,range 为 [0, 1]. 默认的阈值比例尺与Math.round 方法功能类似; 比如threshold(0.49) 返回 0, threshold(0.51) 返回 1.
- threshold(value)
根据输入的domain值返回对应的额range值

  • threshold.invertExtent(value)
    根据range逆计算出对应的domain区间

序数比例尺(Ordinal Scales)

与 continuous scales不同, 序数比例尺的domain和range都是离散的. 例如序数比例尺可以将一组名称映射到一组颜色值。
- d3.scaleOrdinal([range])
构造一个默认的序数比例尺,默认的domain和 range都为空.
- ordinal(value)
根据domain值返回对应的range值
- ordinal.domain([domain])
设置或获取序数比例尺的domain。第一个值被映射到range中的第一个值,第二个被映射到range中的第二个,以此类推。
- ordinal.range([range])
设置或获取序数比例尺的range范围
- ordinal.unknown([value])
如果domain输入没有对应的range值。则返回一个值,这个方法就是设置这个返回值。相当于设置一个未知值,在比例尺映射失败时返回这个值。
默认为implicit.
- ordinal.copy()
拷贝。原比例尺和新比例尺互不影响。
- d3.scaleImplicit
为 ordinal.unknown设计的一个特殊值.

Band Scales

Band比例尺与ordinal scales类似,输出结果是自动计算的并被分割成一段一段的。
- d3.scaleBand()
构建一个默认的Band比例尺。默认的 domain为空, range 为 [0, 1], 没有padding, 没有 rounding 和 alignment.
- band(value)
根据domain值返回对应的输出的band的起点。如果输入值不在domain中,则返回undefined.

Point Scales

Point比例尺是一个band scales的变种。只不过返回的是一个点,而不是band。


有关比例尺的部分大致就是这么多,下一部分内容是比例尺的插值器.

猜你喜欢

转载自blog.csdn.net/qq_26025363/article/details/78697204