2016-04-25 4 views
1

Я работаю на приборной панели, чтобы помочь компаниям проанализировать их стоимость во многих измерениях.Комплекс Tallies/Aggregation dc.js

Я его основном работает вверх на: https://jsfiddle.net/gkke38wk/4/

Есть несколько вещей, которые я не могу показаться, чтобы получить работу.

SHOW COUNT УНИКАЛЬНЫХ ПО Подрядчиком:

Я был в состоянии показать это точно на Data-таблице, как вы можете видеть на скрипке, но по какой-то причине я ничего примерить rowChart будет показать все, кроме общих строк PO, а не уникальных PO (это сплющенные данные, и каждая позиция является строкой в ​​datatable, поэтому одно PO может иметь много строк. ДЛЯ ПРИМЕР, Билл только представил один PO, но он имеет две строки. На диаграмме показано (2) для Билла).

contractorChart 
     .dimension(contractors) 
     .group(contractorGroup) 

    contractorChart 
     .dimension(uniqueDim) 
     .group(contractorGroup) 

ШОУ ОБЩАЯ СУММА ПО

На таблице данных, которая в основном работает, я хочу общий столбец, чтобы показать агрегированную сумму всех строк для этого ПО, а не только первый матч. В моей функции uniqueDim она работает только путем объединения уникальных номеров PO, а не всего объекта PO. Я не уверен, как объединить итог.

ответ

2

В rowCharts отображаемые ключи и значения определяются только группой. Измерение используется только для фильтрации, поэтому отключение измерения не должно приводить к изменению отображаемых значений. Вам нужно, чтобы ваша группа отслеживала уникальные PO, а не измерение. Это немного трудно сделать правильно и эффективно, но я бы рекомендовал использовать Reductio exception aggregation, в этом случае это просто вопрос определения редуктора Reductio и значение аксессор на диаграмме:

reductio() 
    .exception(function(d) { return d.po; }) 
    .exceptionCount(true)(contractorGroup)  

    contractorChart 
     .width(800) 
     .height(200) 
     .margins({ top: 20, left: 10, right: 10, bottom: 20 }) 
     .dimension(contractors) 
     .group(contractorGroup) 
     .ordinalColors(['#3182bd', '#6baed6', '#9ecae1', '#c6dbef', '#dadaeb']) 
     .valueAccessor(function(d) { return d.value.exceptionCount; }) 
     .label(function (d) { 
      return d.key; 
     }) 
     .title(function (d) { 
      return d.value; 
     }) 
     .elasticX(true) 
     .xAxis().ticks(4); 

Насколько таблица данных, у вас есть правильная идея создания «фальшивого измерения», как предложено в FAQ dc.js, но вы действительно хотите, чтобы поддельное измерение имело агрегированное значение. Так основывают его на группу вместо:

var uniqueDim = { 
    bottom: function (num) { 
     var pos = poDimension.top(Infinity); 
     // Uses top because the version of Crossfilter being used 
     // doesn't support group.bottom. 
     return poGroup.top(num) 
     .filter(function(d) { return d.value > 0; }) 
     .map(function(d) { 
      var currPo = pos.filter(function(g) { return g.po === d.key; })[0]; 
      return { 
      po: d.key, 
      total: d.value, 
      contractor: currPo.contractor, 
      complexity: currPo.complexity 
      }; 
     }); 
    } 
    }; 

Рабочий пример как: https://jsfiddle.net/33228p1d/2/

+0

Примечание - разбивается фильтрация на поддельный размер. Глядя на это сейчас :-) –

+0

Проблема заключалась в том, что group.top возвращает группы с 0-значениями, для которых не существует соответствующих записей в poDimension. Необходимо фильтровать группы для тех, у кого есть положительные значения для использования в поддельном измерении. –

+0

Отлично работает! Почему мы используем «exceptionCount» для замены значения? – Wesley

-2

Попробуйте следующий код:

contractorChart 
    .width(800) 
    .height(200) 
    .margins({ top: 20, left: 10, right: 10, bottom: 20 }) 
    .dimension(contractors) 
    .group(contractorGroup) 
    .ordinalColors(['#3182bd', '#6baed6', '#9ecae1', '#c6dbef', '#dadaeb']) 
    .label(function (d) { 
     return d.key; 
    }) 
    .title(function (d) { 
     return d.value; 
    }) 
    .elasticX(true) 
    .xAxis().ticks(4); 

незначительным дополнением, такие как:

contractorChart 
    .width(800) 
    .height(200) 
    .margins({ top: 20, left: 10, right: 10, bottom: 20 }) 
    .dimension(contractors) 
    .group(contractorGroup) 
    .ordinalColors(['#3182bd', '#6baed6', '#9ecae1', '#c6dbef', '#dadaeb']) 
    .label(function (d) { 
     return d.key; 
    }) 
    .title(function (d) { 
     return d.value.exceptionCount; 
    }) 
    .elasticX(true) 
    .xAxis().ticks(4); 
+0

Было бы неплохо, если бы вы могли добавить дополнительные пояснения к вашему коду. Как это решить проблему? – Timm