【问题标题】:Suppress extreme outliers from d3plus box and whiskers plot drawing抑制 d3plus 盒和晶须绘图中的极端异常值
【发布时间】:2018-04-24 00:22:20
【问题描述】:

我正在尝试在 d3plus 上创建带有胡须的箱线图,以比较我的数据库中“此”提供者和“所有”提供者之间的指标。我已经在预处理阶段从非常大的数组中计算了 5 个统计数据摘要,并将这些数据传递给 data 变量。如果您运行附加的 sn-p(从 d3plus website example 修改),您可以看到代码和绘图的样子。然而,实际上,“全部”类别中有一些极端异常值,在我的代码中作为注释行给出:“max”(对于“All”)为 663373.22,“min”为 -18427.39(同样,对于“All”) ")。

我看到有一个mute method 可以用于.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>

【问题讨论】:

    标签: javascript d3.js boxplot outliers d3plus


    【解决方案1】:

    根据我对文档的理解,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>

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多