【问题标题】:dc-js linechart disappears upon filtering of other chartsdc-js 折线图在过滤其他图表时消失
【发布时间】:2015-07-24 07:35:37
【问题描述】:

我是 dc.js 的新手,所以我可能错过了一些东西,我有时间序列数据,我试图在 3 个时间维度上显示:按月、按天和按小时 - 基本上是显示机器(制造)跨时间的效率。

所以我制作了月份和小时的条形图,以及日期的折线图。代码如下:

            var cfdata = crossfilter(dataArray);
            var avgadd = function(p,v) {
                p.count++;
                p.sum += v.efficiency;
                p.avg = p.sum/p.count;
                return p;
            },
            avgremove = function(p,v) {
                p.count--;
                p.sum -= v.efficiency;
                p.avg = p.sum/p.count;
                return p;
            },
            avginit = function(){
                return {
                    count: 0,
                    sum: 0,
                    avg: 0
                }
            };
            var parseDate = d3.time.format('%a %b %d %Y %H:%M:%S GMT%Z (UTC)').parse;

            dataArray.forEach(function(d) {
                d.date = parseDate(d.date);
                d.hour = d3.time.hour(d.date).getHours();
                d.day = d3.time.day(d.date);
                d.month = d3.time.month(d.date);
                // d.year = d3.time.year(d.date).getFullYear();
            });

    // dimensions: efficiency by hour
    var hourDim = cfdata.dimension(function(d){return d.hour});
    var hourlyEff = hourDim.group().reduce(avgadd, avgremove, avginit);

    // dimensions: efficiency by day
            var dayDim = cfdata.dimension(function(d){return d.day});
            var minDay = dayDim.bottom(1)[0].date;
            var maxDay = dayDim.top(1)[0].date;
      var dailyEff = dayDim.group().reduce(avgadd, avgremove, avginit);

      // dimensions: efficieny by month and year
      var monthDim = cfdata.dimension(function(d){return d.month});
      var minMonth = monthDim.bottom(1)[0].date;
      var maxMonth = monthDim.top(1)[0].date;
      var monthlyEff = monthDim.group().reduce(avgadd, avgremove, avginit);

      dc.barChart(".month-eff-chart")
            .height(180)
            .width(900)
            .dimension(monthDim)
            .group(monthlyEff)
            .valueAccessor(function(p){return p.value.avg})
            .centerBar(true)
            .x(d3.time.scale().domain([minMonth, maxMonth]))
            .xUnits(d3.time.months)
            .xAxis().ticks(d3.time.month, 1).tickFormat(d3.time.format("%b %y"));

      dc.lineChart(".day-eff-chart")
            .height(180)
            .width(900)
            .dimension(dayDim)
            .group(dailyEff)
            .valueAccessor(function(p){return p.value.avg})
            .elasticX(true)
            .x(d3.time.scale())
            .xUnits(d3.time.days)
            .xAxis().ticks(d3.time.week, 1).tickFormat(d3.time.format("%W/%y"));

      dc.barChart(".hour-eff-chart")
            .height(180)
            .width(900)
            .dimension(hourDim)
            .group(hourlyEff)
            .valueAccessor(function(p){return p.value.avg})
            .x(d3.scale.linear().domain([0,23]));

      dc.renderAll();

因此,当我打开页面并过滤任何条形图时,另一个条形图将过滤得很好,但折线图将变为空 - 线条将完全消失。当我将折线图更改为条形图时,它可以工作 - 过滤器就好了。

我一定是错过了什么。

此外,也欢迎提出如何以更有意义的方式显示时间序列数据的建议。谢谢!

编辑:JsFiddle:http://jsfiddle.net/shuzf2vm/2/

【问题讨论】:

  • 听起来您的维度之一不是自然有序的。检查以确保您的维度访问器始终为数组中的每个数据元素返回相同类型的值。
  • 这不会使它在条形图格式中也失败吗?我之前尝试过测试,但似乎不是问题所在。将再次测试。
  • 条形图和折线图共享它们的大部分代码,所以如果它们的行为不同,我真的很惊讶。如果您发布小提琴,我相信我可以很快找到它。 Putting data in a jsFiddle.
  • @asyraf9 可能不是因为分组和过滤器不同。但正如 Gordon 所说,解决这个问题的方法是组合一个工作演示。那么应该很容易找出问题所在。
  • jsFiddle 来了。几分钟后更新

标签: javascript d3.js dc.js crossfilter


【解决方案1】:

这不起作用的原因是,当计数为零时,您的平均值会产生 NaN。您需要像这样保护您的部门:

    var avgadd = function(p,v) {
        p.count++;
        p.sum += v.efficiency;
        p.avg = p.count ? p.sum/p.count : 0;
        return p;
    },
    avgremove = function(p,v) {
      p.count--;
      p.sum -= v.efficiency;
      p.avg = p.count ? p.sum/p.count : 0;
      return p;
    },

工作分叉:http://jsfiddle.net/gordonwoodhull/hsqa43uk/3/

条形图与折线图表现不同的原因很有趣。两者都保护绘图函数的输出并检测 NaN。但是条形图单独保护每个条形图,而折线图输出一条多段线,如果有任何一点不好,则将整条线抛出。

(如果有人想提交 PR,在此处使用 d3.svg.line.defined 可能会更有帮助。)

【讨论】:

  • 谢谢!所做的更改,完美运行。抱歉,我现在知道要在我的 reduce 方法中寻找 NAN 结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多