2017-11-10 7 views
1

"この"プロバイダとデータベースの "すべて"プロバイダ間のメトリックを比較するために、d3plusでウィスカを使用してボックスプロットを作成しようとしています。私はすでに処理前の段階で非常に大きな配列から5統計の要約を計算しており、これらを変数dataに渡しています。添付されたスニペット(d3plus website exampleから変更)を実行すると、コードとプロットがどのように見えるかを確認できます。しかし、実際には、「すべて」のカテゴリに極端な異常値があり、コードにコメント行として与えられます。「最大」(「すべて」)と-18427.39の「分」(また、「すべて」 ")。d3plusボックスとウィスカプロット図から極端なアウトライアを抑制する

mutemethod私は.yに使用できますが、どのように機能するのかわかりません。

極端な外れ値の描画を許可する場合は、両方のボックスプロットを平らな線に崩壊させる非常に簡単な方法がありますか、 IQRのいくつかの倍数?私は、ドキュメントを理解するものと

<script src="//d3plus.org/js/d3.js"></script> 
 
<script src="//d3plus.org/js/d3plus.js"></script> 
 

 
<div id="viz"></div> 
 

 
<script> 
 
    var data = [ 
 
    {"provider": "This", "name":"min", "value": -1055.79}, 
 
    {"provider": "This", "name":"q1", "value": -172.819}, 
 
    {"provider": "This", "name":"med", "value": -46.795}, 
 
    {"provider": "This", "name":"q3", "value": 8.378}, 
 
    {"provider": "This", "name":"max", "value": 1033.15}, 
 
    {"provider": "All", "name":"min", "value": -1000}, 
 
    {"provider": "All", "name":"q1", "value": -111.60999999999999}, 
 
    {"provider": "All", "name":"med", "value": -13.92}, 
 
    {"provider": "All", "name":"q3", "value": 124.22}, 
 
    {"provider": "All", "name":"max", "value": 1000} 
 
    ] 
 
    //663373.22, -18427.39 
 
    var visualization = d3plus.viz() 
 
    .container("#viz") 
 
    .data(data) 
 
    .type("box") 
 
    .id("name") 
 
    .x("provider") 
 
    .y("value") 
 
    .ui([{ 
 
     "label": "Visualization Type", 
 
     "method": "type", 
 
     "value": ["scatter","box"] 
 
     }]) 
 
    .draw() 
 
</script>

答えて

2

muteは、値が文字列、関数、または配列とすることができるオブジェクトのキーとして使用されます。したがって、名前がq1のすべてのデータポイントをミュートしたい場合は、.y({value:'value',mute:'q1'})を実行します。

解決策として、アウトライヤーを決定する関数が必要です。許容値の範囲(IQR *倍数)を返す関数を見つけて編集した場合は、multiple変数を必要に応じて変更できます。次に、単純な関数isOutlierを使用して、渡された値が範囲外かどうかを確認します。

<script src="//d3plus.org/js/d3.js"></script> 
 
<script src="//d3plus.org/js/d3plus.js"></script> 
 

 
<div id="viz"></div> 
 

 
<script> 
 
    var data = [ 
 
    {"provider": "This", "name":"min", "value": -1055.79}, 
 
    {"provider": "This", "name":"q1", "value": -172.819}, 
 
    {"provider": "This", "name":"med", "value": -46.795}, 
 
    {"provider": "This", "name":"q3", "value": 8.378}, 
 
    {"provider": "This", "name":"max", "value": 1033.15}, 
 
    {"provider": "All", "name":"min", "value": -1000}, 
 
    {"provider": "All", "name":"q1", "value": -111.60999999999999}, 
 
    {"provider": "All", "name":"med", "value": -13.92}, 
 
    {"provider": "All", "name":"q3", "value": 124.22}, 
 
    {"provider": "All", "name":"max", "value": 1000} 
 
    ] 
 
    
 
    var outlierRange = outlierRange(data.map(d=>d.value)) 
 
    var isOutlier = val => (val < outlierRange[0] || val > outlierRange[1]) 
 

 
    //663373.22, -18427.39 
 
    var visualization = d3plus.viz() 
 
    .container("#viz") 
 
    .data(data) 
 
    .type("box") 
 
    .id("name") 
 
    .x("provider") 
 
    .y({value:'value', mute: isOutlier }) 
 
    .ui([{ 
 
     "label": "Visualization Type", 
 
     "method": "type", 
 
     "value": ["scatter","box"] 
 
     }]) 
 
    .draw() 
 
    
 
function outlierRange(someArray) { 
 

 
    if(someArray.length < 4) 
 
return someArray; 
 

 
    let values, q1, q3, iqr, maxValue, minValue, multiple = 0.5; 
 

 
    values = someArray.slice().sort((a, b) => a - b);//copy array fast and sort 
 

 
    if((values.length/4) % 1 === 0){//find quartiles 
 
q1 = 1/2 * (values[(values.length/4)] + values[(values.length/4) + 1]); 
 
q3 = 1/2 * (values[(values.length * (3/4))] + values[(values.length * (3/4)) + 1]); 
 
    } else { 
 
q1 = values[Math.floor(values.length/4 + 1)]; 
 
q3 = values[Math.ceil(values.length * (3/4) + 1)]; 
 
    } 
 

 
    iqr = q3 - q1; 
 
    maxValue = q3 + iqr * multiple; 
 
    minValue = q1 - iqr * multiple; 
 

 
    return [minValue, maxValue] 
 
} 
 

 

 

 

 
</script>

関連する問題