2016-09-02 5 views
1

DC.js 차트는 날짜 별 평균 값을 나타내는 두 줄로 만들고 싶습니다.DC.js 두 개의 lineChart가있는 compositeChart는 둘 다 날짜의 평균값을 나타냅니다.

나는이 작업을 수행 할 수있는 방법은 dc.js를 compositeChart를 사용하고 넣어 두 lineCharts를 만든 다음 평균 금액을 얻기 위해 reducio()group.reduce(add, remove, initial)을 사용하는 것입니다 생각합니다.

제 질문은 어디에 조건부 논리가 있습니까?

var group = dimension.group().reduce(reduceAdd, reduceRemove, reduceInitial); 

d.PPCC === "PPCC"d.PPCC === "Other" 레코드에 대한 또 다른 평균 레코드에 대한 평균을 계산하는 데 어떻게/어디 조건이 사용합니까?

두 가지 방법 중 어느 것도 나를 위해 작동하지 않았습니다.

먼저 시도이다

Uncaught TypeError: reduceInitial is not a function 
:과 같은 오류가 발생

var bounce30DaysPPCC = dateDim.group().reduce(function(d) { if (d.PPCC === "PPCC") 
{ return reduceAdd, reduceRemove, reduceInitial; } else { return 0; }}); 

var bounce30DaysOther = dateDim.group().reduceSum(function(d) { if (d.PPCC === "Other") 
{ return reduceAdd, reduceRemove, reduceInitial; } else { return 0; } }); 

이 오류가 발생

var bounce30DaysPPCC = function(d) { if (d.PPCC === "PPCC") 
{ dateDim.group().reduce(reduceAdd, reduceRemove, reduceInitial); 
} else { dateDim.group().reduce(0); } }; 

var bounce30DaysOther = function(d) { if (d.PPCC === "Other") 
{ dateDim.group().reduce(reduceAdd, reduceRemove, reduceInitial); 
} else { dateDim.group().reduce(0); } }; 

:

dc.js:4017 Uncaught TypeError: layer.group.all is not a function 

이 두 번째 시도는

여기 내 전체 자바 스크립트 코드입니다.

<script type="text/javascript"> 

    // get csv data 
    d3.csv("merged.csv", function(data) { 

    // get csv data and format date 
    var parseDate = d3.time.format("%Y-%m-%d").parse; 

    data.forEach(function(d) { 
     d.date = parseDate(d.date); 
     d.sessions = +d.sessions; 
     d.ad_requests = +d.ad_requests; 
     d.bounceRate = +d.bounceRate; 
     d.clicks = +d.clicks; 
     d.earnings = +d.earnings; 
     d.newUsers = +d.newUsers; 
     d.sessionDuration = +d.sessionDuration; 
     d.sessionsPerUser = +d.sessionsPerUser; 
     d.twitterSessions = +d.twitterSessions; 
     d.users = +d.users; 
    }); 

    // setup crossfilter 
    var ndx = crossfilter(data); 

    // create dimension 
    var dateDim = ndx.dimension(function(d) { return d["date"]; }); 

    // create data groups 
    var bounce30DaysPPCC = function(d) { if (d.PPCC === "PPCC") 
    { dateDim.group().reduce(reduceAdd, reduceRemove, reduceInitial); 
    } else { dateDim.group().reduce(0); } }; 

    var bounce30DaysOther = function(d) { if (d.PPCC === "Other") 
    { dateDim.group().reduce(reduceAdd, reduceRemove, reduceInitial); 
    } else { dateDim.group().reduce(0); } }; 

    // create min and max dates to limit chart x axis values 
    var minDateTime = new Date(new Date().setDate(new Date().getDate()-30)); 

    var maxDateTime = new Date(new Date().setDate(new Date().getDate()+1)); 

    // create chart  
    BounceChart30Day = dc.compositeChart("#bounce-chart-30day"); 

    // create two line charts to put into composite chart 
    var ppccLine = dc.lineChart(BounceChart30Day) 
    .group(bounce30DaysPPCC)  

    var otherLine = dc.lineChart(BounceChart30Day) 
    .group(bounce30DaysOther) 

    // create composite chart 
    BounceChart30Day 
    .height(50) 
    .width(450) 
    .margins({top: 10, right: 10, bottom: 5, left: 35}) 
    .dimension(dateDim) 
    .transitionDuration(500) 
    .brushOn(false) 
    .elasticY(true) 
    .compose([ppccLine, otherLine]) 
    .x(d3.time.scale().domain([minDateTime, maxDateTime])) 
    .yAxis().ticks(3); 

    // create value accessor to calculate averages 
    BounceChart30Day.valueAccessor(function(p) { 
    return p.value.count > 0 ? p.value.total/p.value.count : 0; }); 

    // create add, remove, initial reduce functions 
    function reduceAdd(p, v) { 
     ++p.count; 
     p.total += v.bounceRate; 
     return p; 
    } 

    function reduceRemove(p, v) { 
     --p.count; 
     p.total -= v.bounceRate; 
     return p; 
    } 

    function reduceInitial() { 
     return {count: 0, total: 0}; 
    } 

    // render chart 
    dc.renderAll(); 

</script> 
+0

'if'문 내에서 과제를 수행해야합니다. 'var a = if (b) {1} else {2}'는 'a'가 '정의되지 않음'인 IIRC가됩니다. reductio를 사용하는 경우 필터 옵션을 확인하십시오. https://github.com/crossfilter/reductio#aggregations-standard-aggregations-reductio-b-filter-bi-filterfn-i- –

+0

첫 번째 시도에서 'if' 문에서'group.reduce (add, remove, initial) '를 구체적으로 어떻게 참조 할 지 확신 할 수 없습니다. 죄송합니다.''reducio() '''reductio()''를 사용하지 않았습니다. 잘못된 전화 번호는 – curtisp

+0

입니다. 당신의 문제는 'bounce30DaysOther'에 할당 된 것이 없다는 것입니다. –

답변

2

감소 함수 내에서 데이터를 평가해야합니다.

// create add, remove, initial reduce functions 
function reduceAdd(p, v) { 
    if (v.PPCC === "PPCC") { 
    ++p.PPCCcount; 
    p.PPCCtotal += v.bounceRate; 
    } else if(v.PPCC === "Other") { 
    ++p.Othercount; 
    p.Othertotal += v.bounceRate; 
    } 
    return p; 
} 

function reduceRemove(p, v) { 
    if (v.PPCC === "PPCC") { 
    --p.PPCCcount; 
    p.PPCCtotal -= v.bounceRate; 
    } else if(v.PPCC === "Other") { 
    --p.Othercount; 
    p.Othertotal -= v.bounceRate; 
    } 
    return p; 
} 

function reduceInitial() { 
    return { PPCCcount: 0, PPCCtotal: 0, Othercount: 0, Othertotal: 0}; 
} 

은 그럼 그냥 정상으로 당신의 그룹을 만들 : 다른

var bounce30DaysPPCC = dateDim.group().reduce(reduceAdd, reduceRemove, reduceInitial); 
var bounce30DaysOther = dateDim.group().reduceSum(reduceAdd, reduceRemove, reduceInitial); 

모든 것은 첫눈에 거의 확인을 보이는 그래서 절감 기능은 다음과 같이 보일합니다. 그룹의 새 속성 이름을 가져 오려면 valueAccessor 함수를 업데이트하기 만하면됩니다.

+0

자바 스크립트 질문 :'reduceAdd' 및'reduceRemove' 함수에서'function (d)'을 지정하지 않고'd.PPCC'에 액세스 할 수 있습니까? – curtisp

+0

아니요, 내 파트의 오타를 복사/붙여 넣기합니다. 나는 이것을 'v'로 바꿨다. –

+0

대단히 감사합니다. 나는 console.log (v.date, v.PPCC, v.bounceRate)'before'(v.PPCC === "PPCC") {'를 넣어서 날짜, PPCC, bounceRate 값을 콘솔에 성공적으로 출력한다.하지만'Uncaught TypeError : undefined' 속성을 읽을 수 없습니다 'if (v.PPCC === "PPCC") {'콘솔로'v.PPCC'를 출력 할 수 있다면 왜? 'v.PPCC'가 갑자기'if' 문에서 정의되지 않았습니까? – curtisp