2014-08-28 2 views
3

다음 데이터 구조를 가지고 있으며 날짜 (날짜) (차원)에 'amount'(그룹)의 최소 값을 가진 lineChart를 표시하려고합니다. 나는 일반적으로 다음과 같은 라인을 따라 뭔가를하고있을 것입니다, 나는이 그룹에있는 분을 발견하는 방법을 잘 모르겠어요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

사용자 지정 그룹화를 유지해야합니다. 기본 개념은 그룹의 모든 값을 배열로 유지하는 것이 가장 좋습니다. add 함수에서 현재 값을 배열에 할당하고 첫 번째 값을 그룹의 'min'속성에 할당합니다. remove 함수에서 값을 제거하면 배열에서 현재 값을 제거한 다음 첫 번째 값을 '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 (add, remove, initial) 함수의 해당 위치에서 사용하는 함수를 반환하십시오.

이 코드는 거의 직선 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