2014-08-28 3 views
3

У меня есть следующая структура данных и вы хотите отобразить строкуChart с минимальным значением «сумма» (группы) по дням (даты) (размерность).dc.js - минимальное значение из группы в день

var data = [ 
{date: "2014-01-01", amount: 10}, 
{date: "2014-01-01", amount: 1}, 
{date: "2014-01-15", amount: 0}, 
{date: "2014-01-15", amount: 10 }, 
{date: "2014-02-20", amount: 100 }, 
{date: "2014-02-20", amount: 10 }, 
]; 

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

var dateDim = facts.dimension(function (d) {return d3.time.day(d.date);}); 
var dateDimGroup = dateDim.group().reduceSum(function (d) { return d.amount; }) 

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

Спасибо!

ответ

4

Вам понадобится сохранить пользовательскую группировку. Основная идея заключается в том, что вы поддерживаете массив (упорядоченный лучше) всех значений в группе. В вашей функции добавления вы получаете текущее значение массива и присваиваете первое значение свойству «мин» группы. В вашей функции удаления вы удаляете значения, вы удаляете текущее значение из массива, а затем присваиваете первое значение свойству «min» (и проверяете, пуст ли пуст, и в этом случае он задан как неопределенный или что-то вдоль этих строк) ,

Вы функция будет выглядеть примерно так:

function add(accessor) { 
    var i; 
    var bisect = crossfilter.bisect.by(function(d) { return d; }).left; 
    return function (p, v) { 
     // Not sure if this is more efficient than sorting. 
     i = bisect(p.valueList, accessor(v), 0, p.valueList.length); 
     p.valueList.splice(i, 0, accessor(v)); 
     p.min = p.valueList[0]; 
     return p; 
    }; 
}; 
function remove(accessor) { 
    var i; 
    var bisect = crossfilter.bisect.by(function(d) { return d; }).left; 
    return function (p, v) { 
     i = bisect(p.valueList, accessor(v), 0, p.valueList.length); 
     // Value already exists or something has gone terribly wrong. 
     p.valueList.splice(i, 1); 
     p.min = p.valueList[0]; 
     return p; 
    }; 
}; 
function initial() { 
    return function() { 
     return { 
      valueList: [], 
      min: undefined 
     }; 
    }; 
} 

«аксессором» является функцией, чтобы получить на значение, которое вы хотите минимум, как в reduceSum. Вызовите каждую из этих функций, чтобы вернуть функцию, которую вы используете в соответствующем месте в .group (добавить, удалить, начальную) функцию.

Этот код довольно много разорвал прямо из reductio, так что вы можете также использовать Reductio и сделать:

var dateDim = facts.dimension(function (d) {return d3.time.day(d.date);}); var dateDimGroup = reductio().min(function (d) { return d.amount; })(dateDim.group());

Ваш dateDimGroup будет иметь свойство «МИН», который должен дать вам минимальную сумму для каждой даты.

+0

Это кажется идеальным. Однако я пробовал это, используя reductio и код выше, и диаграмма не заполняется и не имеет оси y? – NorthSide

+0

Если вам нужна помощь, вам нужно будет указать свой код диаграммы. Я предполагаю, что если вы используете dc.js, вам нужно добавить .valueAccessor (function (d) {return d.min;}) на ваш график, чтобы он знал, где искать значение. –

+0

Привет, у меня есть еще один, но я все еще не могу правильно отобразить диаграмму, я уверен, что делаю что-то глупое. Вот jsfiddle, показывающий, что происходит http://jsfiddle.net/northside45/u59ry898/ – NorthSide

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

  • Нет связанных вопросов^_^