Head / Tail Breaks in JavaScript

A JavaScript implementation of Heat / Tail Breaks for use on skewed datasets. Used in http://histagram.me. Requires Underscore.js More info: https://sites.google.com/site/thepowerofcartography/head-tail-breaks

by Michael Keller

JavaScript

var data = [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 12, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 6, 7, 6, 5, 6, 7, 8, 8, 9, 8, 7, 6, 7, 8, 9, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 2, 2, 2, 1, 1, 1];

var stats = {
    mean: function(arr){
      var len = arr.length,
          sum = _.reduce(arr, function(memo, num){ return memo + num; }, 0),
          mean = sum / len
      return mean;
    },
    headTail: function(arr){
       var data_min = _.min(arr),
           mean = this.mean(arr),
	       bins = [data_min];

	    while (arr.length > 1) {
	       arr = _.filter(arr, function (d) { return d > mean });
	       mean = this.mean(arr);
	       bins.push(mean);
	    };
	    return bins;
    }
};

var thresholds = stats.headTail(data);

console.log(thresholds);