2015-02-06 3 views
3

모든 기록의 계산 %가 내 문제입니다 json 형식으로되어 있으며 그와 같은 방식으로 만 가져옵니다. graphs.js의 교차 필터를 통과하면이 필드로의 변환을 수행 할 수 있습니까? 예 : 나는 "Pass", "In Progress", "Hold on"또는 "Fail"값을 취할 수있는 상태 속성이 있습니다. 기본적으로 실패율을 나타내는 통계를 원합니다. 따라서 이상적으로 데이터에 대한 계산을해야합니다. 이것에 대해 조언 해주십시오. crossfilter 속성 여기

Sample data (in tabular form for clarity) looks like: 
TrialLocation  | Subject Status 
Site A   | In progress 
Site A   | Pass 
Site B   | In progress 
Site A   | In progress 
Site B   | On Hold 
Site A   | Screen Failure 

이 경우 i가 X 축 및 Y 축에 사이트 이름을 가진 막대 그래프를 받아야 난 실패 비율을 산출하는 메트릭을 얻어야한다. 이 경우 사이트 A에 대해서는 25 %, 사이트 B에 대해서는 0 %가됩니다.

그래서 사이트 당 피사체의 수를 알려주는 차트를 만들었습니다.

var siteName = ndx.dimension(function(d) { return d["TrialLocation"];}); 
var numSubjectsBySite = siteName.group(); 
var siteLevelChart = dc.barChart("#site-level-count", "subjectView"); 

마지막으로 차트

은 :

siteLevelChart 
.width(2000) 
.height(200) 
.transitionDuration(1000) 
.dimension(siteName) 
.group(numSubjectsBySite) 
.ordering(function(d){return d.value;}) 

그래서 내가 생각 나는 SubjectStatus = "화면 실패"와 행의 수를 계산하고 행의 총 수에 의해 그 나누는 것이 경우 어떤

var countScreenFailures = ndx.dimension(function(d){ return d["SubjectStatus"];}); 
countScreenFailures.filter("Off Study"); 

내 막대 그래프는 행 주제 상태 = "ScreenFailure"이 표시 :이 코드를 도입 할 때 다음 "numSubjectsBySite"변수가 될 것입니다.

어떻게 화면 고장률을 계산하여 사용할 수 있습니까? 제발 도와주세요.

정말 고마워요. Anmol

+0

이것은 맵 축소 기능에 적합합니다. –

답변

4

사용자는 각 상태의 개수와 총 개수를 추적하기 위해 그룹화/축소 기능을 사용자 정의해야합니다. 그런 다음 차트로 나누어 비율을 계산할 수 있습니다. 당신이 Reductio를 사용에 관심이 있다면, 당신은 아마 다음과 같은 작업을 수행 할 수

var reducer = reductio().count(true); 

// Do this as many times as you need for different status counts. Each 
// call of reducer.value will add a new property to your groups where 
// you can store the count for that status. 
reducer.value("ScreenFailure").sum(
    function(d) { 
    // This counts records with SubjectStatus = "Screen Failure" 
    return d["SubjectStatus"] === "Screen Failure" ? 1 : 0; 
    }); 

// Build the group with the Reductio reducers. 
var numSubjectsBySite = reducer(siteName.group()); 

// In your dc.js chart, calculate the % using a value accessor. 
siteLevelChart 
.width(2000) 
.height(200) 
.transitionDuration(1000) 
.dimension(siteName) 
.group(numSubjectsBySite) 
.valueAccessor(function(p) { return p.value.ScreenFailure.sum/p.value.count; }) 
.ordering(function(d){return d.value;}) 
+1

안녕하세요 Ethan, 다시 연락해 주셔서 감사합니다. :) 내가 권고 한대로 코드를 실행 해 보았습니다. 첫 번째 줄에서 .count를 .count (true)로 변경하여 수정 한 오류가 발생했습니다. 값 접근에 오류가 발생합니다. 즉 잡히지 않은 TypeError : 정의되지 않은 'sum'속성을 읽을 수 없습니다. 새 크로스 필터 인스턴스를 추가하고 division별로 Subject Status 그룹을 계산해 보았습니다. 내가 물건을 나눌 수 없다는 것이 밝혀졌습니다. 내 목표는 KPI 차트에 화면 오류 비율을 채우는 것이므로 본질적으로 유일한 측정 항목입니다. –

+0

다음은 작성하려는 방사형 차트에 대한 링크입니다. http://www.brightpointinc.com/clients/brightpointinc.com/library/radialProgress/index.html?source=d3js 다음과 같이 채울 필요가 있습니다. 화면 실패율. 생각? –

+0

안녕하세요 Anmol - 예 .count (true) 호출에서 유형에 대해 사과드립니다. 나는 그것을 위에 고칠 것이다. 다른 오류는 valueAccessor 함수에서 실수로 인해 발생합니다. 당신은 그 함수에서 전체 그룹을 얻습니다, 그래서 당신은 p.value를해야합니다 ... 나는 그것을 바꿀 것입니다. –

3

당신은이에 대한 사용자 지정 groupAll를 사용할 수 있습니다. 다음 질문에서 제공 한 jsfiddle에 기반한 직선 크로스 필터 솔루션입니다.

은 (는 작업 할 바이올린과 답변을 훨씬 쉽게!)

var all = ndx.groupAll(); 
var failurePercentGroup = all.reduce(
    function(p, v) { 
     ++p.count; 
     p.failures += (v.Status === 'Screen Failure' ? 1 : 0); 
     p.failPercent = p.count ? p.failures/p.count : 0; 
     return p; 
    }, 
    function(p, v) { 
     --p.count; 
     p.failures -= (v.Status === 'Screen Failure' ? 1 : 0); 
     p.failPercent = p.count ? p.failures/p.count : 0; 
     return p; 
    }, 
    function() { 
     return { 
      count: 0, 
      failures: 0, 
      failPercent: 0 
     }; 
    } 
); 

failurePercent.valueAccessor(function (x) { 
    return x.failPercent; 
}) 
    .group(failurePercentGroup); 

작동해야처럼 에단의 답이 보인다,하지만 당신은 당신이 일을 얻을 수 없다는 것을 다른 곳에서 언급 @. 여기

업데이트 바이올린 : http://jsfiddle.net/gordonwoodhull/vct0dzou/8/

내가 백분율로 서식을 취급하지 않았기 때문에 그냥 비율을 보여 주지만, 당신이 그 부분을 알아낼 수 있어야합니다.

+0

감사합니다. Gordon :) 마지막으로 전체 그림이 의미가 있기 시작합니다. 나에게. 잘 했어. 건배! –