【问题标题】:dc.js barChart bars overlappingdc.js barChart 条形重叠
【发布时间】:2014-03-17 07:25:40
【问题描述】:

这是我的日期时间条形图。当我使用小提琴(参见here)尝试复制问题时,它按预期工作。 注意:从 github 加载数据需要一段时间(约 30 秒)。

这是图表的代码:

    pnlPerDaybarChart
    .height(300)
    .width(700)
    .dimension(dims.date)
    .group(groups.date.pnlSum)
    .valueAccessor(function(d) {
        return Math.abs(d.value);
    })
    .renderTitle(false)
    .x(d3.time.scale().domain([minDate,maxDate]))
    .xUnits(d3.time.days)
    .colors(colorChoice)
    .colorAccessor(function(d) {
            if (+d.value>0) {
                return("positive");
            } else {
                return("negative");
            }
        })
    .brushOn(true)
    .elasticY(true)
    .margins({left: 70 ,top: 10, bottom: 30, right: 50})
    .centerBar(true);

我在这里遗漏了一些明显的东西吗?如果没有,我应该从哪里开始调试?我花了相当多的时间在这个上,我找不到任何问题。

编辑:当我删除.xUnits 指令时,我会得到非常细的条形,但沿轴放置得很好。这使我认为条形宽度的计算有问题。我不知道如何调试该特定计算。如果有人知道,我很乐意深入研究。

EDIT2:svg 内的<g class="chart-body"><g class="stack _0"><rect class="bar"></rect></g></g> 元素的width 属性都设置为错误值。如果有人能指出这是在 d3 库中计算的位置,我也许可以从那里拿走。

EDIT3:我找到了问题的根源。条的宽度不正确,因为当 calculateBarWidth() 运行一次以实例化图形时,即使调用 dc.redrawAll() 它也不再运行。在我的情况下,我连续将记录块添加到我的交叉过滤器并重新绘制图表。新问题是“如何强制 calculateBarWidth() 重新运行?”

【问题讨论】:

  • 你的非工作版本和工作的 jsfiddle 有什么区别?
  • 没有差异。这就是让我发疯的原因。我什至通过重新下载确保来源相同。
  • 您能否指出我在哪里计算了 <g class="chart-body"><g class="stack _0"><rect class="bar"></rect></g></g>width 属性,以便我可以看到它在 d3 中哪里出错了?
  • 可能是缺少一些 CSS?
  • @LarsKotthoff 感谢您的提示,但 css 也是如此:我直接指向 dc.js 网站上使用的那个...

标签: javascript d3.js visualization data-visualization dc.js


【解决方案1】:
.on("preRedraw", function (chart) {
        chart.rescale();
    });
    chart.on("preRender", function (chart) {
        chart.rescale();
    });

答案来自here

【讨论】:

    【解决方案2】:

    我认为您正在寻找 barChart.calculateBarWidth。 (src/bar-chart.js 如果你正在考虑提交 PR ;)

    最近报告了其他与顺序条形图有关的错误:

    https://github.com/dc-js/dc.js/issues/533

    我不知道日期是否也存在错误。对我来说,相同的代码可以在小提琴中运行但在您的页面中不起作用,这似乎很奇怪......这非常罕见。

    【讨论】:

    • 我想我找到了问题的根源。所以条的宽度是不正确的,因为当calculateBarWidth() 运行一次以实例化图形时,即使调用dc.redrawAll() 它也不再运行。在我的情况下,我连续将记录块添加到我的交叉过滤器并重绘图表。如何强制calculateBarWidth() 重新运行?
    • 我认为这可能是一个错误。会用 renderAll 重新计算吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多