【问题标题】:dc.js chart groups not updating with correct values on charts after click on a parent chart单击父图表后,dc.js 图表组未更新图表上的正确值
【发布时间】:2014-11-05 00:25:30
【问题描述】:

我的问题是我有一个用于计算节省的交叉过滤器组减少功能,但是当在图表上应用过滤器时,它似乎没有通过正确的过滤器。我也有一个类似的案例工作示例。

我创建了两个 jsbin,其中一个具有正确的行为。

在这种情况下,我有两年的数据,即 2010 年和 2014 年。但在 Savings(not working) 图表中,运营商饼图没有按年份过滤,而在 DIFOT(working) 图表中是这样。

链接是: DIFOT(工作):http://jsbin.com/bagohavehu/2/edit 节省(未按预期工作):http://jsbin.com/yudametulo/2/edit

非常感谢您的时间和精力。

问候, 动漫

【问题讨论】:

  • 我不明白。他们似乎都为我过滤。 JS Bin 吐槽了一些分号,这里是 DIFOT jsbin.com/reyecutaqi/1/edit 和 Savings jsbin.com/nodibaraji/1/edit
  • 您好 Gordon 感谢您的快速回复,我特别面临的问题是关于过滤正确的值。对于这两个图表集,我使用相同的数据,因此我只有一个 2010 年和承运人 1117 的记录。但在储蓄的情况下,当在年度饼图中选择 2010 年时,会显示所有承运人的记录。而 DIFOT 载波图表获取正确的年份过滤器,从而显示该特定年份的数据。谢谢。
  • 在进一步的调查中,我发现如果我将 current 和 comparePrice 解析为 int 而不是 floats(我现在正在这样做),那么按年过滤的储蓄图表会出现预期的行为。希望这可以帮助。谢谢
  • 我不确定你在计算什么,但由于你的 reduce 函数没有考虑到 count,这就是为什么它会忽略它们是否被过滤。例如,这是您示例的一个分支(作为 jsfiddle:更易于调试),计数乘以结果 - 不确定这对您的计算是否有意义,但它更好地反映了过滤器:jsfiddle.net/gordonwoodhull/9f6kzeus/11
  • 非常感谢戈登。我使用 count 仅用于调试目的,我将在 reduce 函数中发布一个没有 count 的 bin。垃圾箱的链接是jsbin.com/tehulisipu/2/edit。如果您在 reduce 函数中将 parseFloat 更改为 parseInt,您将使过滤正常工作。希望这些信息有意义。谢谢。

标签: javascript dc.js crossfilter


【解决方案1】:

要跟踪这些计算问题,您确实需要使用调试器并在归约函数或绘图函数中放置断点,以查看最终得到的归约值。

我发现在 jsbin 中使用浏览器的调试器非常困难(不可能?),所以我再次将您的代码粘贴到两个 jsfiddles 中:

parseFloat 版本:http://jsfiddle.net/gordonwoodhull/aqhLv0qc/

parseInt 版本:http://jsfiddle.net/gordonwoodhull/9bnejpLx/1/

现在,我们在 chart.redraw (dc.js:1139) 中设置一个断点,以查看它在单击切片时尝试绘制的值。

第一次命中断点并不有趣,因为它只是我们点击的年度图表,但第二次命中的是运营商图表,它揭示了很多。为 parseInt 版本打印 _chart.group().all()

现在,对于 parseFloat 版本:

由于计算结果与 int 版本完全一致,因此您最终会得到 1 - 0/0 === NaN,并且在某处 dc.js 或 d3.js 默默地将 NaN 强制为零。

但由于浮点计算永远不会精确,因此您最终会得到1 - 0/-3e-15 === 1

您希望避免除以零或任何接近零的值,因此在您的归约函数中添加检查会产生(我认为)所需的结果:

var group = Dim.group().reduce(
    function(p,v){
        p.current += parseFloat(v.currentPrice);
        p.compare += parseFloat(v.comparePrice);
        if(Math.abs(p.compare) > 0.01) {
            p.savings  = p.current/p.compare;
            p.result   = 1-p.savings;
        }
        else p.result = 0;
        return p;
    },
    function(p,v){
        p.current -= parseFloat(v.currentPrice);
        p.compare -= parseFloat(v.comparePrice);
        if(Math.abs(p.compare) > 0.01) {
            p.savings  = p.current/p.compare;
            p.result   = 1-p.savings;
        }
        else p.result = 0;
        return p;
    },
    function(){return { current: 0, compare: 0,savings:0, result:0};}
);

工作版(我认为):http://jsfiddle.net/gordonwoodhull/y2sf7y18/1/

【讨论】:

  • 非常感谢 Gordon 的解释。认为这解决了我的问题,我将不得不测试整个应用程序以检查修复,因为我一直在使用 dc 开发仪表板。如果我有更多问题,将再次发布。再次非常感谢。干杯:)
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2015-10-18
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多