我一直在寻找d3.box和d3.bullet。在这两种情况下,使用以下内容检索当前比例...
var x0 = this.__chart__ || d3.scale.linear()
.domain([0, Infinity])
.range(x1.range());
...其中x1
是当前的比例对象。我意识到这个习惯用于更新箱形图或子弹图,但任何人都可以解释如何? this.__chart__
指的是什么?一个尺度对象?为什么有条件? (||
)当当前比例不太可能具有如此大的范围时,为什么x0
的域覆盖范围0到无穷大?
如果我的问题没有明确指出,请道歉。任何帮助将不胜感激。
答案 0 :(得分:1)
this
上下文是包含图表的DOM元素:即g
元素。将一些变量绑定到DOM元素,例如this.myvar = state
,提供了一种处理图表特定状态的方法。对一个特定图表g元素进行多次更新调用,然后都可以访问同一个变量。
Mike和Jason在各种图表和d3 axis component中使用了属性名__chart__
,用于跟踪图表特定的状态。
你是对的,在这种情况下,它是存储在g元素的__chart__
属性中的比例。参见bullet.js的摘录:
// Compute the new x-scale.
var x1 = d3.scale.linear()
.domain([0, Math.max(rangez[0], markerz[0], measurez[0])])
.range(reverse ? [width, 0] : [0, width]);
// Retrieve the old x-scale, if this is an update.
var x0 = this.__chart__ || d3.scale.linear()
.domain([0, Infinity])
.range(x1.range());
// Stash the new scale.
this.__chart__ = x1;
因此,根据当前数据确定比例x1
。它将存储在__chart__
中,以便在将来使用新数据更新此图表时使用。
之前的比例来自this.__chart__
并保留在x0
。正在构建图表时(即进入阶段),this.__chart__
将返回undefined
。在这种情况下,x0
将成为d3.scale.linear().domain([0, Infinity]).range(x1.range())
。请参阅short circuit eval。
平稳过渡需要旧规模。输入新数据点时,我们首先要使用旧比例在图表上绘制它们。之后,我们将根据新的比例转换所有点(新的和更新的)。
关于[0,Infinity]域。因此,只有在构建图表时才会使用具有此域的比例。这意味着它提供了一种在引入图表时设置初始转换的方法。具有有限范围的无限域意味着所有点都缩放为0.因此,当设置图表时,所有点都将绘制为0并根据x1比例转换为适当的值。