是否可以在带有动态域的序数范围内使用rangeBand()?

Fra*_*ham 5 d3.js

我的数据看起来像这样......

var data = [{name:'a', value : 97},
          {name:'b', value : 24},
          {name:'c', value : 10}];
Run Code Online (Sandbox Code Playgroud)

我有一个像这样创建的序数量表......

var y = d3.scale.ordinal().rangeBands([0, 30 * data.length]);
Run Code Online (Sandbox Code Playgroud)

我用它来创建这样的基本图...

    chart.selectAll("rect")
        .data(data)
        .enter().append("svg:rect")
        .attr("y", function(d,i){ return y(d.name);})
        .attr("width", function(d,i){ return x(d.value);})
        .attr("height", y.rangeBand());
Run Code Online (Sandbox Code Playgroud)

根据d3文档(此处),您无需为序数规范指定域,并且在尝试使用它时将填充它.在我的情况下,但是y(d.name)总是返回0并且y.rangeBand()引发异常,即使我看到域数组已经填充在scale对象中.

所以,我通过预先定义我的域来解决这个问题...

.domain(data.map(function (d){ return d.name;}))
Run Code Online (Sandbox Code Playgroud)

但我希望能够动态添加到此域,如果我这样做,它不会超出创建时设置的原始值.这甚至可能吗?

我对d3很新,所以我可能会遗漏一些重要的东西.

mbo*_*ock 12

使用rangeBandsrangePoints,您必须定义域才能访问该范围.域告诉序数比例要显示多少个波段或点.但是,您可以稍后(通过调用scale.domain(newDomain))更改域,并且范围将更新.你不能通过将以前看不见的值传递给比例来隐式地做到这一点.无论如何,定义具有序数尺度的域通常是个好主意,这样您总能获得确定性行为.