2016-08-09 6 views
0

죄송합니다. 제목이 다소 모호합니다. 날짜가 [d "]이고 시간이 d ["hour "] 인 이벤트의 데이터 세트가 있습니다. 원래 시간은 초 였지만 서버 측은 144 10 분 bin으로 변경되었습니다.Crossfilter는 한 차원을 다른 범위로 선택한 범위로 나눕니다.

문제가 생겼습니다. 나는 날짜 차원과 시간 차원의 두 가지 차원을 만들었습니다. 나는 하루 동안 각기 다른 수 많은 사건을 처리 한 바 카르 트 (barchart)를 가지고있다. 내 이벤트가 수개월에 걸쳐 어떻게 변화 하는지를 볼 수있을뿐 아니라 "평균적인"날의 모습을 볼 수 있습니다.

문제는 시간대 막대 차트는 선택한 기간의 이벤트 수를 단순히 합산 한 것입니다. 나는 정말로 시간 그래프가 선택된 날짜 범위의 평균 일, 즉 날짜 barchart에서 선택된 일수로 나눈 값을 무엇입니까?

아래에 표시된 reduce functionallity를 사용하여이 작업을 시도했지만 실제로 작동하지는 않습니다.

var ndx = crossfilter(sessiondata); 

    var dateDim = ndx.dimension(function(d) { return d["d"]; }); 
    var hourDim = ndx.dimension(function(d){return d["hour"];}); 
    // var uidDim = ndx.dimension(function(d) { return d["uid"];}); 

    var numEventsByDate = dateDim.group(); 

    var numEventsByHour = hourDim.group().reduce(
     function(p,d){ 
      p.timebin++ 
      if(d.d in p.days) p.days[d.d]++; 
      else { 
       p.days[d.d] = 1; 
       p.dayCount++;} 
      p.averagetime = p.timebin/p.dayCount 
      return p; 
     }, 
     function(p,d){ 
      p.timebin-- 
      p.days[d.d]--; 
      if(p.days[d.d] == 0){ 
       delete p.days[d.d]; 
       p.dayCount--;} 
      p.averagetime = p.timebin/p.dayCount 
      return p; 
     }, 
     function() { 
      return{dayCount:0, 
       days:{}, 
       timebin:0, 
       averagetime:0}; 
     }); 

    var all = ndx.groupAll(); 
var minDate = dateDim.bottom(1)[0]["d"]; 
var maxDate = dateDim.top(1)[0]["d"]; 

var timeChart = dc.barChart("#figure1"); 
var hourChart = dc.barChart("#figure3"); 

timeChart 
.width(750) 
.height(250) 
.margins({top: 10, right: 50, bottom: 30, left: 50}) 
.dimension(dateDim) 
.group(numProjectsByDate) 
.transitionDuration(500) 
.x(d3.time.scale().domain([minDate, maxDate])) 
.xUnits(d3.time.days) 
.elasticY(true) 
.xAxisLabel("Months") 
.yAxis().ticks(4); 

hourChart 
.width(730) 
.height(300) 
.margins({top: 10, right: 50, bottom: 30, left: 50}) 
.dimension(hourDim) 
.group(numProjectsByHour) 
.valueAccessor(function (d){return d.value.averagetime}) 
.transitionDuration(500) 
.centerBar(true) 
.gap(65) 
.x(d3.scale.linear().domain([0,24])) 
.xUnits(function(){return 10;}) 
.elasticY(true) 
.xAxisLabel("Hours of the Day") 
.yAxis().ticks(4);  

문제는 각 timebin 일이 상이한 수, 오전 2시에서 오전 2시 10분까지 말하자면 이벤트의 낮은 번호가 시간, 즉 기간으로 분할된다는 점이다. 이 기간에는 며칠간 이벤트가 전혀 발생하지 않을 수 있으므로 0 일이 평균에 기여하지 않습니다. 내가해야할 일은 모든 시간 저장소를 날짜 그래프에서 선택된 날짜 수와 동일한 수로 나누는 것입니다. 이 작업을 수행하는 간단한 방법은 없습니까?

답변

1

그룹에서 평균을 계산하지 않는 것이 좋습니다. 구성 요소를 추적 한 다음 valueAccessor에서 평균을 계산하십시오. 이런 식으로 일을 할 때 timeChart의 실제 필터를 가져 와서 그룹 합계를 나눔으로써 값 접근 자에서 제수를 올바르게 파악할 수도 있습니다.

그래서 이런 식으로 뭔가를 찾고 끝낼 것이다 당신의 hourChart에 valueAccessor이 그냥 numEventsByHour 간단한 카운트 차원을하고 같은 valueAccessor을 조정할 수 있습니다 감안할 때

.valueAccessor(function (d){ 
    var numberOfDays = 100 // Or whatever your unfiltered number of days is. 
    if(timeChart.filters().length === 1) { 
    // There is a filter in place 
    var firstDate = timeChart.filters()[0][0]; // Inclusive 
    var lastDate = timeChart.filters()[0][1]; // Not inclusive! 
    // Calculates the number of days between. Adjust +/-1 depending on your needs 
    var numberOfDays = d3.time.days(firstDate, lastDate).length 
    } 
    return d.value.timebin/numberOfDays; 
}) 

이에 따라 필요합니다.