【问题标题】:Color issue on dc.js bar chart when filtered into a narrow range过滤到窄范围时 dc.js 条形图上的颜色问题
【发布时间】:2016-11-03 20:15:11
【问题描述】:

我正在制作一个 dc.js 条形图。该图表在其颜色数组中包含三种颜色,具体取决于条形图的值以及它们是否高于、低于或平均数值范围。它使用外部过滤器根据传入的规范重新创建图表值。如果使用外部过滤器将图表的 y 值缩小到相对较小的范围,则条形图将变为单色图表(特别是颜色中的第三种颜色)范围)。进一步检查似乎表明它与 dc.js 过滤无关,但当值的范围足够窄时可能会发生什么。

当范围变宽时颜色会正确变化,但是当范围变窄时,突然所有条都变成相同的颜色。

图表:

 that.ownerChart
            .width(400)
            .height(400)
            .margins({top: 0, left: 10, right: 10, bottom: 20})
            .dimension(that.dims.dOwner)
            .group(that._remove_empty_bins(that.groups.gOwner, (d) => { return d.value.avg; }))
            .ordering(function (x) {
                return x.value.avg * -1;
            })
            .on('filtered', onFilter)
            .fixedBarHeight(30)
            .cap(cap).othersGrouper(false)
            .elasticX(true)
            .renderTitleLabel(false)
            .leftLabel(function(x) {
                return x.key;
            })
            .leftLabelWidth(160)
            //The problematic line might be here
            .colorScale(d3.scale.quantize().range(that.colors));

根据之前的答案进行了编辑。

【问题讨论】:

    标签: javascript d3.js charts dc.js


    【解决方案1】:

    提供一个工作示例会更容易。也就是说,d3.scale.quantize() 可能会保留未过滤图表中的值域。

    我在 dc.leaflet.js 中看到了与 choropleths 类似的问题。无论您是希望颜色始终保持一致,还是缩放到当前域以获得更多对比度,这实际上都是一种设计选择。

    您可以使用calculateColorDomain 在每次重绘时重新计算域:

    chart.on('preRedraw', function(chart) {
        chart.calculateColorDomain();
    });
    

    这将为图表中的所有值调用颜色访问器,并将色标的域替换为颜色值数组。

    【讨论】:

    • 嘿戈丹,谢谢你的回答。我尝试实现它,但似乎我的问题与我最初描述的略有不同。该代码实际上已经在过滤器上重新创建了图表,因此计算颜色域似乎不是问题。只要范围足够小,无论是否添加此行,单色似乎都会出现。
    • 嗯,我想如果没有运行示例,我很难知道您在说什么。但是d3.scale.quantize() 是一种高级形式的舍入,所以是否所有剩余的值都足够接近以至于它们折叠到相同的值?
    • 绝对可以。谢谢你。抱歉,我没有正确删除工作版本给您。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多