Использование d3.js v3.55, crossfilter.js v1.311 и dc.js v1.73 и попытка создания функция уменьшения, которая возвращает среднее значение, а не сумму или счет. УменьшениеSum, который встроен, работает отлично, но когда я пытаюсь добавить свою собственную функцию сокращения, основанную на многих примерах в Интернете. Я получаю сообщения: d3.js: 5942 Ошибка: Недопустимое значение для атрибута преобразования = "перевести (NaN, 0)" d3.js: 8718 Ошибка: Недопустимое значение ширины атрибута = "NaN"d3.js: 5942 Ошибка: недопустимое значение для <g> атрибут transform = "translate (NaN, 0)"
Здесь код уменьшается настолько, насколько я могу без устранения какой-либо важной информации:
<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>
Привет Гордон, спасибо за ответ. Я проверил это на Add, но забыл проверить его на Remove. В исходном примере также не было числовой проверки. Однако у меня все еще есть такое же сообщение об ошибке. –
Неплохо отлаживать этот материал вслепую. Такой же совет, как всегда: 1. Установите точку останова перед тем, как нарисовать диаграмму, и посмотрите, есть ли у PDCLast365PerGeoZone.all() 'NaNs. 2. Если это так, поместите контрольные точки в конце каждой функции сокращения и посмотрите, почему производятся NaN. Или создайте скрипку, и я или один из других полезных людей здесь сделают именно это. – Gordon
Добавлена еще одна подсказка выше. – Gordon