// from github.com/usfvgl/defaults-centroid/ function getClassCentroid(data, selectedclass, xDomain, yDomain){ var classData = data.filter(function(d){ return d.class == selectedclass; }); var xAvg = d3.mean(classData, function(d) {return d[xDomain]}) var yAvg = d3.mean(classData, function(d) {return d[yDomain]}) centroid = {"xAvg": xAvg, "yAvg": yAvg, "class": selectedclass} return centroid; } function chart() { var colorScheme = 0; var colorSchemes = [ { z: ["rgb(215,25,28)", "rgb(253,174,97)", "rgb(171,221,164)", "rgb(43,131,186)"], z2: ["rgba(215,25,28, 0.5)", "rgba(253,174,97, 0.5)", "rgba(171,221,164, 0.5)", "rgba(43,131,186, 0.5)"] }, { z: ["rgb(228,26,28)", "rgb(55,126,184)", "rgb(77,175,74)", "rgb(152,78,163)"], z2: ["rgba(228,26,28, 0.5)", "rgba(55,126,184, 0.5)", "rgba(77,175,74, 0.5)", "rgba(152,78,163, 0.5)"] }, { z: ["rgb(27,158,119)", "rgb(217,95,2)", "rgb(117,112,179)", "rgb(231,41,138)"], z2: ["rgba(27,158,119, 0.5)", "rgba(217,95,2, 0.5)", "rgba(117,112,179, 0.5)", "rgba(231,41,138, 0.5)"] } ] var centroid_clicked = false; var isMouseDown = false; var isFaded = false, startX, startY, dragX, dragY, tutorial = false, timer, circle_on, selectedClass, width, height, centroids = {}, radius = 35, // size of point radiusWidth = 2, //width of open circle stroke xDomain = "carat", yDomain = "price", zDomain = "cut", autoPlay = false, playing = false, currentI = 0, rpw = 10, //rows per second to animate loop, pause, datasetSize, drawPoints, drawAnimationProgress, play, drawData = { color: {}, point : { solid: true, opencircle: false, alpha: false }, buffers: { solid: {}, opencircle: {}, alpha: {} }, alpha: 0.3 }; var centroid_circles = []; var margin = {top: 30, right: 20, bottom: 30, left: 20}; var canvasWidth = 900; var canvasHeight = 450; width = 900 - margin.right - margin.left, // default width height = 450 - margin.top - margin.bottom; // default height var blending_modes = { "source-over": true, "multiply": false, "screen": false, "overlay": false, "darken": false, "lighten": false, "color-dodge": false, "color-burn": false, "hard-light": false, "soft-light": false, "difference": false, "exclusion": false, "hue": false, "saturation": false, "color": false, "luminosity": false } function my(selection) { my.clicks = 0; my.startTime = null; my.endTime = null; selection.each(function(data) { //scales var x = d3.scaleLinear().range([margin.left, width]); var y = d3.scaleLinear().range([height, margin.bottom]); var z = d3.scaleOrdinal(colorSchemes[colorScheme].z); var z2 = d3.scaleOrdinal(colorSchemes[colorScheme].z2); var legendX = d3.scaleLinear().rangeRound([0, margin.right - 70]); var progressX = d3.scaleLinear().range([0, 2*Math.PI]); //generate chart; var root = this; canvas = root.appendChild(document.createElement("canvas")), context = canvas.getContext("2d"); canvas.id = "chart-canvas" canvas.width = canvasWidth; canvas.height = canvasHeight; events_canvas = root.appendChild(document.createElement("canvas")); econtext = events_canvas.getContext("2d"); events_canvas.id = "events-canvas"; events_canvas.width = canvasWidth; events_canvas.height = canvasHeight; // generate controls var node = document.createElement("div"); var visual_controls_node = document.createElement("form"); var visual_controls = root.appendChild(visual_controls_node); //point functions var point = d3.symbol() .size(radius) .context(context); var openpoint = d3.symbol() .size(radius + radiusWidth) .context(context); var animation_circle = d3.symbol() .size(750) .context(context); context.translate(margin.left, margin.top); context.font = "12px sans-serif"; x.domain([0,10]); y.domain([0,10]); z.domain(d3.map(data, function(d){return d[zDomain];}).keys()); datasetSize = data.length; z.domain().forEach(function (d, i){ //set initial values for