Skip to content

Instantly share code, notes, and snippets.

@micahstubbs
Last active September 30, 2016 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save micahstubbs/ac0faf07e5c83e97003b5a45e437e767 to your computer and use it in GitHub Desktop.
Save micahstubbs/ac0faf07e5c83e97003b5a45e437e767 to your computer and use it in GitHub Desktop.
Voronoi clipCells() end[1] null Example II
license: MIT
border: no
height: 330
prepareData.js
node_modules/
package.json
observed-data.json
// https://github.com/micahstubbs/d3-voronoi-scatterplot Version 0.1.0. Copyright 2016 Contributors.
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3'), require('lodash')) :
typeof define === 'function' && define.amd ? define(['exports', 'd3', 'lodash'], factory) :
(factory((global.d3VoronoiScatterplot = global.d3VoronoiScatterplot || {}),global.d3,global._));
}(this, function (exports,d3,_) { 'use strict';
_ = 'default' in _ ? _['default'] : _;
function d3Tip () {
// Mappings to new version of d3
var d3$$ = {
select: d3.select,
event: function event() {
return d3.event;
},
selection: d3.selection,
functor: function functor(v) {
return typeof v === "function" ? v : function () {
return v;
};
}
};
var direction = d3_tip_direction,
offset = d3_tip_offset,
html = d3_tip_html,
node = initNode(),
svg = null,
point = null,
target = null,
parent = null;
function tip(vis) {
svg = getSVGNode(vis);
point = svg.createSVGPoint();
}
// Public - show the tooltip on the screen
//
// Returns a tip
tip.show = function () {
if (!parent) tip.parent(document.body);
var args = Array.prototype.slice.call(arguments);
// console.log('args from tip.show', args);
if (args[args.length - 1] instanceof SVGElement) target = args.pop();
var content = html.apply(this, args),
poffset = offset.apply(this, args),
dir = direction.apply(this, args),
nodel = getNodeEl(),
i = directions.length,
coords,
parentCoords = node.offsetParent.getBoundingClientRect();
nodel.html(content).style('position', 'absolute').style('opacity', 1).style('pointer-events', 'all');
while (i--) {
nodel.classed(directions[i], false);
}coords = direction_callbacks[dir].apply(this);
nodel.classed(dir, true).style('top', coords.top + poffset[0] - parentCoords.top + 'px').style('left', coords.left + poffset[1] - parentCoords.left + 'px');
// .style('top', (coords.top - parentCoords.top + 'px')
// .style('left', (coords.left - parentCoords.left) + 'px')
return tip;
};
// Public - hide the tooltip
//
// Returns a tip
tip.hide = function () {
var nodel = getNodeEl();
nodel.style('opacity', 0).style('pointer-events', 'none');
return tip;
};
// Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.
//
// n - name of the attribute
// v - value of the attribute
//
// Returns tip or attribute value
tip.attr = function (n, v) {
if (arguments.length < 2 && typeof n === 'string') {
return getNodeEl().attr(n);
} else {
var args = Array.prototype.slice.call(arguments);
d3$$.selection.prototype.attr.apply(getNodeEl(), args);
}
return tip;
};
// Public: Proxy style calls to the d3 tip container. Sets or gets a style value.
//
// n - name of the property
// v - value of the property
//
// Returns tip or style property value
tip.style = function (n, v) {
// debugger;
if (arguments.length < 2 && typeof n === 'string') {
return getNodeEl().style(n);
} else {
var args = Array.prototype.slice.call(arguments);
if (args.length === 1) {
var styles = args[0];
Object.keys(styles).forEach(function (key) {
d3$$.selection.prototype.style.apply(getNodeEl(), [key, styles[key]]);
});
}
}
return tip;
};
// Public: Sets or gets the parent of the tooltip element
//
// v - New parent for the tip
//
// Returns parent element or tip
tip.parent = function (v) {
if (!arguments.length) return parent;
parent = v || document.body;
// console.log('parent from tip.parent', parent);
parent.appendChild(node);
// Make sure offsetParent has a position so the tip can be
// based from it. Mainly a concern with <body>.
var offsetParent = d3$$.select(node.offsetParent);
if (offsetParent.style('position') === 'static') {
offsetParent.style('position', 'relative');
}
return tip;
};
// Public: Set or get the direction of the tooltip
//
// v - One of n(north), s(south), e(east), or w(west), nw(northwest),
// sw(southwest), ne(northeast) or se(southeast)
//
// Returns tip or direction
tip.direction = function (v) {
if (!arguments.length) return direction;
direction = v == null ? v : d3$$.functor(v);
return tip;
};
// Public: Sets or gets the offset of the tip
//
// v - Array of [x, y] offset
//
// Returns offset or
tip.offset = function (v) {
if (!arguments.length) return offset;
offset = v == null ? v : d3$$.functor(v);
return tip;
};
// Public: sets or gets the html value of the tooltip
//
// v - String value of the tip
//
// Returns html value or tip
tip.html = function (v) {
if (!arguments.length) return html;
html = v == null ? v : d3$$.functor(v);
return tip;
};
// Public: destroys the tooltip and removes it from the DOM
//
// Returns a tip
tip.destroy = function () {
if (node) {
getNodeEl().remove();
node = null;
}
return tip;
};
function d3_tip_direction() {
return 'n';
}
function d3_tip_offset() {
return [0, 0];
}
function d3_tip_html() {
return ' ';
}
var direction_callbacks = {
n: direction_n,
s: direction_s,
e: direction_e,
w: direction_w,
nw: direction_nw,
ne: direction_ne,
sw: direction_sw,
se: direction_se
};
var directions = Object.keys(direction_callbacks);
function direction_n() {
var bbox = getScreenBBox();
return {
top: bbox.n.y - node.offsetHeight,
left: bbox.n.x - node.offsetWidth / 2
};
}
function direction_s() {
var bbox = getScreenBBox();
return {
top: bbox.s.y,
left: bbox.s.x - node.offsetWidth / 2
};
}
function direction_e() {
var bbox = getScreenBBox();
return {
top: bbox.e.y - node.offsetHeight / 2,
left: bbox.e.x
};
}
function direction_w() {
var bbox = getScreenBBox();
return {
top: bbox.w.y - node.offsetHeight / 2,
left: bbox.w.x - node.offsetWidth
};
}
function direction_nw() {
var bbox = getScreenBBox();
return {
top: bbox.nw.y - node.offsetHeight,
left: bbox.nw.x - node.offsetWidth
};
}
function direction_ne() {
var bbox = getScreenBBox();
return {
top: bbox.ne.y - node.offsetHeight,
left: bbox.ne.x
};
}
function direction_sw() {
var bbox = getScreenBBox();
return {
top: bbox.sw.y,
left: bbox.sw.x - node.offsetWidth
};
}
function direction_se() {
var bbox = getScreenBBox();
return {
top: bbox.se.y,
left: bbox.e.x
};
}
function initNode() {
var node = d3$$.select(document.createElement('div'));
node.style('position', 'absolute').style('top', 0).style('opacity', 0).style('pointer-events', 'none').style('box-sizing', 'border-box');
return node.node();
}
function getSVGNode(el) {
el = el.node();
if (el.tagName.toLowerCase() === 'svg') return el;
return el.ownerSVGElement;
}
function getNodeEl() {
if (node === null) {
node = initNode();
// re-add node to DOM
document.body.appendChild(node);
};
return d3$$.select(node);
}
// Private - gets the screen coordinates of a shape
//
// Given a shape on the screen, will return an SVGPoint for the directions
// n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),
// sw(southwest).
//
// +-+-+
// | |
// + +
// | |
// +-+-+
//
// Returns an Object {n, s, e, w, nw, sw, ne, se}
function getScreenBBox() {
var targetel = target || d3$$.event().target;
while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {
targetel = targetel.parentNode;
}
var bbox = {},
matrix = targetel.getScreenCTM(),
tbbox = targetel.getBBox(),
width = tbbox.width,
height = tbbox.height,
x = tbbox.x,
y = tbbox.y;
point.x = x;
point.y = y;
bbox.nw = point.matrixTransform(matrix);
point.x += width;
bbox.ne = point.matrixTransform(matrix);
point.y += height;
bbox.se = point.matrixTransform(matrix);
point.x -= width;
bbox.sw = point.matrixTransform(matrix);
point.y -= height / 2;
bbox.w = point.matrixTransform(matrix);
point.x += width;
bbox.e = point.matrixTransform(matrix);
point.x -= width / 2;
point.y -= height / 2;
bbox.n = point.matrixTransform(matrix);
point.y += height;
bbox.s = point.matrixTransform(matrix);
return bbox;
}
return tip;
};
function tooltip(tooltipVariables) {
var tip = d3Tip().parent(document.getElementById('chart')).attr('class', 'd3-tip').html(function (d) {
// console.log('d from tooltip html function', d);
var allRows = '';
tooltipVariables.forEach(function (e) {
var currentValue = void 0;
if (typeof e.format !== 'undefined') {
if (e.type === 'time') {
// time formatting
var inputValue = new Date(Number(d.datum[e.name]));
// TODO: handle case where date values are strings
var currentFormat = d3.timeFormat(e.format);
currentValue = currentFormat(inputValue);
} else {
// number formatting
var _inputValue = Number(d.datum[e.name]);
var _currentFormat = d3.format(e.format);
currentValue = _currentFormat(_inputValue);
}
} else {
// no formatting
currentValue = d.datum[e.name];
}
var currentRow = '<span style=\'font-size: 11px; display: block; text-align: center;\'>' + e.name + ' ' + currentValue + '</span>';
allRows = allRows.concat(currentRow);
});
return '<div style=\'background-color: white; padding: 5px; border-radius: 6px;\n border-style: solid; border-color: #D1D1D1; border-width: 1px;\'>\n ' + allRows + '\n </div>';
});
return tip;
}
function d3DistanceLimitedVoronoi() {
/////// Internals ///////
var voronoi = d3.voronoi().extent([[-1e6, -1e6], [1e6, 1e6]]);
var limit = 20; // default limit
var context = null; // set it to render to a canvas' 2D context
function _distanceLimitedVoronoi(data) {
if (context != null) {
//renders into a Canvas
context.beginPath();
voronoi.polygons(data).forEach(function (cell) {
distanceLimitedCell(cell, limit, context);
});
return true;
} else {
//final viz is an SVG
return voronoi.polygons(data).map(function (cell) {
return {
path: distanceLimitedCell(cell, limit, d3.path()).toString(),
datum: cell.data
};
});
}
}
///////////////////////
///////// API /////////
///////////////////////
_distanceLimitedVoronoi.limit = function (_) {
if (!arguments.length) {
return limit;
}
if (typeof _ === "number") {
limit = Math.abs(_);
}
return _distanceLimitedVoronoi;
};
_distanceLimitedVoronoi.x = function (_) {
if (!arguments.length) {
return voronoi.x();
}
voronoi.x(_);
return _distanceLimitedVoronoi;
};
_distanceLimitedVoronoi.y = function (_) {
if (!arguments.length) {
return voronoi.y();
}
voronoi.y(_);
return _distanceLimitedVoronoi;
};
_distanceLimitedVoronoi.extent = function (_) {
if (!arguments.length) {
return voronoi.extent();
}
voronoi.extent(_);
return _distanceLimitedVoronoi;
};
//exposes the underlying d3.geom.voronoi
//eg. allows to code 'limitedVoronoi.voronoi().triangle(data)'
_distanceLimitedVoronoi.voronoi = function (_) {
if (!arguments.length) {
return voronoi;
}
voronoi = _;
return _distanceLimitedVoronoi;
};
_distanceLimitedVoronoi.context = function (_) {
if (!arguments.length) {
return context;
}
context = _;
return _distanceLimitedVoronoi;
};
///////////////////////
/////// Private ///////
///////////////////////
function distanceLimitedCell(cell, r, context) {
var seed = [voronoi.x()(cell.data), voronoi.y()(cell.data)];
if (allVertecesInsideMaxDistanceCircle(cell, seed, r)) {
context.moveTo(cell[0][0], cell[0][1]);
for (var j = 1, m = cell.length; j < m; ++j) {
context.lineTo(cell[j][0], cell[j][1]);
}
context.closePath();
return context;
} else {
var pathNotYetStarted = true;
var firstPointTooFar = pointTooFarFromSeed(cell[0], seed, r);
var p0TooFar = firstPointTooFar;
var p0, p1, intersections;
var openingArcPoint, lastClosingArcPoint;
var startAngle, endAngle;
//begin: loop through all segments to compute path
for (var iseg = 0; iseg < cell.length; iseg++) {
p0 = cell[iseg];
p1 = cell[(iseg + 1) % cell.length];
// compute intersections between segment and maxDistance circle
intersections = segmentCircleIntersections(p0, p1, seed, r);
// complete the path (with lines or arc) depending on:
// intersection count (0, 1, or 2)
// if the segment is the first to start the path
// if the first point of the segment is inside or outside of the maxDistance circle
if (intersections.length === 2) {
if (p0TooFar) {
if (pathNotYetStarted) {
pathNotYetStarted = false;
// entire path will finish with an arc
// store first intersection to close last arc
lastClosingArcPoint = intersections[0];
// init path at 1st intersection
context.moveTo(intersections[0][0], intersections[0][1]);
} else {
//draw arc until first intersection
startAngle = angle(seed, openingArcPoint);
endAngle = angle(seed, intersections[0]);
context.arc(seed[0], seed[1], r, startAngle, endAngle, 1);
}
// then line to 2nd intersection, then initiliaze an arc
context.lineTo(intersections[1][0], intersections[1][1]);
openingArcPoint = intersections[1];
} else {
// THIS CASE IS IMPOSSIBLE AND SHOULD NOT ARISE
console.error("What's the f**k");
}
} else if (intersections.length === 1) {
if (p0TooFar) {
if (pathNotYetStarted) {
pathNotYetStarted = false;
// entire path will finish with an arc
// store first intersection to close last arc
lastClosingArcPoint = intersections[0];
// init path at first intersection
context.moveTo(intersections[0][0], intersections[0][1]);
} else {
// draw an arc until intersection
startAngle = angle(seed, openingArcPoint);
endAngle = angle(seed, intersections[0]);
context.arc(seed[0], seed[1], r, startAngle, endAngle, 1);
}
// then line to next point (1st out, 2nd in)
context.lineTo(p1[0], p1[1]);
} else {
if (pathNotYetStarted) {
pathNotYetStarted = false;
// init path at p0
context.moveTo(p0[0], p0[1]);
}
// line to intersection, then initiliaze arc (1st in, 2nd out)
context.lineTo(intersections[0][0], intersections[0][1]);
openingArcPoint = intersections[0];
}
p0TooFar = !p0TooFar;
} else {
if (p0TooFar) {
// entire segment too far, nothing to do
true;
} else {
// entire segment in maxDistance
if (pathNotYetStarted) {
pathNotYetStarted = false;
// init path at p0
context.moveTo(p0[0], p0[1]);
}
// line to next point
context.lineTo(p1[0], p1[1]);
}
}
} //end: loop through all segments
if (pathNotYetStarted) {
// special case: no segment intersects the maxDistance circle
// cell perimeter is entirely outside the maxDistance circle
// path is the maxDistance circle
pathNotYetStarted = false;
context.moveTo(seed[0] + r, seed[1]);
context.arc(seed[0], seed[1], r, 0, 2 * Math.PI, false);
} else {
// if final segment ends with an opened arc, close it
if (firstPointTooFar) {
startAngle = angle(seed, openingArcPoint);
endAngle = angle(seed, lastClosingArcPoint);
context.arc(seed[0], seed[1], r, startAngle, endAngle, 1);
}
context.closePath();
}
return context;
}
function allVertecesInsideMaxDistanceCircle(cell, seed, r) {
var result = true;
var p;
for (var ip = 0; ip < cell.length; ip++) {
result = result && !pointTooFarFromSeed(cell[ip], seed, r);
}
return result;
}
function pointTooFarFromSeed(p, seed, r) {
return Math.pow(p[0] - seed[0], 2) + Math.pow(p[1] - seed[1], 2) > Math.pow(r, 2);
}
function angle(seed, p) {
var v = [p[0] - seed[0], p[1] - seed[1]];
// from http://stackoverflow.com/questions/2150050/finding-signed-angle-between-vectors, with v1 = horizontal radius = [seed[0]+r - seed[0], seed[0] - seed[0]]
return Math.atan2(v[1], v[0]);
}
}
function segmentCircleIntersections(A, B, C, r) {
/*
from http://stackoverflow.com/questions/1073336/circle-line-segment-collision-detection-algorithm
*/
var Ax = A[0],
Ay = A[1],
Bx = B[0],
By = B[1],
Cx = C[0],
Cy = C[1];
// compute the euclidean distance between A and B
var LAB = Math.sqrt(Math.pow(Bx - Ax, 2) + Math.pow(By - Ay, 2));
// compute the direction vector D from A to B
var Dx = (Bx - Ax) / LAB;
var Dy = (By - Ay) / LAB;
// Now the line equation is x = Dx*t + Ax, y = Dy*t + Ay with 0 <= t <= 1.
// compute the value t of the closest point to the circle center (Cx, Cy)
var t = Dx * (Cx - Ax) + Dy * (Cy - Ay);
// This is the projection of C on the line from A to B.
// compute the coordinates of the point E on line and closest to C
var Ex = t * Dx + Ax;
var Ey = t * Dy + Ay;
// compute the euclidean distance from E to C
var LEC = Math.sqrt(Math.pow(Ex - Cx, 2) + Math.pow(Ey - Cy, 2));
// test if the line intersects the circle
if (LEC < r) {
// compute distance from t to circle intersection point
var dt = Math.sqrt(Math.pow(r, 2) - Math.pow(LEC, 2));
var tF = t - dt; // t of first intersection point
var tG = t + dt; // t of second intersection point
var result = [];
if (tF > 0 && tF < LAB) {
// test if first intersection point in segment
// compute first intersection point
var Fx = (t - dt) * Dx + Ax;
var Fy = (t - dt) * Dy + Ay;
result.push([Fx, Fy]);
}
if (tG > 0 && tG < LAB) {
// test if second intersection point in segment
// compute second intersection point
var Gx = (t + dt) * Dx + Ax;
var Gy = (t + dt) * Dy + Ay;
result.push([Gx, Gy]);
}
return result;
} else {
// either (LEC === r), tangent point to circle is E
// or (LEC < r), line doesn't touch circle
// in both cases, returning nothing is OK
return [];
}
}
return _distanceLimitedVoronoi;
};
function drawVoronoiOverlay(selector, data, options) {
/*
Initiate the Voronoi function
Use the same variables of the data in the .x and .y as used
in the cx and cy of the circle call
The clip extent will make the boundaries end nicely along
the chart area instead of splitting up the entire SVG
(if you do not do this it would mean that you already see
a tooltip when your mouse is still in the axis area, which
is confusing)
*/
var xVariable = options.xVariable;
var yVariable = options.yVariable;
var xScale = options.xScale;
var yScale = options.yScale;
var width = options.width;
var height = options.height;
var tip = options.tip;
var idVariable = options.idVariable;
if (typeof idVariable === 'undefined') idVariable = 'id';
var xAccessor = function xAccessor(d) {
return xScale(d[xVariable]);
};
var yAccessor = function yAccessor(d) {
return yScale(d[yVariable]);
};
var limitedVoronoi = d3DistanceLimitedVoronoi().x(xAccessor).y(yAccessor).limit(50).extent([[0, 0], [width, height]]);
// console.log('data[0]', data[0]);
// console.log('data from drawVoronoiOverlay', data);
var xValues = data.map(function (d) {
return d[xVariable];
});
// console.log('current xVariable', xVariable);
// console.log('xValues', xValues);
var yValues = data.map(function (d) {
return d[yVariable];
});
// console.log('current yVariable', yVariable);
// console.log('yValues', yValues);
var limitedVoronoiCells = limitedVoronoi(data);
// remove any existing Voronoi overlay
selector.selectAll('.voronoiWrapper').remove();
// create a group element to place the Voronoi diagram in
var limitedVoronoiGroup = selector.append('g').attr('class', 'voronoiWrapper');
// Create the distance-limited Voronoi diagram
limitedVoronoiGroup.selectAll('path').data(limitedVoronoiCells) // Use Voronoi() with your dataset inside
.enter().append('path')
// .attr("d", function(d, i) { return "M" + d.join("L") + "Z"; })
.attr('d', function (d) {
// console.log('d from limitedVoronoiGroup', d);
if (typeof d !== 'undefined') {
return d.path;
}
return '';
})
// Give each cell a unique class where the unique part corresponds to the circle classes
// .attr('class', d => `voronoi ${d.datum[idVariable]}`)
.attr('class', function (d) {
if (typeof d !== 'undefined') {
if (typeof d.datum[idVariable] !== 'undefined') {
return 'voronoi id' + xVariable + yVariable + d.datum[idVariable];
}
return 'voronoi id' + xVariable + yVariable + d[idVariable];
}
return 'voronoi';
}).style('stroke', 'lightblue') // I use this to look at how the cells are dispersed as a check
// .style('stroke', 'none')
.style('fill', 'none').style('pointer-events', 'all')
// .on('mouseover', tip.show)
// .on('mouseout', tip.hide);
.on('mouseover', function (d, i, nodes) {
// console.log('d from mouseover', d);
// console.log('i from mouseover', i);
// console.log('nodes from mouseover', nodes);
// console.log('this from mouseover', this);
showTooltip(d, i, nodes);
}).on('mouseout', function (d, i, nodes) {
// console.log('this from mouseout', this);
removeTooltip(d, i, nodes);
});
// Show the tooltip on the hovered over circle
function showTooltip(d, i, nodes) {
// Save the circle element (so not the voronoi which is triggering the hover event)
// in a variable by using the unique class of the voronoi (idVariable)
var elementSelector = void 0;
if (typeof d.datum[idVariable] !== 'undefined') {
elementSelector = '.marks.id' + xVariable + yVariable + d.datum[idVariable];
} else {
elementSelector = '.marks.id' + xVariable + yVariable + d[idVariable];
}
// console.log('elementSelector', elementSelector);
var element = void 0;
if (typeof d.datum[idVariable] !== 'undefined') {
element = d3.selectAll('.marks.id' + xVariable + yVariable + d.datum[idVariable]);
} else {
element = d3.selectAll('.marks.id' + xVariable + yVariable + d[idVariable]);
}
// console.log('element from showTooltip', element);
// console.log('d from showTooltip', d);
var pathStartX = Number(d.path.split('M')[1].split(',')[0]);
var pathStartY = Number(d.path.split(',')[1].split('L')[0]);
// console.log('pathStartX', pathStartX);
// console.log('pathStartY', pathStartY);
// console.log('element.nodes()[0] from showTooltip', element.nodes()[0]);
var currentDOMNode = element.nodes()[0];
var cx = currentDOMNode.cx.baseVal.value;
var cy = currentDOMNode.cy.baseVal.value;
tip.show(d, i, nodes);
// const tipTop = tip.style('top');
// const tipLeft = tip.style('left');
// const tipTopValue = Number(tipTop.slice(0, -2));
// const tipLeftValue = Number(tipLeft.slice(0, -2));
// const offsetX = tipLeftValue - cx;
// const offsetY = tipTopValue - cy;
var offsetX = 0; // pathStartX + (pathStartX - cx);
var offsetY = pathStartY + (pathStartY - cy);
// console.log('cx', cx);
// console.log('tipLeft', tipLeft);
// console.log('tipLeftValue', tipLeftValue);
// console.log('calculated offsetX', offsetX);
// console.log('cy', cy);
// console.log('tipTop', tipTop);
// console.log('tipTopValue', tipTopValue);
// console.log('calculated offsetY', offsetY);
// tip.offset([offsetX,offsetY]);
// tip.offset([150, 150]);
// Make chosen circle more visible
element.style('fill-opacity', 1);
} // function showTooltip
// Hide the tooltip when the mouse moves away
function removeTooltip(d, i, nodes) {
// Save the circle element (so not the voronoi which is triggering the hover event)
// in a variable by using the unique class of the voronoi (idVariable)
var element = void 0;
if (typeof d.datum[idVariable] !== 'undefined') {
element = d3.selectAll('.marks.id' + xVariable + yVariable + d.datum[idVariable]);
} else {
element = d3.selectAll('.marks.id' + xVariable + yVariable + d[idVariable]);
}
// console.log('element from removeTooltip', element);
// console.log('element.nodes()[0] from removeTooltip', element.nodes()[0]);
var currentDOMNode = element.nodes()[0];
tip.hide(d, i, nodes);
// Fade out the bright circle again
element.style('fill-opacity', 0.3);
} // function removeTooltip
}
function drawVoronoiScatterplot(selector, inputData, options) {
//
// Set-up
//
// vanilla JS window width and height
var wV = window;
var dV = document;
var eV = dV.documentElement;
var gV = dV.getElementsByTagName('body')[0];
var xV = wV.innerWidth || eV.clientWidth || gV.clientWidth;
var yV = wV.innerHeight || eV.clientHeight || gV.clientHeight;
// Quick fix for resizing some things for mobile-ish viewers
var mobileScreen = xV < 500;
// set default configuration
var cfg = {
margin: { left: 120, top: 20, right: 80, bottom: 20 },
width: 1000,
animateFromXAxis: undefined,
hideXLabel: undefined,
yVariable: 'y',
idVariable: undefined,
marks: {
r: 2,
fillOpacity: 0.3
}
};
// Put all of the options into a variable called cfg
if (typeof options !== 'undefined') {
for (var i in options) {
if (typeof options[i] !== 'undefined') {
cfg[i] = options[i];
}
} // for i
} // if
// console.log('options passed in to scatterplot', options);
// console.log('cfg from scatterplot', cfg);
// map variables to our dataset
var xVariable = cfg.xVariable;
var yVariable = cfg.yVariable;
var rVariable = undefined;
var idVariable = cfg.idVariable;
var groupByVariable = cfg.groupByVariable;
var wrapperId = cfg.wrapperId;
var wrapperLabel = cfg.wrapperLabel;
var tooltipVariables = cfg.tooltipColumns;
var numericVariables = cfg.numericColumns;
var xLabelDetail = cfg.xLabelDetail;
var hideXLabel = cfg.hideXLabel;
var xLabelTransform = cfg.xLabelTransform;
var yLabelTransform = cfg.yLabelTransform;
var dependent = cfg.dependent;
var globalExtents = cfg.globalExtents;
var animateFromXAxis = cfg.animateFromXAxis;
var opacityCircles = cfg.marks.fillOpacity;
var marksRadius = cfg.marks.r;
var dynamicWidth = cfg.dynamicWidth;
// labels
var xLabel = cfg.xLabel || xVariable;
if (typeof xLabelDetail !== 'undefined') {
xLabel = xLabel + ' (' + xLabelDetail + ')';
}
var yLabel = cfg.yLabel || yVariable;;
// const xLabel = 'y\u{0302}'; // y-hat for the prediction
// const yLabel = 'r\u{0302}'; // r-hat for the residual
var div = d3.select(selector).append('div').attr('id', 'chart');
// Scatterplot
var margin = cfg.margin;
var chartWidth = document.getElementById('chart').offsetWidth;
var height = cfg.width * 0.25;
// const maxDistanceFromPoint = 50;
var width = void 0;
if (typeof dynamicWidth !== 'undefined') {
// use a dynamic width derived from the window width
width = chartWidth - margin.left - margin.right;
} else {
// use width specified in the options passed in
width = cfg.width - margin.left - margin.right;
}
var svg = div.append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom);
var wrapper = svg.append('g').classed('chartWrapper', true).classed('' + xVariable, true).attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');
if (typeof dependent !== 'undefined') {
svg.classed('dependent', true);
wrapper.classed('dependent', true);
wrapper.attr('id', wrapperId);
// draw model label
wrapper.append('g').attr('transform', 'translate(' + 20 + ', ' + 45 + ')').append('text').classed('modelLabel', true).style('font-size', '40px').style('font-weight', 400).style('opacity', 0.15).style('fill', 'gray').style('font-family', 'Work Sans, sans-serif').text('' + wrapperLabel);
} else {
svg.classed('independent', true);
wrapper.classed('independent', true);
wrapper.attr('id', wrapperId);
}
//
// Initialize Axes & Scales
//
// Set the color for each region
var color = d3.scaleOrdinal().range(['#1f78b4', '#ff7f00', '#33a02c', '#e31a1c', '#6a3d9a', '#b15928', '#a6cee3', '#fdbf6f', '#b2df8a', '#fb9a99', '#cab2d6', '#ffff99']);
// parse strings to numbers
var data = _.cloneDeep(inputData);
// console.log('data from scatterplot', data);
data.forEach(function (d, i) {
numericVariables.forEach(function (e) {
d[e] = Number(d[e]);
});
if (typeof idVariable === 'undefined') {
data[i].id = '' + i;
}
});
if (typeof idVariable === 'undefined') idVariable = 'id';
// console.log('data from drawVoronoiScatterplot', data);
//
// Scales
//
// Set the new x axis range
var xScale = d3.scaleLinear().range([0, width]);
// Set the new y axis range
var yScale = d3.scaleLinear().range([height, 0]);
if (typeof globalExtents !== 'undefined') {
// retrieve global extents
var xExtent = globalExtents[0];
var yExtent = globalExtents[1];
// set scale domains with global extents
xScale.domain(xExtent);
yScale.domain(yExtent).nice();
} else {
// set scale domains from the local extent
xScale.domain(d3.extent(data, function (d) {
return d[xVariable];
}));
// .nice();
yScale.domain(d3.extent(data, function (d) {
return d[yVariable];
})).nice();
}
// console.log('yScale.domain()', yScale.domain());
//
// Axes
//
// Set new x-axis
var xAxis = d3.axisBottom().ticks(4).tickSizeOuter(0)
// .tickFormat(d => // Difficult function to create better ticks
// xScale.tickFormat((mobileScreen ? 4 : 8), e => {
// const prefix = d3.format(',.0s');
// return `${prefix(e)}`;
// })(d))
.scale(xScale);
// calculate y-position we'd like for the x-axis
var xAxisYTranslate = d3.max([0, yScale.domain()[0]]);
// Append the x-axis
wrapper.append('g').attr('class', 'x axis').attr('transform', 'translate(' + 0 + ', ' + yScale(xAxisYTranslate) + ')').call(xAxis);
var yAxis = d3.axisLeft().ticks(6) // Set rough # of ticks
.scale(yScale);
// Append the y-axis
wrapper.append('g').attr('class', 'y axis').attr('transform', 'translate(' + 0 + ', ' + 0 + ')').call(yAxis);
// Scale for the bubble size
if (typeof rVariable !== 'undefined') {
var _rScale = d3.scaleSqrt().range([mobileScreen ? 1 : 2, mobileScreen ? 10 : 16]).domain(d3.extent(data, function (d) {
return d[rVariable];
}));
}
//
// Tooltips
//
var tip = tooltip(tooltipVariables);
svg.call(tip);
//
// Scatterplot Circles
//
// Initiate a group element for the circles
var circleGroup = wrapper.append('g').attr('class', 'circleWrapper');
function update(data, options) {
console.log('update function was called');
// console.log('data from update function', data);
// handle NaN values
data = data.filter(function (d) {
return !Number.isNaN(d[xVariable]) && !Number.isNaN(d[yVariable]);
});
// an extra delay to allow large
// amounts of points time to render
var marksDelay = 0;
if (typeof options !== 'undefined') {
marksDelay = options.marksDelay;
// if a new groupByVariable is passed in, use it
if (typeof options.groupByVariable !== 'undefined') {
groupByVariable = options.groupByVariable;
};
}
// Place the circles
var updateSelection = circleGroup.selectAll('circle') // circleGroup.selectAll('.marks')
.data(function () {
if (typeof rVariable !== 'undefined') {
// Sort so the biggest circles are below
return data.sort(function (a, b) {
return b[rVariable] > a[rVariable];
});
}
return data;
}, function (d) {
return d[idVariable];
});
// console.log('updateSelection', updateSelection);
var enterSelection = updateSelection.enter().append('circle');
// console.log('enterSelection', enterSelection);
var exitSelection = updateSelection.exit();
// console.log('exitSelection', exitSelection);
updateSelection;
// .style('fill', 'black');
enterSelection.attr('class', function (d) {
return 'marks id' + xVariable + yVariable + d[idVariable];
}).style('fill-opacity', 0).style('fill', function (d) {
// console.log('d from style', d);
if (typeof groupByVariable !== 'undefined') {
return color(d[groupByVariable]);
}
return color.range()[0]; // 'green'
}).attr('cx', function (d) {
// console.log('cx parameters from drawVoronoiScatterplot');
// console.log('xScale', xScale);
// console.log('d', d);
// console.log('xVariable', xVariable);
// console.log('xScale(d[xVariable])', xScale(d[xVariable]));
return xScale(d[xVariable]);
}).attr('cy', function (d) {
if (typeof animateFromXAxis !== 'undefined') {
return yScale(xAxisYTranslate);
} else {
return yScale(d[yVariable]);
}
}).attr('r', function (d) {
if (typeof rVariable !== 'undefined') {
return rScale(d[rVariable]);
}
return marksRadius;
}).transition().delay(marksDelay).duration(2000).style('fill-opacity', opacityCircles);
// .append('title')
// .text(d => `${d[idVariable]} ${d[xLabelDetail]}`);
exitSelection.transition().delay(marksDelay).duration(0).style('fill', 'lightgray') // 'red'
.transition().delay(2000).duration(2000).style('fill-opacity', 0).remove();
var mergedSelection = updateSelection.merge(enterSelection);
// console.log('mergedSelection', mergedSelection);
// console.log('mergedSelection.nodes()', mergedSelection.nodes());
var mergedSelectionData = mergedSelection.nodes().map(function (d) {
return d.__data__;
});
// console.log('mergedSelectionData', mergedSelectionData);
if (typeof animateFromXAxis !== 'undefined') {
updateSelection.transition().delay(2000).duration(2000).attr('cy', function (d) {
return yScale(d[yVariable]);
});
}
//
// distance-limited Voronoi overlay
//
var voronoiOptions = {
xVariable: xVariable,
yVariable: yVariable,
idVariable: idVariable,
xScale: xScale,
yScale: yScale,
width: width,
height: height,
tip: tip
};
drawVoronoiOverlay(wrapper, mergedSelectionData, voronoiOptions);
}
// call the update function once to kick things off
update(data);
//
// Initialize Labels
//
var xlabelText = xLabel || xVariable;
var yLabelText = yLabel || yVariable;
if (typeof hideXLabel === 'undefined') {
// Set up X axis label
var xTextAnchor = 'start';
var xLabelTranslate = void 0;
if (xLabelTransform === 'top') {
// label on top
xLabelTranslate = 'translate(' + 30 + ',' + -10 + ')';
} else if (typeof xLabelTransform !== 'undefined') {
// use specified [x, y, rotate] transform
xLabelTranslate = 'rotate(' + yLabelTransform[2] + ') translate(' + xLabelTransform[0] + ',' + xLabelTransform[1] + ')';
} else {
// default to no translation
xLabelTranslate = 'translate(' + width + ',' + (height - 10) + ')';
xTextAnchor = 'end';
}
wrapper.append('g').append('text').attr('class', 'x title').attr('text-anchor', xTextAnchor).style('font-size', (mobileScreen ? 8 : 12) + 'px').style('font-weight', 600).attr('transform', xLabelTranslate).text('' + xlabelText);
}
// Set up y axis label
var yLabelTranslate = void 0;
if (yLabelTransform === 'left') {
// label on the left
yLabelTranslate = 'translate(' + -(margin.left / 4) + ',' + yScale(xAxisYTranslate) + ')';
} else if (typeof yLabelTransform !== 'undefined') {
// use specified [x, y, rotate] transform
yLabelTranslate = 'rotate(' + yLabelTransform[2] + ') translate(' + yLabelTransform[0] + ',' + yLabelTransform[1] + ')';
} else {
// default
yLabelTranslate = 'rotate(270) translate(' + 0 + ',' + 10 + ')';
}
wrapper.append('g').append('text').attr('class', 'y title').attr('text-anchor', 'end').attr('dy', '0.35em').style('font-size', (mobileScreen ? 8 : 12) + 'px')
// .attr('transform', 'translate(18, 0) rotate(-90)')
.attr('transform', yLabelTranslate).text('' + yLabelText);
//
// Hide axes on click
//
var axisVisible = true;
function click() {
if (axisVisible) {
d3.selectAll('.y.axis').style('opacity', 0);
d3.selectAll('.x.axis text').style('opacity', 0);
d3.selectAll('.x.axis .tick').style('opacity', 0);
axisVisible = false;
} else {
d3.selectAll('.axis').style('opacity', 1);
d3.selectAll('.x.axis text').style('opacity', 1);
d3.selectAll('.x.axis .tick').style('opacity', 1);
axisVisible = true;
}
}
d3.selectAll('.chartWrapper').on('click', function () {
click();
});
// console.log('update from drawVoronoiScatterplot', update);
return update;
// drawVoronoiScatterplot.update = (data) => {
// // console.log('drawVoronoiScatterplot.update() was called');
// if (typeof update === 'function') update(data);
// };
}
exports.drawVoronoiScatterplot = drawVoronoiScatterplot;
Object.defineProperty(exports, '__esModule', { value: true });
}));
x y
0 2.58617472028523
0 94.26988282969606
0 446.8988387332339
0 0.17236393706327469
0 0.026381200058329488
0 0.09622598349309004
0 336.5311648225067
0 0.6510888806317189
0 0.0035596502709454646
0 4.229885518734559
0 0.09926129253307225
0 2.0071508163944065
0 0.1017671429454872
0 0.6761146101495281
0 1.9648102139150463
0 0.9146829254343524
0 0.0686000551921844
0 0.0010961212431551755
0 0.034763010315517866
0 0.0019440899156049048
0 0.014577190461594128
0 0.011673247239185064
0 0.06620911064921178
0 0.05979323053339773
0 1.75567594946632
0 4.39108648468406
0 1.8813980041503844
0 0.04223027822113561
0 0.02332470872365843
0 0.2244571349920895
0 0.0626434528489052
0 0.04185984504572744
0 0.0148740534201272
0 0.1676348368615872
2 1.674967514920701
0 14.560385675300497
0 2.16201717926945
0 0.1088429186300197
0 0.6326189390625913
0 0.03816022373307261
0 0.0003310670370501482
0 0.03356885734152737
0 0.07590997789651699
0 0.005503712707757781
0 0.5886808513017517
0 15.658859519721606
0 0.07605382502791896
0 2.9789147690883064
0 0.6157828460656993
14 0.10427443271841419
0 1.4246846171507546
0 100.91329405852022
0 4.7450029355386505
0 3.874074015493718
0 7.497114601135269
0 20.836764809552633
1 0.10692890519716412
0 0.41215193613869394
0 718.6840090290096
0 591.4201257554058
0 8.453196454252653
0 0.004300264336221134
0 0.8526338176836815
0 8.17159312251949
0 3.5860486490488395
0 10.469002535037857
0 5.2233777820936815
0 0.08968848718680196
0 1.5495322519965735
0 0.12840762132337896
0 0.1148340214991539
0 0.0017900561627789832
0 0.7499354918393842
0 0.08519352082663775
0 1.5939669328743327
30 299.4534003329195
0 4.220988934133211
0 0.5942367618392791
0 0.09603828048175793
0 0.6511742078664803
0 0.15227302777270976
0 0.009659800222772371
0 0.013706315530835117
0 0.5988109116557906
0 0.06317944126767645
0 6.610453533146883
0 0.17702983060531077
0 1.2790810636268126
0 0.2674021057128874
0 0.14061870581994512
0 1.3760647460237152
0 29.310839369158806
0 6.946162023175127
0 0.07554258876329077
0 0.010661249415972449
0 4.094434242168004
0 24.70034564062255
0 8.145619188062959
0 0.08439673956567371
0 1.3661531219311425
0 0.006222572734817693
0 20.65730864736653
0 0.2268994214243863
0 0.3215304950522501
0 0.3156593206138116
0 3.1888124895194783
0 0.11883093244173105
0 17.465045464027806
0 1.4127497522762484
0 0.0574053770820663
0 0.0026086615480073383
0 12.864540993096597
0 1.4448673874139786
0 0.21313982121705666
0 0.06439672912529204
0 0.8519332814995431
0 3.75485545912823
0 0.023678046263806058
0 3.3257398716772544
0 5.022539667286654
0 3.0215320534203216
0 0.02535557889247002
0 0.0033091416002848325
0 3.4864102435430815
0 1.1170621748030114
0 76.65268080608584
0 11.196069718125829
2 0.26130685739990916
0 63.562785399800994
2 0.21697250008511054
0 0.1546864647403409
0 0.4974827809127147
0 0.28284183620589587
0 0.13128467226099724
0 53.9427130752563
0 8.003811334074063
0 11.615002954494333
0 6.9754938724712225
0 0.481528542737503
0 142.78896321144038
0 3388.921842017211
0 263.0321319639827
0 1092.1671896155021
0 0.0599095389146599
0 1.1287772024796199
0 1.092460592974556
0 0.7116228687567975
0 15.680283975365773
0 144.9451248333695
0 91.60427583547748
0 12.99933888920587
0 0.000020998086803665673
0 1.7293825162517018
0 16.111774121169788
0 0.953796807884272
0 2521.9550812892685
0 3.4492593315948246
0 4.155023401094959
0 0.02944566922426661
0 1.1834638486087703
0 0.0019890979350549076
0 9.588971477150848
0 0.7420288768515266
0 0.1135693908084409
0 0.35244792573640116
0 1.1523820695463352
0 1179.5561602372986
0 97.47022421106904
0 4968.370292502192
0 7081.783374142789
0 2484.6902589084025
0 97.33180911657972
0 25705.17420849335
0 41.88466040191545
0 11070.686857023027
0 799.9468984103776
0 55.30402321506089
0 370.55606142933465
0 589.8174773025969
252 1076.2359727079336
0 0.2897193537252511
0 1.583641898811213
0 2.6339473269850835
0 31.899273498232994
0 79.40298785917973
0 0.021256266028060845
0 25.99646967083416
0 53.70679237470048
0 416.73822457576375
0 2.264928090941384
0 2.0943295778856563
0 0.38386302335301314
0 22.03612517381302
0 16.080758998756085
0 16.884488051019154
0 0.6671793199237724
0 1.3960697487607703
0 11.611102005049897
0 3.2412756382302135
0 19.87181340077024
0 19.111741384922578
0 183.21542638430805
0 31.88765997053155
0 950.0187554906632
0 635.8074289800232
0 27.242225017238926
0 1.7193281432699317
0 240.03925028256756
0 138.56568897608668
0 9.280085760723697
0 44.03488075797631
0 8.865513519288898
0 94.52138076607051
0 507.52805122499564
0 0.5117409292444856
0 128.56937577023473
0 179.76802183042008
0 8.09823122869464
0 352.88081334632943
0 287.99313447556494
0 0.0086589100560503
0 308.96547211638483
0 2.0922958584368363
0 142.5304287852336
0 92.30996097823684
0 38.710057382618416
0 4.542288920378117
0 416.1600000000037
0 5358.240000000007
0 2.9542526264430498
0 13688.805191122769
0 11387.024100000008
0 59.86310704351862
0 0.06925628753043593
0 58.76069310906581
0 391.0989437732619
0 10.153099217785662
0 0.954773742736956
0 7.747099603370154
0 17.725970703655136
0 945.682095456194
0 64.31101169514679
0 52.62094458192738
0 7.13821398076888
0 1.1904329617590594
0 0.00005498687757649439
0 1.7844668651523423
0 3.675142201871043
0 0.27479489932360296
0 0.000053476673201657825
0 23.89551883917493
0 1704.0676266878202
0 0.024513954566852385
0 74.52123647928238
0 129.9498762957964
0 111.651069293628
1 0.0005033428087829395
0 0.18557748101733726
0 49.34247223767828
0 48.16556333177527
0 438.7679860922651
0 176.87625704184236
0 38.936463143063904
0 196.5458018091421
0 83.18701117136001
0 23.984246320104557
0 26.00486103266832
0 11.644332507396086
0 0.8303737815880238
0 3.8746488754661046
0 0.11112603131682441
0 92.69416239572121
0 98.78607958536688
0 0.0019369145366882592
0 123.81068861049522
0 11.458337082946246
0 34.93459322167035
0 463.6951340676824
0 0.9681988250629098
0 33.42904806244475
0 64.35412131314793
0 0.20106020087117693
0 9.038356515294877
0 0.3217900296331005
0 4.830926436726043
0 1.3569964039744962
0 29877.4569336141
0 87.53549663348844
0 13.887373831473466
0 9.064779846111849
0 22.1503890555361
0 96.4634117770854
0 444.3350110203334
0 187.57852009854037
0 1.9728441242562265
0 75.66593672729844
0 1.607753844393235
0 117.33613397202627
0 61.17459145380417
0 84.87733504168787
0 10.59672108399407
0 30.11741244975465
0 7805.284220805367
0 1803.5483155470579
0 218.74697006289628
9 17.336275300206157
10 0.37802795840884745
0 8.51028559953899
54 45.37983524280811
1 3.053086468614717
0 0.8733144340052733
3 9.433140808151094
1 7.570876188922868
0 31.02160581864883
11 0.01065107398116398
1 33.98965793269222
6 0.25397502704300673
5 8.272803529361328
22 35.4220152313718
0 11.618438537234947
1 9.395856345230452
0 1.3508911776278194
0 8.008934545935634
4 12.665828901581673
7 3.1492947571411647
0 53.71694646570713
0 17.54493628456028
0 13.21631129165
0 2.3533936336846444
26 11.261130568445532
0 31.66025237149154
0 16.08163952048968
0 4.073550362333945
15 422.2815789944649
0 30.87625673115252
1 7.377019375568642
0 54.512605431002754
0 2675.692581424479
1 80.20850219366346
7 230.61056594387628
2 26.793431370708554
1 3.8444812040865823
0 3077.796754531685
0 259.41899621203083
2 0.03618551811585246
0 2.2128868620875752
0 5.9986455774609455
0 194.6239228307618
0 23.24647615492333
0 13686.164410774782
0 3.5090065663490595
0 4.307507194179784
0 14.723197577754037
0 31.97731306002143
0 17.195392815787127
0 7.899228630161336
1 13.33608402731422
7 2.439091277791535
0 4.330140847349587
0 331.1204399898673
0 40.58144901664867
0 756.0831360365604
0 30.77881949446217
0 4.2638443749491595
0 77.22511217057806
0 113.23251248732016
0 11.724496589197233
0 76.65209834165758
0 10128.318935749758
0 64.52438028878319
0 863.265670321049
0 15.61071256722849
0 15.684418339509469
11 10.760616276238089
0 47.11646422563354
0 8.618112737134354
0 1.6751412031412654
0 31.05741604699228
0 8.552129782095978
0 5.313257134493488
0 1.9223499232926564
2 0.22056678834892385
0 11.77145567983618
14 1.6866263191584026
0 30.788301441288148
2 26.1460134090039
0 16.64530805013417
0 67.7174897193928
180 3606.590415806919
0 124.17305028146173
0 933.7067942625272
0 538.7990464561536
288 4860.960720502338
144 13205.931926971069
0 1.6081491426570862
0 0.025440873050676646
0 15.96006401369579
0 51.71742995853553
0 88.16651789841161
0 2.157274971279878
0 20.13621558668071
0 274.7967509267876
0 147.3110981716998
0 45.37757388754028
0 61.5844057914978
0 0.31569116985947404
0 0.18363924147037508
0 86.68046411743258
0 196.10615939040417
5 6.4310424644128075
1 0.6329615970337987
0 3.3012454661611224
0 2.409844074324587
0 0.7872059016406849
0 1.3420870370352023
0 6.09387072706823
0 15.92050669815406
1 165.55286761262346
5 20.36620245159186
0 0.051164347008705265
0 1.4075315493092548
0 53.14056718517889
77 321.32411479846655
0 0.08679522328460658
80 5.50550628789977
0 108.27726663106296
0 50.91128651148089
0 1.2055099105272666
111 25.37542237281788
0 5.2516922845694545
26 7.2075625393951634
0 3.299173130509383
41 148.36624258363537
0 22.231944457724826
0 8.608060167092484
20 852.078655410499
56 432.2288457771882
0 76.66863264161691
156 583.0065791313432
67 46.12265169496704
10 293.7766289625895
126 86.60760684705352
23 222.94902514490835
3 84.46472706356127
0 95.19260796442065
0 0.010345338294284868
0 22.353705815318772
1 387.382282048229
56 44.308134189700354
7 1.7519989750417488
0 13.2872486304673
3 81.26509691927541
1 15.420136350208736
2 7.189304490567658
2 90.29605628939116
4 33.11608401006534
0 536.2624564827048
5 19.093939482424176
0 3680.2669590625483
7 2856.418390871433
7 374.35919945299537
0 330.501725550057
0 11.570548547879143
0 109.47782774362712
0 30.37041194725367
4 663.6886065951738
0 170.80047439614322
0 42.96286405268641
7 131.18711673739898
105 326.75070373383596
0 28.35993482561726
0 26.52924911704741
0 53.97830317168347
0 16.021535562008918
0 150.66356301606746
48 188.35793303260775
8 101.28016970211516
0 123.96441882776357
0 22.302465992817197
3 67.06474325418435
1 100.11295912750076
0 886.7366558151235
1 51.71944907141374
8 95.22555386753167
3 187.31295456421785
0 29.541016347958298
0 12.622654474884824
0 0.2841314880387048
0 25.26517088694883
17 5.891173977078585
2 2.7330059044215753
0 4.8250289290401485
4 1.1629379243910851
7 4.8415046945661135
0 168.35928883827086
0 95.47559703999792
0 45.871865529240914
7 17.6361857530834
0 39.52349646417869
0 3.5486658310904073
3 21.26545601621591
8 0.4035242620483186
4 0.07495777704714733
7 49.97858276796902
0 28.532955032409536
0 32.80087940514442
3 25.66865782771306
3 108.44383733727406
0 20.64534790923062
0 0.007772471433882356
2 1.0350255622401787
54 493.19219522352427
0 4.288296766662674
35 0.012240929219965897
3 1.6842380738989051
6 1.4314602085658403
58 90.75447436946683
6 6.1383540485057315
21 19.91644753743054
11 2.491471685223335
74 86.28775935509263
0 23.28677150854917
25 460.03892724495415
0 8.18609843374217
0 17.289242148579998
0 0.3588491877750357
0 13.155898066293494
0 2.6170220506006143
0 7.535138928653276
0 5.388007465584616
1 7.13325831972991
6 21.84012240946643
0 49.38042915062016
0 47.19089564996356
6 18.080561305985036
0 12.745394627601804
0 3.7403026452097343
33 1080.8528707181954
5 10.918724727524802
11 171.3712703389057
1 0.2293769195139321
7 11.80447117016643
0 13.355719107136654
78 161.32165078355433
10 173.5031308130175
13 137.75745841348203
6 135.66232258989848
3 4.071468759751421
0 16.823621044278685
13 141.52119971652175
0 210.9300240707932
8 144.14190506012125
0 4.813977211612716
62 236.64449698847952
0 474.1521666882641
0 106.33512476646156
2 60.16331023993067
0 534.840433829464
0 10.083849867248365
0 18.019024910116762
0 3.5392737981771045
1 23.290550526688097
0 15.844957505501897
0 17.327625753879925
0 1.5876999771599072
0 1.4812556885276267
0 68.07039573678955
0 6408.9502949927555
0 9.86597148800041
4 72.65400191378774
0 88.72317661571682
10 0.14117347687816914
0 115.46087501306566
0 139.48671074867303
0 24.83458848346623
0 9.911997653538089
19 14.127166915763254
0 0.10538214354076617
0 41.06030351865341
0 109.64940295118276
0 4.9233905558292435
25 33.50053279325388
0 1.0257718514218095
0 267.3681071086321
0 16.10483424783666
0 0.14373558050543414
3 18.320286132532672
0 143.2288866548775
0 17.930890487138505
0 256.36172925360466
0 1258.3619101006548
0 255.72620605784672
0 1629.74586893324
6 202.92183345129348
1 140.5573492532963
2 177.79087480718027
1 3.5510945699230008
2 0.07771177096515387
0 188.37468676874613
0 417.1711505664894
0 92.71336724016861
1 0.2457615267768367
0 229.40452566161892
2 5.535910475158723
4 14.917802968395968
7 34.545106695629386
6 149.59654878625892
1 52.564429338992866
0 23.42335493660556
0 93.49452303800688
4 10.14757279203288
0 463.82152629762123
0 15.210323732191005
2 1672.3212527457217
15 54.7555015572317
0 6.245108989480432
0 350.9116327026859
0 326.89006368214024
0 178.05165705074228
9 0.13951050250243568
2 2.720576816806532
0 457.01201550822736
0 8.085921279860917
12 104.65743311793568
0 80.16792308199733
0 96.14156785490522
0 1.4997548258915654
0 14.642136815572245
4 0.7286858524833011
13 5454.994498992549
0 51.75536074776795
0 12.798554287764853
7 19.4052295108794
0 538.5407470777658
0 0.5914834155141958
0 0.28976181717553345
0 8.86904674623148
0 681.9636738003485
0 1180.249585652949
1 41.82075250786981
0 68.83018956223118
0 1.2620651897921595
0 24.845332735926025
7 1.3178672844354482
3 37.02622222968907
0 7.887688020393549
0 11.7102895214092
0 70.46309286625588
1 1.1327018544733816
1 7.714926678091224
0 17.117335531026704
0 110.59618685966241
0 293.6859567798674
0 12.239156758480709
5 0.13974153477288442
28 31.608086372762667
1 0.6417766218797174
0 459.76269337907434
2 0.07403421164157976
1 0.23597571398355954
0 22.659180496311492
0 137.82788662124324
0 12.195028240740848
0 265.1457451931407
0 308.4926037479001
1 3.1619672820345377
0 236.704572857501
0 2.850462574602686
0 83.70190483117716
184 2748.754626614336
0 0.4860942400991917
40 396.931590732103
0 40.216994154601714
0 196.23095178309765
1 192.12100306194998
0 376.07691555619624
0 460.89925967798473
0 466.40692466719264
0 1.2597609891090542
0 67.62934127390311
0 307.21358721751574
0 963.5056654334742
0 36.62626775789073
0 7.798797684554143
0 2.539077106017745
0 145.37216906152972
0 83.07827507906939
0 947.8533194107052
0 970.3186975134896
0 2275.8739432235307
0 1.4993676646057852
0 119.21451658461014
0 1088.6787248708972
0 5.910771783695043
0 699.3971659475541
0 1182.1666310955413
0 6851.496114074916
0 27.553102455221936
0 514.5761063190046
0 206.06383132106996
0 1954.5930977829933
0 107.03205767214274
0 0.0063830434728639395
0 89.76811871770079
0 324.57330025673076
0 7.30899013424065
0 730.7256978006641
0 122.75483606334356
0 181.4696597211092
0 194.78376277077464
0 44.596636141800516
194 3413.7246136432436
0 1842.9254734526853
0 1588.1504389781096
0 714.7796758891618
0 0.014003307432302875
0 1061.3935635276375
0 958.6268374098672
0 3.8332568297628313
0 5.811287980063327
0 107.44118362517
0 274.4546736382855
0 114.47264189332732
0 5.906418847656316
0 94.36896305698276
0 95.52666629698224
0 93.07866080039877
0 1665.1174619665899
0 4.533373653017194
0 266.8007004978096
0 214.44327522489917
0 3.727058369213404
0 0.7163787431954645
0 68.86008900182536
0 209.92318679103136
0 304.5595368198333
0 260.9652909001714
0 29.91540487878956
0 0.1568515801430109
0 268.56051856309415
0 23.527206961521657
0 56.56729188623435
0 2.364901075102249
0 827.9591771544542
0 12.529992532021065
0 171.00191414371253
0 28.04744532838488
0 128.62645739288018
0 705.1231298710871
0 187.8775856652981
0 1.2600336549341984
0 4.613822191768769
0 3.2555797192468257
0 42.09578581581337
0 1.0494329250041767
0 4.623667981484856
0 228.12807619572482
0 1021.3137171865217
0 317.98991499961653
0 934.8622005229719
0 28.09117750257374
0 139.00441662615697
0 55.37284649693441
0 1.240322143258195
0 15.85432236932586
0 240.50743098378248
0 606.6414700281366
0 248.440186071012
0 394.04246656153344
0 879.4735429713744
0 2443.7013113955036
0 79.16528902602735
0 21.435328812970557
0 930.8041608746079
0 15.96445335889466
0 2.493908727318192
0 15.315747864676943
0 1671.5171967763176
0 1483.4781937684072
180 3443.003128792047
0 38.09259100158882
0 101.72709558713618
0 729.6138584193769
0 55.45123852616691
0 84.72101351695649
0 2648.67550082553
0 167.23421188760452
0 851.227849837141
0 1103.2440908709539
0 267.9825352102898
0 818.4921470695759
0 65.43876799625137
0 645.5507329708328
0 728.5509700455807
0 76.88908195899731
0 236.80911816110589
0 14.028225255781448
0 226.30985982515867
0 11.502961158752441
0 114.77821387224832
0 196.49270182614785
0 10.176843775796945
0 22.02715243113173
739 18526.37289831293
0 254.34876504480692
0 170.1099904690032
12 100.4671458550456
0 6.306873181773849
0 19.25928367445461
0 40.551849985493256
0 41.045638466125844
0 176.6868566966102
0 235.2994213718413
0 335.9792786089195
0 1573.0286950016057
0 63.96541482991137
0 66.98504316740632
0 82.10365222546785
0 194.93289683218188
0 448.5287484982982
0 48.61336458935249
110 1563.6234492904039
0 58.59046576667373
0 35.94407935017436
0 158.74106672662512
0 0.1754379607740904
0 88.48427926501873
0 406.784139195121
0 306.16199362814586
0 326.95058361903
0 229.8561356821815
0 2126.237920164318
0 44.64974554562041
0 0.7106971604838661
0 20.4347370465527
0 5265.564248369342
0 908.2812478317826
0 757.3602430007293
0 479.7275272185876
0 2.0064902329502945
54 773.8624193314719
0 21.457997913128267
0 0.08216634696870781
0 246.70655498926592
0 267.507507340485
0 6994.487550507215
0 1183.1755774984586
0 4891.892687327687
0 1422.7086138188874
0 76.48805978999974
0 9.501095090821773
0 1129.3813518070187
0 4738.4348599534005
0 1244.0090859721506
0 212.24065162241462
0 413.82063376523257
0 551.2582935164127
0 307.48992437133757
0 134.15620085507717
2400 1460628.0137525564
0 54654.17283409035
0 5.122541477686414
0 199326.53160000002
0 4768.454443951181
0 10098.545792108327
0 35839.388120002994
0 585.2296881044416
0 18.9515040256083
0 0.12484386935830116
0 33.732018895916866
0 89.45866855746031
0 352.9720368372211
0 436.2792931308973
0 227.39465571804172
0 1386.7150464272481
0 76.25283602865082
0 24.25451580552793
0 206.93760204714633
0 33.31079278426772
0 1.6895366528569589
0 14054.356619556931
0 84.01068439532816
0 198.95050845980717
0 48.98483393737115
0 10334.28006699375
0 902.6699704383713
0 238.78592917884112
0 56.83244787790881
0 18.38801601562531
0 570.5515977943656
0 617.316121494059
0 312.24867984206463
61 614.7757110152089
0 1193.8072657263301
0 732.8594831843028
0 505.2478292286516
0 7.55977105921846
0 434.6262344253463
0 191.90393149194804
2 738.841885693103
0 236.34862338685983
0 328.47832289732975
0 55.84810812494775
0 18.753176330239228
0 295.0438186307084
0 914.3731425751696
0 1081.436793316484
0 1518.2453499149285
0 2375.1919014644736
0 2066.6059951942343
0 349.4628154754172
0 53.07364387521757
0 71.34126301324508
0 226.6574724217175
0 116.3780837226524
0 950.6384645013976
0 21719.843258583795
0 33130.73380899264
0 41026.718105263775
0 2527.0249129963613
0 47.46005672094778
0 44.22250000000121
0 835.6637408079181
0 1101.0787821953325
0 2475.2986237954187
0 232319.57541169148
0 15071.916603570591
0 12216.380066070536
0 4902.8092892618315
0 94442.76131950444
0 34082.124911297666
0 3446.6760470962417
0 2320.313913376514
0 1606.2382954137402
0 50390.416272564646
0 1363.712336148407
0 114.06920547260177
0 1143.0289352554396
0 578.1221952843845
0 224.049699384764
0 226.7409523736017
0 246.75036828124516
0 421.24936784079335
0 888.1763460534145
0 5221.492428233686
0 3679.433452141661
0 24295.513220247467
0 5031.665121465462
0 4310.091435005001
0 31546.996295428336
0 12103.531214627492
0 235.91808764044129
0 1788.4487461211804
0 76.71741226539707
0 67.82515722399461
1 61.34044580488776
0 1295.8189516359598
0 2018.624359171279
0 1529.019945378631
222 5747.656841416692
0 812.2844425037889
0 468.4197343325618
0 128.33501734841113
0 632.5423327970656
10 53.14515007842849
0 102.87151958975848
0 1.3531948663294315
0 1.6004659026206
0 243.11560679868072
0 163.1819433447125
0 842.1866854101845
0 61.988730638624304
0 2086.104820065409
0 284.75928043084724
0 399.64446380449647
0 105.2819284172288
0 483.6760161499511
0 81.33256722450297
0 750.1713766512888
2 1050.3346723770173
0 884.3142960722918
0 425.03356418543586
0 4.665691626426439
0 19.73094553133257
0 0.01422723033465445
0 171.36705961257422
0 530.2954967731985
0 10.939360433310448
0 96.56266205102216
0 36.57662664423
0 43.752395079446906
0 250.3395313565802
1 12.641418794705153
0 160.40768249881398
0 217.45829739218377
0 146.3871213772452
43 991.8875062575868
15 472.2069853467375
0 2054.2689816875027
2 1637.6018594969078
0 325.53528613600963
32 117.05755466986378
26 12.74718037848411
0 350.10612567529694
0 344.8737802188989
15 580.0814036889216
40 1959.6006406951333
1 571.5261235597849
1 9598.022834576675
0 4276.570845484888
1 388.36828351113945
4 4033.3318669910386
1 2238.4533662830136
12 4753.6550762014485
8 1119.0183040216034
2 565.5426262022535
15 1387.2724089623953
87 213.07781163483145
22 327.2454059381616
4 529.5574587965384
15 3050.9588959635744
0 4065.127767551438
0 4238.021443367099
5 27.93481210246682
8 285.2685537707847
3 4237.1533806933585
4 2739.971676850463
3 65251.297375965754
3 8526.037618281858
0 1118.194821039336
0 57.07800655517693
3 13.883274308325234
31 204.2775103074065
1 635.2474124409592
0 807.437129940583
17 588.1785457634932
2 1103.9854331168408
1 208.28993872047073
1 105.11915039573888
0 4.3245542984549425
1 57.16274582483823
0 4165.988871683771
0 414.39579947054483
0 45.03211107409143
0 1076.4011004846645
0 714.251984862353
0 1323.3990635217692
0 7907.457194970442
0 2835.7754519961045
0 15.681600000000289
0 13642.506907555511
0 1991.3640145999968
0 1497.076966308951
0 254.69775407373982
0 1006.342641538993
0 152.3577974175469
0 1589.788415710266
0 21844.839278320254
0 546.0350929495136
0 1150.2316548199376
132 1028.6039621461575
0 1895.1866982193624
0 1597.0210168143485
0 1098.2341545175077
0 641.6903160225717
0 8.917419310511812
0 17.736703460460976
0 10.572230022960724
0 43.66665456030458
0 3590.821946104943
0 5.469871469773352
0 113.0428659285439
0 293.79043813706676
0 34.64814025297734
0 147.26175797712236
0 6710.911600023665
0 652.0362250000043
0 451.0712015155815
0 403.24402636604424
0 317.2400721354059
0 238.7072527092045
0 602.1176989182813
0 18.794320590645864
0 48.61466680297864
0 8.543496549906077
0 294.7370343484738
0 7138.687578156997
0 770.0898623799001
0 4749.893795345811
0 5000.712049629293
0 10434.691331656446
0 176.5899032667239
0 2824.3639400582197
0 544.2624718051843
0 1662.5627968460321
0 356.1273016369423
0 91.20208032274824
0 388.667363014223
0 1169.7527224423022
0 5256.281860399856
0 3311.7458412457345
0 1302.2037944254669
0 448.98485357095933
0 1023.8927371840576
0 399.36935887120814
305 1583.8927150021905
0 7979.793259676454
0 803.4653002201595
0 6982.45230856536
0 4422.905283062009
0 2850.2205291614227
0 1787.0476979375512
0 4547.5968583473905
0 8944.076780385612
0 193.7777679401681
0 33.66348163533765
0 931.5388949923504
0 1692.6988777404806
0 817.4264020008899
0 1561.2616281590324
0 1403.7241424363874
0 1249.338318038473
0 1185.1190340636501
0 170.65582320501937
0 8.516336955285087
0 513.6828581171079
0 2594.09170261384
0 489.30692898645583
0 6785.795481230154
0 68.40020913081757
0 4868.549602905331
0 386.09592306476134
1 74.97221813135775
0 417.6131476631642
0 4.596511971479519
0 145.67888863623253
0 835.1377515624971
0 295.0910400546315
0 1511.416914796878
0 60.24160610300423
0 1064.244629945589
0 434.0808969430955
1 503.2791637692505
29 409.14173145178887
41 308.6463504082577
47 97.8601071586842
1 224.8800269833998
3 273.5635238877284
13 11.300110648347193
3 294.50494027871184
16 448.0076069707393
3 835.2348361221334
14 216.62500016546807
10 94.5498896904238
2 5433.680226221681
19 395.6708592617593
83 94.45346092332856
12 235.0973103153782
56 1167.073070070742
2 2146.9922369366977
1 37.01550457753117
27 129.95778736293323
1 929.6034021932288
5 763.0577387619627
1 1029.0093927791172
0 918.785196984312
24 822.1576876698738
2 193.34644497931004
21 2.3341401654855805
7 76.23624004352314
10 858.3368542426273
37 1033.7740328361244
0 944.8558362733093
0 76162.95996240288
0 12571.813193106158
0 1933.3661064121977
0 247934.28489999982
154 2704.252531530586
0 989.0302624407373
102 1324.443998490764
13 531.6390461371249
14 1356.9973591643952
23 1534.8208395062009
16 1271.8213069260478
37 1379.129578249501
14 2343.1352579681634
39 78.09558085814038
14 17.12319957945534
33 1240.7361699349742
10 481.8239357852956
5 213.49190839884375
1 4006.260270105632
3 1883.2290047769739
5 429.0637881518919
2 4173.4320625394985
1 851.9169258252173
27 225.19684479218208
8 1956.152092182256
0 21583.581073297104
5 2710.863373123375
7 245.1888822056353
0 2884.9107028879225
2 60396.358810846825
11 1219.7916928325437
9 1998.6833885316985
16 2141.72021588817
38 120.83823647417196
31 31.678436124707154
0 3867.269973769784
0 22.711681940926265
0 6.175522281410005
0 769.49700113513
0 926.7252933508172
0 1747.6604745125846
6 40.670824699998484
4 219.84552535934623
0 912.9015226907804
1 2505.690245928989
0 2384.0904245376587
16 14.286831195407729
0 1598.4327082198968
5 3919.526948654432
1 405.01980134133066
11 1260.8956002388993
1 1222.5714562970763
0 881.4358657018671
0 1716.7256968346626
0 535.5809562893171
6 141.3564251415504
3 4099.471672815386
0 196.4273078397295
14 358.6539193509243
3 542.2977636559544
4 534.1102976312037
5 895.1135598290675
2 6730.780321698778
9 6861.930467268718
16 48.296849896683305
0 911.06900711192
11 1659.4257536899872
5 940.14855734819
2 6350.9346360373465
492 14864.239346339044
7 0.002051287153734727
2 878.0622677320855
8 970.5429048485836
0 434.8029309660196
0 363.55698744993697
2 847.8752271185522
37 1283.0217662710356
77 2248.6999302887907
63 699.0592859375325
310 6547.560908755126
19 1175.8398469269664
13 701.295134379413
22 977.3256266266104
30 1435.9125130531306
35 1787.3715238006153
46 752.1083959161983
8 1338.2299614137291
51 1836.961079001763
21 1423.8958620359285
83 1763.0399548788296
38 1615.0671906343148
33 1164.841443227545
0 4995.964899793981
180 1255.797075107581
5 0.026219326114672217
1 24.175083572768674
4 128.54610300600632
10 1607.3239872451702
3 3331.080405682785
2 372.85375428986833
0 115.1664860916209
0 157.7458114242627
25 2.9491521602869817
1 467.06960587674314
0 182.28457561433535
4 3.0810491207612944
0 175.09333815093223
20 307.3772561097129
3 166.42363724227064
6 938.333304176325
0 389.66938315633774
3 168.68511263471316
1 664.2558599470212
1 1117.9261625402057
14 3.4146591590181328
2 125.45328941445884
28 190.40944312037152
3 1394.3467073518998
5 1332.467886105219
72 828.3829776020124
0 1651.1618561306968
8 4697.099266153153
0 469.4725156105977
0 13.426490102006097
0 49843.087175525776
0 2583.180873168974
0 25903.82898719611
0 6270.792393885634
0 3623.302822647957
0 16836.100262574208
0 150.96201779518216
0 6738.0814955663645
0 106249.92160000003
0 1227.3189064348117
0 4517.570122712027
0 5004.43394911581
0 2232.067763617521
0 577.5282511212044
0 733.2101774568573
0 1068.6361000000036
0 527.2646896097673
0 151.38695009730108
0 403.36466318323903
0 3.777580390585835
0 1096.230712890625
0 270.05449793837033
0 33.93210402002261
0 1205.574356596975
0 2056.622499999992
0 94.5052648000968
0 377.05305411702045
0 0.19202144384420217
0 371.1845320595836
0 489.1518400730165
0 657.9544376434409
0 25.246288424733248
0 140.70877001896392
0 0.4381172982216363
0 83.44215889930767
0 11321.92738785267
0 858.096105136516
0 4405.086599144871
0 16606.703563153347
0 2230.6805679631348
0 4182.987312926114
0 4353.175638630339
4 1306.1677163177696
0 2170.1634760621887
6 213.408728765869
2 1545.1068105938186
362 8591.43610000001
54 8969.721892101781
6 669.1243354469899
42 2692.8754547473904
8 661.6268479013444
7 790.3177351766159
0 1912.3075618689613
34 620.7917451637389
2 1250.0410648902198
1 1346.073960798917
12 647.8711110084696
9 43.62750855753434
5 106.45637313796412
1 1551.6741348561682
4 4.500291968828401
2 1546.6974793649913
2 1042.1875492080671
0 230.88157013788887
0 1095.7502916001365
0 2467.8598278354707
0 2305.463435434388
0 1626.8912500798162
1 357.12348790470423
1 36.67699599623796
0 5265.272472015468
13 314.6918784678363
5 1326.300811697989
7 751.767903483158
0 872.1375531685851
4 9197.650080706804
7 315.97345170622697
4 282.36658840971955
0 1752.7906572229629
33 150.35031548553977
2 5889.261419508372
0 427.97659577322736
0 197.292269542986
13 820.5428086199747
0 308807.67800225876
0 35715.383746162595
0 4305.0631098798085
0 1928.958250789856
0 2917.458287745113
0 1426.5705024912425
0 880.8855166824593
0 923.0605537519452
0 2489.0576692912105
0 1311.355864863323
0 5260.220571489321
0 1049.0977080083471
0 604.1721993237087
0 3.5326881955998206
0 407.95165444069113
0 1770.726399999994
0 1218.831217110712
0 796.1398006480688
0 5485.573956389563
0 2215.0694123604367
0 9851.745006189363
0 25836.276272726827
0 67551.01766531523
0 654.2151254439916
0 971.6465411812022
0 652.4958081552811
0 441.11631259991594
0 164.1369782046686
0 781.636694576972
0 1138.0147071649449
0 1403.1446453242097
0 103.66590680035404
0 5797.7646098370915
0 2.94635999229178
0 3.2766236659441472
111 793.373342332828
0 0.11510041885114279
0 77.650668472172
0 32.96174131198068
0 618.3228005085143
0 1460.5005177024166
0 832.2048960307643
0 246.05644764807312
0 516.2545775049198
0 1007.022560519846
0 22.693314062500693
0 714.1588140625058
0 14957.716380968332
0 806.5790501613126
0 1004.1460854838414
0 302.104785663754
0 31.48295182029612
0 2066.6381258175384
0 848.533653409338
100 2358.86595455976
0 73.81538929939013
0 3632.2757303123767
0 894.3336843832433
0 1443.264632220949
0 1319.823000069473
0 879.2236104205116
0 18762.15079220575
0 29156.246170999937
0 425208.3263999999
0 7186.518320399311
0 7.787288119339538
0 2729.282792037894
0 808.1668104529807
0 825.9993002245394
0 994.5600098854318
0 16121.992991260546
0 641.4360047155526
0 106.45192087541491
0 1752.6876857770822
0 609.1750420155604
0 0.8764920623305802
0 1500.5729109010833
0 49.2102250000014
0 1534.2584420334856
0 50.10925459136873
0 19.65848545074423
0 33.39050923178206
0 212.35917934808836
0 3.665126093866123
0 7244.441662338578
0 1163.0340001665206
0 751.1235237919698
0 16629.70276518455
0 467.6452974054686
0 49426.18240000007
0 121.84523284017584
0 4253.056090542684
0 1786.6247300818018
0 1058.162699832061
156 11184.892932865934
0 11692.354026950728
0 8694.559909272217
0 1565.7550245992966
0 497.03033908024634
0 3049.310077924201
0 557.3223557926183
0 288.80892685625025
0 2931.251291249528
0 94.21235542599068
0 4.78087940454644
0 4106.850790035949
0 2398.501079319283
96 1619.0784419065658
0 300.4988604281187
0 322.35539551453695
0 3006.915647107596
2400 3193458.3418992916
139 761.6234885383217
12 30.76631910252675
39 249.5326787732649
53 6.494969222694635
47 1071.8546459421077
0 11.636193497681573
0 226.826120700628
2400 3914541.3904000004
0 1134.1594532754402
0 156.8501846252455
0 60.22175856788835
0 2585.9767562499965
1 659.2276896377571
0 1074.6854232165865
0 3943.5520697085963
0 456.7839127868825
0 375.88500152931425
0 2329.730344994564
0 16.458759707249886
0 764.5116317524953
0 195.11259121009212
0 11.418211873346538
0 41.65328404321618
0 130.67774657113722
0 1568.0320470437578
0 7959.469564019781
7 10378.983220598715
0 73.74817532386827
0 769.0164379457681
0 222.215650140978
0 1630.8097988846052
6 3.1965070549700085
0 173.96291347009208
0 1087.2267710136505
0 577108.6354048718
201 10766.085986048187
0 5261.545904215658
130 2571.1367797700946
0 208.21137209472565
0 99.4302085077508
0 4924.2330367835375
0 1851.0081717661105
0 642.6593867597827
0 232.21741814431897
0 238.67187256453136
0 7572.016413748263
0 48816.25178329697
0 4202.428761559388
0 95726.71027663896
0 219.30956139851105
0 2235.468350937853
0 2317.7005413207944
0 1234.7089320695497
0 355.09399890618937
0 7194.856920422397
0 73.76671043703571
0 1326.1945193627366
0 5882.8853186044535
0 59842.206442599825
0 1282.3150097529974
0 1924.5273109395537
0 269.3546495456833
520 119246.36229316803
0 1064.9438323910226
0 5581.2021662507095
0 699.0086906532106
0 1821.178051323313
0 3420.0067727492487
0 39.27334550432905
0 3031.3392108977196
0 341.21647967398167
0 1135.958603892803
0 1495.4099682751337
0 6565.065658944146
0 7629.020012544939
0 202.67891240084464
0 3854.072943385212
0 4.95481949160095
0 4.219152694725915
0 51.80941857397556
0 3828.590098933944
0 30.338069378905285
0 277.88885930176264
0 1412.6755361718097
0 309.679567721941
0 514.2558294667264
0 1623.8948027404765
0 6480.25
0 7344.489999999969
0 93.9045221615055
0 179.83947707203166
0 1793.0484718773102
0 4554.4964212002815
0 2184.7621393271834
0 1992.8529722219625
0 12330.41511827124
0 186.9651630775705
0 253.55943838236232
0 364.9735061095286
0 1168.1818197489838
0 9745.815547289369
0 390.19368748116574
0 4067.903348451229
0 126.81242489669523
0 998.8610944710737
0 62.6553219046729
0 87.10897679258836
0 717.9615909497737
0 9211.647115670516
0 3929.696676793125
0 1572.2446903929624
0 1227.3001754236725
0 506.7879235805591
0 2254.0745236749817
0 1147.2758412323888
0 1559.5574767642097
0 70.02322787513839
0 8180.464077209874
0 825.5705858506179
0 609.695593426978
0 0.05677562716007016
0 922.8683032287603
0 1261.9601006124926
0 926.5176501892132
0 47003.97399255466
0 1242.4945138694313
0 49.62309875343027
0 1390.621303024675
0 429.2092930657994
0 435.799644371205
0 1581.4828917024872
0 877.2333996956609
0 7128.573415946901
0 1910.5190670134089
0 136.86657815038944
0 3785.264115270631
0 6075.3450992794305
0 6378.3383797481565
0 6188.103579455217
0 1942.1348817322018
0 4409.821410234925
0 2939.398322602323
0 70115.50959326714
0 30421.561820018294
0 9595.585950137116
0 524.5548122419427
0 1217.246309473543
89 765.3374524779764
0 1612929.0278161517
0 36584.85171470268
0 189.74396624494295
240 9651.64349209406
0 822.602337810606
0 448.6529015515375
46 691.1595429030208
0 2156.970889736565
0 1197.4324398145468
0 5.288253806235023
0 2153.3010325469345
0 190.97748710751975
0 55.17395809665322
0 5547199.434434034
0 463.88273072076584
0 757.0925899128043
0 1263.2954252631791
0 758.8074563795334
0 0.0008543061256371475
0 8851.374626480387
0 21.06333769591033
0 733.2996574215504
0 1056.6722406760466
0 1548.0244142612437
0 1945.768560956243
0 123.25966503807444
0 1175.8908678162024
0 83194.74992918709
0 1843.4932614672778
0 4147.179977539511
0 1778.4571569961456
0 21.330449789895034
0 3539.9920164188147
0 1904.2852610161465
0 4263.352457554373
0 43609.06343087204
0 68877.55230499305
0 7815.814829666657
0 1643.7766344888214
0 995.9215135295068
0 955.3377718860285
0 9.553713520145925
0 302.58504823077016
0 2133.2736544954887
0 45.59520117797827
0 78011.74807942836
0 5683.102701289969
216 9010.09201969521
0 1024.6467134048353
0 1962.98014531604
0 118.87350643943596
1 1064.4581700168644
16 183.5985302948964
0 610.6393005883813
0 846.9982084544941
4 2908.212384188329
30 5344.615172265617
0 532.6036848518593
20 1062.5503706899253
0 1398.1417721840323
9 2398.499510007434
1 1823.928470923449
16 1541.243844543981
34 2494.406208727509
36 1150.4008223637347
4 446.51946021831645
14 1064.1181567824501
2 3300.5253622221985
2 838.317730491196
0 1076.2256107190624
0 3122.1815061096213
2 7368.860616385479
10 388.4848699222586
8 1455.310268887319
3 80.64891763213298
0 9795.80633031946
0 5.22832898948352
0 13146.34683754502
0 970.8413050469754
0 774.3694844970931
0 2160.302910456101
0 12.6783546450751
0 356.9964840643147
0 176.63967456207422
0 1290.9716544277808
0 866.8389545322412
0 3051.8794669236104
980 4404.542757665955
0 540.2525066135037
0 59.7911786871185
0 3974.4017487842807
0 53.55761565960848
0 210.55901727061791
0 491.681631164289
0 823.8842409422102
0 643.5316088962738
0 104.50369911432361
0 8392.036041471942
0 2071.4309911324167
0 2148.7284211502238
0 2054.5851334848903
0 22856.413319310697
0 326.6621158285679
0 7595.031009797007
0 1094.890419460832
0 437.46071384069575
0 217.63402321129223
0 2070.802790802402
0 14.35024245515397
0 334.71158089929287
0 528.4144931568163
0 2466.446839442266
0 2530.5831998142444
0 0.4304013462304115
0 18.004607010269318
0 316.0546103611221
0 210.39785801735505
0 231.67797887384617
0 206.32089098840143
0 125.52680407434268
0 1207.8666664901716
0 1632.790916427634
0 360.6238089939069
0 633.965271503476
0 415.95557686779654
0 1637.9671327561289
0 237.4144915756725
0 936.059001549278
174 2231.2094189626373
54 721.8416153633614
0 1196.9655980339749
0 8787.554233414075
0 1870.2867069437257
0 1156.9547765313444
0 867.8339214196103
0 2207.525930808713
0 840.8649883291869
0 3197.996348009079
0 1348.274641645021
0 5166.207246649956
0 6999.776666321201
0 261.99595361480743
0 4676.0322467921405
0 29329.275135967302
0 1464.4569119824666
0 836.7131793955341
0 857.1803022169554
0 1336.485391510982
0 2475.2814971536563
0 7311.296869752154
380 22198.00400428148
2 1849.1739567280576
53 1590.568627176292
2 6986.267343386222
4 42.7707218306793
0 716.7584225492476
0 315.1896359309884
8 1863.2984237178873
1 1209.3160343813652
0 3073.4068853552467
0 932.0391602329264
64 2870.4978197519467
0 1217.8127156309154
270 1600.6177567607049
0 1616.7487793590428
65 999.7845666076889
211 1370.7131631904256
41 1645.3243038653766
2 2184.460144835023
20 942.0358506208644
189 1447.5597103519476
0 1552.1657475323425
0 1290.146166204581
90 2023.5427884957037
0 1785.8649894631524
8 763.115805865862
298 22377.666796980116
2 1231.8117135453726
0 1208.6238976795441
0 4125.960682033901
120 12625.158309339646
187 4262.608891956933
0 59.47147214441783
0 1645.1489515570997
13 1512.0775913329664
1 4940.149045590311
0 108.17533648111782
2 7664.678465827001
3 12853.092362247497
2 198.09868377662264
0 5557.235662269616
0 3995.4822635674377
0 3421.5087925793177
0 2744.626148329165
0 1815323.924308679
0 23.427642805763778
0 21.69625637869459
0 1044.0993128973853
42 53916.84000000002
0 3951.298876877128
0 33905.72609700276
0 226534.7469951063
0 763.68793296739
0 252.49912175292084
0 741.8217589199073
0 1915.3625100919064
0 28.87042635270988
0 822.5943553125917
7 56.421920713668754
0 1122.7896144110077
4 1099.3657316951994
0 1359.2998659406226
1 2270.1698501809706
4 36.47633583444556
14 793.1329380932848
198 742.7247332315451
20 1330.188405594735
26 1975.9763536777548
218 1885.8629643731836
5 973.7471492248517
22 74.77060055566572
11 318.67087463870564
4 21683.44615280176
59 2212.8282098762797
11 635.1020786654977
14 55101.30191366112
20 866.930819858463
20 201.27859250651332
3 707.553327286239
0 938.3321823910236
0 843.9409406232862
24 1761.1891918875665
27 1273.3945261512545
11 838.2475743316938
43 1406.541152763961
0 522.6158774850384
0 131.8147849169297
1 2709.6383854509936
20 245.05796611402184
463 28456.990493338868
521 44797.133424989144
0 240.85558499343432
18 1237.1700185852985
0 3578.5918828315885
0 2975.0513583173915
0 1257.516051607551
0 5189.1682015336
0 1798.3667562655837
0 1305.8683971711325
0 387.5591329610397
0 7.253421975159547
0 739.3959416519135
0 439.3218046875208
0 217.70101935582744
0 57.17840894165033
0 181.0688243454904
0 114.63615281446148
0 163.41618068772598
0 666.8049105878409
0 597.1141466334824
0 109.91266139347812
0 449.2417894364874
0 2945.3839463701515
0 184139.51979256552
0 887.8442300289317
0 778.6040298203824
0 38.73462341739077
0 387.91139311295046
0 15.264616568865204
0 15.207217473462265
0 14.956933075338956
0 10.23753139879721
0 8404.984248561952
0 71.55900143337792
0 1.0198990455422503
0 98.21610848845457
0 2567.0191631497487
0 24.972822331680337
0 1966.9346269718205
0 3043.600135443903
0 162.39862164431167
0 876.0841949991068
0 95.95210483627166
30 1074.017513693977
2 155.54297691827293
0 481.8809572953226
0 333.94086949557123
0 658.567101535858
0 20.809561948791497
0 90.50756020696252
0 2380.1058119201616
0 2364.938044071978
0 81.36557513112069
0 2142.12121900356
0 10142.302484302716
0 0.11390295412538595
0 99.89211895525638
0 5503.778001940199
0 5075.523483421225
279 5617.221280909158
0 1618.9362657480979
0 473.3979427442797
0 9242.762525898816
0 106.62034669961986
0 23015.544826562433
0 18.44094371416553
0 10988.830348916239
0 5969.554550675876
0 974.9823006003196
0 2869.673752784729
0 641.8378551385513
0 1131.2187927665764
0 409.92181016522073
0 25.545768825745213
0 257.7377045036838
0 213.24412939310008
0 2566.388106469737
0 565.5335689683445
0 216.1551787423153
0 18560.88391292865
0 234.24676158716875
0 4.136878911866118
0 1873.8761390534369
0 75.19354039786114
0 39900.77547803851
0 24606.664990248075
0 1068.371787048717
0 16.982830147987528
0 432.47162576010913
0 2351.7501071281636
0 29.561547745996517
0 0.019181167984026425
0 145.20644216542686
0 7.133489801025196
0 116.99934470129432
0 40.743864004075625
0 1889.2301276421329
0 2077.5624394370634
0 2843.278526617936
0 8036.594808100393
0 290.94856156840996
0 1989.4226434347424
0 936.8528884539462
0 1330.1693060784378
198 5848.7318043993555
80 1212.7381037586406
0 1035.8409873393791
0 967.8758679203498
474 39446.02180427462
4 24.07673942897447
39 118.82868188667972
18 1444.6261030094429
51 28.58686620009114
2 206.6286577050099
3 27.746157588101685
8 1094.1554891693997
0 5425.49959729891
1 170.78064483441358
1128 55438.840884878635
8 882.4814511344484
24 1391.9605428099733
4 1586.1532331433884
26 2033.4845462691144
47 806.1567925919542
8 1991.9798580337533
1 1727.8390937783774
0 2196.677838539527
0 1645.9753157425089
0 2310.340801924826
0 3810.031684044098
0 12577.70847451214
0 8560.567512293843
0 1065.7463958100332
0 64.51776171197811
0 893.1381050194641
135 1810.2161675336777
0 3382.0620950612747
0 2956.640359497082
0 2481.533981762701
0 3214.2935425602877
0 4941.593656017513
0 24694.55179230955
0 103.85309232109948
0 859.5626891219615
0 961.6037092861528
0 205.7886911779642
0 18241.084895115055
0 1044.927406607653
0 1646.1598498878732
0 58441.452418315916
0 7.014195327783209
0 177.73068888246772
0 126.04798491821413
258 2089.633051518958
0 1522.7021794601098
0 5999.291585641157
0 5146.679531063615
0 2237.987602344453
0 115.63485598786616
0 177.19009152293947
0 1269.964760823067
0 554.9631679931658
0 912.7947136841374
0 1998.5875585591832
0 2770.166821042422
0 40.08563853973219
0 1821.4883093205256
0 27063.97868800737
0 1582.237270030977
0 799.0208460043099
0 1419.0931632092404
0 2280.7332176533505
0 2432.053263494545
0 2.4796695561293656
2 61.37960256207318
15 0.9905910843149099
6 1016.4540702705415
0 589.685514673629
10 806.5497383138917
0 304.99505657018864
619 61354.24018222507
0 10343.878221846204
2 60.30377514439907
0 13.40881893336902
20 1321.4623216308962
2 165.22704828188282
603 22533.61258064843
6 3556.726337669586
0 2003.5397774051712
15 90.08885495603283
0 98.85677741694518
0 283.04718958597687
0 3178.946111821383
3 78.69957470476729
0 2922.3848779821515
1 208.72076813150952
0 978.9559324799504
0 763.0495785214007
12 199.63827201654772
0 2927.3906528196594
0 740.4975014855258
15 10035.739395205028
4 4039.4353954773796
21 4636.613160017995
0 4521.474678458986
0 152.6667179131554
0 963.6994076206738
0 12702.229917778835
0 5979.542256249981
14 1797.124211495975
33 2452.0008796872407
257 879.0875930770375
6 915.800657225918
0 438.72575217285083
258 916.9583825089828
12 686.5901336964512
0 1411.4623405551893
27 10110.48317658846
16 1111.385976198216
12 326.88772422009174
205 6203.009731030052
294 847.5241519702919
319 1147.454818691898
208 761.201966188199
1 2296.0229907846015
77 3173.330683121324
7 853.4862684757477
0 40540.479522352376
0 889.8280989015475
0 228333.3813099728
0 36.22814351692796
0 37067.800900000075
0 285.62617405710495
0 755.6084247043187
0 854.7647380552812
0 476.1123999999972
0 181.53253124371048
0 35336.25919341259
0 81503.13983889998
0 6015.202540082946
100 2137.627689340499
0 851.1447264527292
0 1991.1290432243056
0 1330.394680203131
0 482566.4089000001
0 2464.4106205850017
0 9725.628477835902
0 1304.8711642763599
95 2000.772121920852
0 5763.386737289808
0 104.329541499437
0 2003.9781217933157
0 1450.3915859775836
400 2675.8793945202938
0 4014.8593116366856
0 1289.6225232860481
0 1283.5032916970385
0 953.8491856376952
0 1079.2452335978273
0 889.4346483943664
0 1011.0505607222848
0 9005.949760842923
0 1109.8451212908085
0 36.54031305716104
0 672.7396900928018
0 549244.028481299
152 3072.478302805055
0 1809.5440053102764
101 2029.8483636720778
0 1845.459196464484
0 5743.125028263254
0 1819.7263946049648
0 21957.261662126468
0 854459.8968999998
0 764697.7808999998
0 14312.72979392444
0 4124.744884138673
0 879.4108438300616
0 920.029379799021
0 953.8879753843308
0 1645.4348477125402
0 2276.1764259180413
0 73870.89099857815
0 8117.455243364589
0 3403.049986454974
0 1667.6021305286836
0 4173.036273622162
0 767.0966075549202
0 1066.3205636786865
0 1203.6461248993874
0 1285.8389208183357
0 345.79463597607906
5 32344.82380383031
5 10495.76888728625
0 1488.2123926354961
0 11232.867576746683
0 2643.591411195343
2418 5737268.853606559
0 3069.3953463083403
0 5830.037930397041
0 20321.262588162244
0 11221.729729177914
0 35112.05308392104
0 18119.973121033374
0 14899.648540859269
0 831746.2800015621
0 26328.491410477087
0 28920.76190623676
0 61714.1121109659
107 764.6588996990022
0 1598.1363584272044
0 1724.4705498894878
0 891.8140359408209
138 5425.519372895957
0 1897.0711752211178
0 3294.8580263638787
0 4596.97858881311
0 1166.8950084224657
0 729.5135914029206
0 708.37628900676
0 741.0561321647763
0 839.0655707445871
0 2057.9096847390324
0 5811.140943283446
0 737.8556526694413
0 8944.160247831893
0 2615417.8468360594
0 3347.353715352128
0 1082.1543493256086
0 113.30041928123264
0 184.75545892382289
230 1919.101915880228
0 5371.759331829433
0 88.33115518648876
0 1327.304686291156
0 3935.6100772901123
0 101.03800690419897
0 748.2454364690515
9 104.14591170618516
0 129.62153267491107
0 362.8614804072451
0 15656.532005527612
0 965.000930523992
0 1857.2960624898944
0 1140.126798405812
0 1045.057824786291
31 948.926590977968
0 1049.820434463528
36 1613.1864326797445
0 2062.3767576431333
0 3866.6321467470375
0 5579.298893764017
0 2509.3119999488827
0 3322.280100993365
2 1055.3231678846068
1 869.3113091733583
4 1148.1645602558117
0 736.3743415476406
2 1166.3142966061216
0 710.4815413160957
0 1592.6606819511653
1 1815.0831545214744
1 2184.322534015012
0 7938.060846776028
8 785.8043572908629
16 1198.026761810841
32 980.3509571457869
8 2184.17494381142
5 1210.1942766094448
7 1094.942929693601
0 2346.4833884477084
181 710.3762878842949
0 1528.1040668621322
0 2354.8557164941753
0 882.0563014082794
0 1062.364893052733
0 1880.7836251699252
0 6123.7147280612635
0 205.4913850594523
0 66.15826636101178
0 95.06909374226376
0 3603.338420087429
0 1156.5551813880447
2 601858.4786448376
0 882.1380383737505
0 2232.4074059529325
0 2464.883831826925
0 404.85802070627176
0 4176.682199913127
0 81.69227118659094
0 202.13536245584552
0 45.48165454695212
0 1621.979412834202
0 4137.343883303455
0 36.56054901445121
0 2727.8967742859786
0 54.79406047049977
0 268.20699263155313
0 137.349615863098
0 80.01582033691349
0 514.6980636482506
0 69.29918221761228
0 841.1395541287143
0 406.2389839267767
0 70.72284384765656
0 68.05035515607692
0 130.0789813216244
133 1402.8282444698864
1 627.1160458469413
0 5.071468812561199
0 10.586162224084276
0 1146.3085667961832
0 927.5507450952784
289 1186.102839720883
0 13879.945077975312
0 63.53376239422637
0 13.592408190800183
0 86.78973922505975
0 44.19342726516818
0 1702.6604950663439
0 4968.541348045456
0 5104.513961543378
0 374.8822507858302
0 38.271033254601626
0 1707.5376062629148
0 1160.2199770546906
0 1521.7180998746785
0 159.06188507294527
0 280.0716242004654
0 4502.174432280552
0 920.8652542911562
3 11872.96319169149
0 400.38236672466707
204 4115.86970278211
3 63.96662544590413
160 1815.758678861619
0 3578.669142733855
0 120.99900634969592
154 1272.3103216547381
1 1594.7052665131832
0 2688.979258070471
0 13909.282123732586
0 1543.639832358366
1 1893.4998223962225
0 14330.920156344444
0 983.1973427407274
0 24.11529291925399
0 1448.6241844225171
0 40131.441788221506
0 151.26955073988321
0 5433.7561715491
0 829.8430802089924
0 276.0589551518491
0 1296.963328360203
260 12529.445181475849
193 8890.898125630392
75 737.7344796110273
0 1310.8603195873209
74 1047.4330946007522
0 1197.0892129604902
0 64.22644995727511
0 9953.448345849507
0 2381624.970711268
192 12999.458986231895
0 779.5575853704835
0 39267.91389943319
0 4863.8613619883745
0 3330.565410455236
0 7396.548270658588
0 181.2369342094666
0 1941.0236159804797
0 52.047277093528386
0 8915.316204617555
0 1.0087789489981955
0 5882.525418490537
0 3872.71252374384
0 233.742666533238
0 95.05055091262568
0 835.1007113390617
0 50.25941097121796
0 598.6184149307197
0 858.3094596882062
0 8.199847573190668
0 1225.0273439025816
0 1659.9763725311525
0 943.213342592
0 323.5235444314977
0 161894.4674455809
500 8590.407398519512
0 1125.8065040545982
0 629.9163380761033
0 382.54821125835355
0 14.645261898710114
0 36139.61769952096
0 5070.042158505329
3 4604.91830088759
3 2540.676823160646
31 3248.8869333567563
0 8840.376957918537
0 4244.135998789221
0 5837.15995483741
0 17183.314988765866
0 2890.9989266641683
2 3174.1019299391073
0 1576.0856384307538
0 925.248859112932
0 1186.141052942054
0 1279.530277128427
0 1367.0220821231924
0 14.126136894894865
0 769.2077446466735
0 1386.5734505415019
0 1703.599022076513
0 957.1009883055424
0 831.2161998916631
0 599.6535588822887
0 985.8842612201925
0 634.6479101496288
0 1380.6361719328868
0 398.3317235720239
0 811.8008531235691
0 638.9393552200955
0 3569.030953431692
0 3580.3809774746564
0 400.9752030396443
0 100.52348604112412
0 13.550037795359367
0 2130.418120005663
0 713.9659672075534
0 521.3339262712615
0 1263.2741655808506
20 11031.238333389503
12 5806.477207090861
0 748.7424134883314
0 4516.5093177677445
0 1495.1636142847096
0 2890.2839456025536
0 2007.3876361458179
0 28.556264193826866
0 7.55699563086083
0 10795.981146583536
0 265.47260503473643
0 4.497050390625077
0 77.4169275000619
0 389.3913082705091
0 706.2025969577794
0 738.2827968199268
0 1599972.0100000002
0 2699.010253265617
0 1114.3675083057606
0 1039.5968325305328
0 29922.305916342884
0 32325.64241847875
0 1723.7123342050688
0 5304.090836399186
0 23525.42365107427
0 186200.00570332154
0 4809.884731564671
0 644.0879530433169
0 5392.629304206124
0 9353.734556140538
0 5488.587225000006
0 29714.09845864679
0 16259.992415071276
0 1345.083203022215
0 730.3279283989929
0 2179.0224000000057
0 2092.0604983675375
0 1344.5105358192736
0 2339.633104760214
0 330.4967323634133
0 635.0620563438532
0 1051.294032796505
0 3.1701559072736165
0 2096.9946453478187
0 240.32803612089444
0 1408.347522290947
0 3.3063065159085387
0 2613.6999717257586
0 1119.2516452747986
0 43782.18805116272
0 78848.8278399556
0 305698.4099999996
0 1518.7521897385598
0 2314.250222873406
0 1205.8679718988865
0 247623.33181174315
0 1451041.8911694374
0 136737.24840000016
0 11049.514295464462
0 86349.7824676649
0 17949.239132621035
0 1431.1672711029978
0 290542.5604000005
0 14568.434600638591
0 5945.027418375015
0 1698.7919429130545
0 552.2166093914551
0 49.339786239720155
0 156.60744296078872
0 82.55124346628321
0 1651.9533116303398
0 264895.5024000003
0 81.30033648004236
0 1125.6346086274111
0 8726.50636202097
0 2344.233272877001
0 460.8315963492543
0 677.6555925171921
0 659.0666638792272
0 893.9943054888054
0 3056.8240094690423
0 277.0285803259888
0 62.03231435511055
0 2475.294615427131
0 99.77834561922586
0 2191.835443758131
0 25910.1776532902
2 7189.554963884396
0 2220.212607979844
0 1645.3509182260252
2 2063.507701830601
0 3554.8923616646725
0 1551.6023927503938
0 928.618303424132
0 2006.0479324379892
0 1018.4897764967043
0 3041.599785891349
0 834.8486832504303
1 6302.5753709443425
0 3796.035174594488
0 1268.317452247672
0 2766.3991572739137
0 21585.976375241455
0 1376.5952345031906
0 4019.754412506967
11 156599.59728745668
326 18020.616683019558
0 3733.4791073885235
0 1908.711676354951
180 4593.416456270815
0 3913.9900363832708
104 2549.8476556408887
8 2.7746055340204996
6 898.173461855057
18 54.51302227264121
245 3849.913539662593
9 1826.1798575557768
11 0.1015859991312027
203 1533.8881891429446
61 730.3337839563383
0 1890.7701637076857
2 65.70883504488498
0 562.836006800672
0 12500.882662364947
9 586.2243488174399
0 8777.35863525735
0 510.27920109273896
1 13663.402802509863
0 6479.828050081748
0 1710.6492970703246
0 1195.5057103159577
120 794.1845839732796
0 8652.38758872277
0 1073.6872566932902
0 17526.564654171067
0 20554.753536318447
0 1694.1363299687393
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
<title>Scatterplot with Distance-Limited Voronoi</title>
<script src='https://d3js.org/d3.v4.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js'></script>
<script src='d3-voronoi-scatterplot.js'></script>
<link href='http://fonts.googleapis.com/css?family=Open+Sans:700,400,300' rel='stylesheet' type='text/css'>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<style>
body {
font-family: 'Open Sans', sans-serif;
font-size: 12px;
font-weight: 400;
color: #525252;
text-align: center;
}
html, body {
width:auto;
height:auto;
}
.axis path,
.axis line {
fill: none;
stroke: #B3B3B3;
shape-rendering: crispEdges;
}
.axis text {
font-size: 10px;
fill: #6B6B6B;
}
</style>
</head>
<body>
<div>
<div id='chart'></div>
</div>
<script>
d3.csv('data.csv', function (error, data) {
var tooltipColumns = [
{
name: 'x',
type: 'numeric',
format: ',.4f'
},
{
name: 'y',
type: 'numeric',
format: ',.4f'
}
];
var numericColumns = [
'x',
'y'
];
var marks = {
r: 2,
fillOpacity: 0.3,
colors: [
'#1f78b4',
'#ff7f00',
'#33a02c',
'#e31a1c',
'#6a3d9a',
'#b15928',
'#a6cee3',
'#fdbf6f',
'#b2df8a',
'#fb9a99',
'#cab2d6',
'#ffff99'
]
};
var categoricalColumns = [];
var options = {
width: 960,
xVariable: 'x',
yVariable: 'y',
idVariable: undefined,
tooltipColumns,
numericColumns,
xLabelDetail: undefined,
wrapperId: 'voronoiExample',
wrapperLabel: 'Voronoi clipCells() end[1] null Example',
dependent: true,
globalExtents: undefined,
marks,
categoricalColumns
}
d3VoronoiScatterplot.drawVoronoiScatterplot('#chart', data, options);
})
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment