2015-11-20 7 views
1

У меня есть данные с одним столбцом, который представляет собой список меток для каждой точки данных. Я хотел бы использовать dc.js для создания диаграммы строк, в которой указано количество вхождений каждой метки.Как создать диаграмму строк для многозначных данных в dc.js

данных выглядит следующим образом:

Дата, Этикетки
1/1/2015, "A, B, C"
1/2/2015, "B"
1/3/2015, "с, а"
1/4/2015, "а"

Я хотел бы диаграмму строки, объединяющую их следующим образом:
а: 3
Б: 2
C: 2

Мой код до сих пор:

var labels = ["A", "B", "C"]; 
var labelBar = dc.rowChart("#label-bar"); 
d3.csv('data.csv', function (csv) { 
    var data = crossfilter(csv); 
    var labelDim = data.dimension(function(d){return d["Labels"];}); 
    var labelGroup = labelDim.group().reduce(
     function(p,v) { //add 
      for (i = 0; i < labels.length; i++) { 
       if(v["Labels"].indexOf(labels[i]) > -1) 
        p[labels[i]]++; 
      } 
      return p; 
     }, 
     function(p,v) { //subtract 
      for (i = 0; i < labels.length; i++) { 
       if(v["Labels"].indexOf(labels[i]) > -1) 
        p[labels[i]]--; 
      } 
      return p; 
     }, 
     function(p,v) { //initial 
      p = {}; 
      for (i = 0; i < labels.length; i++) { 
       p[labels[i]] = 0; 
      } 
      return p; 
     }); 
    labelBar 
     .dimension(labelDim) 
     .group(labelGroup) 
     .elasticX(true); 
}); 

код только создает строку диаграммы с одной строке для каждой точки данных, а не для каждой метки. Любая помощь будет оценена по достоинству.

ответ

2

Для этого вам необходимо использовать размер.groupAll и управлять группировками самостоятельно. Если вы соберете рабочий пример с вашим измерением, я могу показать вам, как это сделать.

Однако, вы посмотрели на Reductio, что делает это довольно легко? https://github.com/esjewett/reductio#groupall-aggregations

С вашими данными вы могли бы сделать что-то вроде

var dim = data.dimension(function(d) { return d.Labels.split(','); }); 
groupAll = dim.groupAll(); 

reducer = reductio() 
    .groupAll(function(record) { 
    return record.Labels.split(','); 
    }) 
    .count(true); 

reducer(groupAll); 
groupAll.all(); // Should give you groups with keys "A", "B", "C" 

Рабочий пример: https://jsfiddle.net/z4k78odx/4/

+0

Большое спасибо за ваш ответ, Этан! Однако, когда я использую этот код, я получаю сообщение об ошибке в строке 811 dc.js.
ТипError: undefined не является функцией (оценка '_chart.group(). All()') – Eric

+0

Я не могу интерпретировать эту ошибку. Не могли бы вы привести рабочий пример? –

+0

Не беспокойтесь об этой ошибке. Я думаю, что этот подход будет работать, но сначала мне нужно предварительно обработать мои данные. – Eric

Смежные вопросы