D3.js DC.js xAxis范围,仅显示子集

D3.js DC.js xAxis范围,仅显示子集,d3.js,dc.js,D3.js,Dc.js,在下面的示例中,调整xAxis以仅从2-max显示“数量级事件数”的最佳方法是什么 更改此行: .x(d3.scale.linear().domain([0.5, 7.5])) 致: 这个答案扩展了@Gerardo的解决方案,使图表动态调整,并处理了一些dc.js的怪癖 首先,这个例子的原始作者只是为了让东西正常工作而捏造了一些东西。如果需要真正的动态轴,则需要向dc.js演示如何计算自身的条宽: magnitudeChart .xUnits(dc.units.fp.precision(0

在下面的示例中,调整xAxis以仅从2-max显示“数量级事件数”的最佳方法是什么

更改此行:

.x(d3.scale.linear().domain([0.5, 7.5]))
致:


这个答案扩展了@Gerardo的解决方案,使图表动态调整,并处理了一些dc.js的怪癖

首先,这个例子的原始作者只是为了让东西正常工作而捏造了一些东西。如果需要真正的动态轴,则需要向dc.js演示如何计算自身的条宽:

magnitudeChart
  .xUnits(dc.units.fp.precision(0.1))
然后删除
.gap(65)
——这种神奇的数字总是一个信号,表明有人不知道如何自动计算

dc.js处理条形图的方式有一些奇怪之处。首先,当它设置域时,它并没有真正考虑到它自己的条宽或中心-它使用的正是你给它的。您会注意到,在自动计算最大值时,最右边的条丢失了。(这也发生在
elasticX(true)
上。)

因此,让我们关闭条形居中,并在每次计算时将0.1条形宽度添加到域中

magnitudeChart
  .centerBar(false)
  .x(d3.scale.linear().domain([2, d3.max(data, d=>d.mag)+0.1]))
接下来,crossfilter不会自动删除空的存储箱,因此我们可以将组包装在一个容器中,以便执行此操作:

function remove_empty_bins(source_group) {
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                return d.value != 0;
            });
        }
    };
}

magnitudeChart
  .group(remove_empty_bins(magValueGroupCount))
我们可以让图表在每次重画时重新计算其域,如下所示:

.on('preRedraw', function(chart) {
  chart.x().domain([2, d3.max(chart.group().all(), kv=>kv.key) + 0.1]);
  chart.rescale();
});

分岔点:

感谢您的快速响应。这为我指明了正确的方向。我还没有想清楚我想要的是有序的还是线性的x标度。回顾我的数据,我实际上想要序数,一个很好的例子剖析。这会很有帮助的。很好的解释。你是dc的创造者,对吧?不,我刚刚维护了几年。我想我从回答问题中学到的比从编码中学到的更多,尽管我喜欢这两种活动。:-)
.on('preRedraw', function(chart) {
  chart.x().domain([2, d3.max(chart.group().all(), kv=>kv.key) + 0.1]);
  chart.rescale();
});