d3.js:5942错误:<g>属性transform =“translate(NaN,0)”</g>的值无效

时间:2015-04-10 22:38:18

标签: javascript d3.js dc.js

使用d3.js v3.55,crossfilter.js v1.311和dc.js v1.73并尝试构建一个reduce函数,该函数返回平均值而不是总和或计数。内置工作正常的reduceSum,但是当我尝试添加我自己的reduce函数时,基于互联网上的许多示例。我收到了这些消息:    d3.js:5942错误:属性转换的值无效=&#34;翻译(NaN,0)&#34;    d3.js:8718错误:属性宽度的值无效=&#34; NaN&#34;

以下是尽可能减少代码而不删除任何重要信息:

<script type="text/javascript">
//
// Create the Chart Objects
//
var GeoZoneChart               = dc.rowChart("#chart-geo-zone");
var pdcData = [
{GeoZone: 'New York Metro', PDCLast365: 0.43}, 
{GeoZone: 'New York Metro', PDCLast365: 0.427}, 
{GeoZone: 'New York Metro', PDCLast365: 0.418}, 
{GeoZone: 'Los Angeles Metro', PDCLast365: 0.4085}, 
{GeoZone: 'Los Angeles Metro', PDCLast365: 0.40565}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.46789457}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.46366023}, 
{GeoZone: 'Chicago Metro', PDCLast365: 0.447781455}
];
//
// normalize/parse data
//   in this case, turn the decimel into a percentage
pdcData.forEach(function(d) {
    d.PDCLast365 = d.PDCLast365 * 100;
    d.PDCLast365 = d.PDCLast365.toFixed(2);
});

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function reduceAddAvg(attr) {
  return function(p,v) {
    if (isNumeric(v[attr]) ){
        ++p.count;
        p.sum += v[attr];
        p.avg = p.sum/p.count;
    }
    return p;
  };
}
function reduceRemoveAvg(attr) {
  return function(p,v) {
    if (isNumeric(v[attr]) ){
        --p.count;
        p.sum -= v[attr];
        p.avg = p.sum/p.count;
    }
    return p;
  };
}
function reduceInitAvg() {
  return {count:0, sum:0, avg:0};
}

//
// set crossfilter
//
var ndx = crossfilter(pdcData),
    GeoZoneDim           = ndx.dimension(function(d) {return d.GeoZone;}),
    PDCLast365PerGeoZone = 
          GeoZoneDim.group().reduce(
            reduceAddAvg('PDCLast365'), 
            reduceRemoveAvg('PDCLast365'), 
            reduceInitAvg);


GeoZoneChart
    .width(400).height(200)
    .dimension(GeoZoneDim)
    .group(PDCLast365PerGeoZone)
    .elasticX(true);

dc.renderAll();
</script>

2 个答案:

答案 0 :(得分:1)

p.count降至零时,您需要一名警卫。所以:

function reduceRemoveAvg(attr) {
  return function(p,v) {
    if (isNumeric(v[attr]) ){
        --p.count;
        p.sum -= v[attr];
        p.avg = p.count ? p.sum/p.count : 0;
    }
    return p;
  };
}

如果您可以在SO或dc.js网站或用户组上指出任何此类不良示例,请致谢。

编辑:我不确定它会产生什么影响,但toFixed()实际上会返回一个字符串,而不是一个数字。并且您的isNumeric测试值是否可以转换为数字,而不是是否为数字。所以你可能最终会添加字符串连接而不是添加。

就像我在下面所说,正确的方法是通过在reduce函数中放置断点并查看实际计算的内容来确定这一点。

答案 1 :(得分:0)

当范围不是数组时,我通常会得到错误。

检查.range收到的变量是否是实际数组