Skeeball Analysis

by lamarant

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/0.8.9/jquery.csv.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/heatmap.js"></script>
<textarea>
TimeStamp,Sample,X,Y,,,Area
2/7/2018 9:25,1,20,23,18,,16.50
2/7/2018 9:25,2,20,22,17,,
2/7/2018 9:25,3,18,22,17,,
2/7/2018 9:25,4,20,23,18,,
2/7/2018 9:25,5,17,23,18,,
2/7/2018 9:25,6,21,22,17,,
2/7/2018 9:25,7,20,21,16,,
2/7/2018 9:25,8,20,22,17,,
2/7/2018 9:25,9,19,22,17,,
2/7/2018 9:25,10,21,20,15,,
2/7/2018 9:25,11,20,22,17,,
2/7/2018 9:25,12,20,21,16,,
2/7/2018 9:25,13,21,22,17,,
2/7/2018 9:25,14,19,20,15,,
2/7/2018 9:25,15,19,22,17,,
2/7/2018 9:25,16,20,22,17,,
2/7/2018 9:25,17,21,22,17,,
2/7/2018 9:25,18,20,21,16,,
2/7/2018 9:25,19,18,22,17,,
2/7/2018 9:25,20,20,23,18,,
2/7/2018 9:25,21,21,22,17,,
2/7/2018 9:26,22,21,21,16,,
2/7/2018 9:26,23,20,24,19,,
2/7/2018 9:26,24,20,22,17,,
2/7/2018 9:26,25,21,19,14,,
2/7/2018 9:26,26,16,18,13,,
2/7/2018 9:26,27,20,19,14,,
2/7/2018 9:26,28,22,23,18,,
2/7/2018 9:26,29,21,22,17,,
2/7/2018 9:26,30,19,22,17,,
2/7/2018 9:26,31,19,22,17,,
2/7/2018 9:26,32,20,23,18,,
2/7/2018 9:26,33,20,24,19,,
2/7/2018 9:26,34,22,23,18,,
2/7/2018 9:27,35,21,22,17,,
2/7/2018 9:27,36,20,19,14,,
2/7/2018 9:27,37,20,24,19,,
2/7/2018 9:27,38,18,22,17,,
2/7/2018 9:27,39,21,22,17,,
2/7/2018 9:27,40,20,22,17,,
2/7/2018 9:27,41,19,23,18,,
2/7/2018 9:27,42,21,20,15,,
2/7/2018 9:27,43,21,22,17,,
2/7/2018 9:27,44,21,22,17,,
2/7/2018 9:27,45,21,22,17,,
2/7/2018 9:27,46,17,18,13,,
2/7/2018 9:27,47,19,21,16,,
2/7/2018 9:27,48,20,22,17,,
2/7/2018 9:27,49,19,21,16,,
2/7/2018 9:28,50,17,21,16,,
2/7/2018 9:28,51,20,22,17,,
2/7/2018 9:28,52,19,23,18,,
2/7/2018 9:28,53,18,24,19,,
2/7/2018 9:28,54,21,21,16,,
2/7/2018 9:28,55,19,21,16,,
2/7/2018 9:28,56,19,21,16,,
2/7/2018 9:28,57,18,23,18,,
2/7/2018 9:28,58,19,22,17,,
2/7/2018 9:28,59,19,23,18,,
2/7/2018 9:28,60,19,22,17,,
2/7/2018...

CSS

textarea { width: 100%; height: 200px; display: none; }

JavaScript

function drawEllipse(chart, x, y, xr, yr) {
  console.log(chart.xAxis[0]);
  
	// draw ellipse using createElement
  chart.renderer.createElement('ellipse').attr({
      cx: chart.xAxis[0].toPixels(x),
      cy: chart.yAxis[0].toPixels(y),
      rx: 2,
      ry: 2,
      fill: '#000',
      zIndex: 3,
      opacity: 1
    }).add();

}

function processCSV(csv) {
	var obj = $.csv.toObjects(csv);
  
  //get the average x and average  
  var data = [];
  var sumX = 0, sumY = 0;
  $.each(obj, function(k,v) {
  	sumX = sumX + Number(v.X);
    sumY = sumY + Number(v.Y);
  });
  console.log(sumX/obj.length);
  console.log(sumY/obj.length)
  
  var avgX = Math.round(sumX/obj.length);
  var avgY = Math.round(sumY/obj.length);
  
  $.each(obj, function(k,v) {
  	data.push({
    	n: v.Sample,
      x: (v.X-avgX).toFixed(2),
      y: Number((v.Y-avgY).toFixed(2))
    });
  });  
  console.log(data);
	return data;
}
    
$('button').click(function() {
	var csv = $('textarea').val();
  var dataSeries = {
    color: 'rgba(223, 83, 83, .5)',
    data: processCSV(csv)
  };
  
  Highcharts.chart('container', {
      chart: {
          type: 'scatter',
          zoomType: 'xy',
          events: {
          	load: function() {
              drawEllipse(this, 0, 0, 1, 1);
            }
          }
      },
      title: {
          text: 'Bounce Test Data'
      },
      xAxis: {
          min: -10,
          max: 10,
          tickInterval: 1,
          tickPixelInterval: 50
      },
      yAxis: {
          min: -10,
          max: 10,
          tickInterval: 1,
          tickPixelInterval: 50
      },
      /*
      legend: {
          layout: 'vertical',
          align: 'left',
          verticalAlign: 'top',
          x: 100,
          y: 70,
          floating: true,
          backgroundColor: (Highcharts.theme && Highcharts.theme.legendBackgroundColor) || '#FFFFFF',
          borderWidth: 1
      },
      */
      tooltip: {
        formatter: function () {
          return...