diff --git a/examples/js/example-papaparsing.js b/examples/js/example-papaparsing.js index 0406937..319d2aa 100644 --- a/examples/js/example-papaparsing.js +++ b/examples/js/example-papaparsing.js @@ -2,27 +2,27 @@ var width = +document.getElementById('svg').clientWidth, height = +document.getElementById('svg').clientHeight; -var svg = d3.select('svg') - .call(d3.zoom().scaleExtent([0.0001, 1000000]).on('zoom', function () { - svg.attr('transform', d3.event.transform); +var svg = d3.select("svg") + .call(d3.zoom().scaleExtent([0.0001, 1000000]).on("zoom", function () { + svg.attr("transform", d3.event.transform); })) - .append('g'); + .append("g"); -var div = d3.select('body').append('div') - .attr('class', 'tooltip') - .style('opacity', 0); +var div = d3.select("body").append("div") + .attr("class", "tooltip") + .style("opacity", 0); var brush = d3.brush() .extent([[-9999999, -9999999], [9999999, 9999999]]) - .on('end', brushEnded); + .on("end", brushEnded); -svg.append('g') - .attr('class', 'brush') +svg.append("g") + .attr("class", "brush") .call(brush); -// var intercom = Intercom.getInstance(); +//var intercom = Intercom.getInstance(); -// intercom.on("select", unSelectNodes); +//intercom.on("select", unSelectNodes); var nodes, // as in Data points node, // as in SVG object that have all small circles on screen @@ -35,10 +35,10 @@ var nodes, // as in Data points simulation, velocities = [], rendering = true, // Rendering during the execution. - forceName = 'forces', + forceName = "forces", springForce = false, tooltipWidth = 0, - fileName = '', + fileName = "", selectedData, clickedIndex = -1, paused = false, @@ -57,7 +57,7 @@ var MULTIPLIER = 50, ITERATIONS = 300, FULL_ITERATIONS = 20, NODE_SIZE = 10, - COLOR_ATTRIBUTE = '', + COLOR_ATTRIBUTE = "", FULL_NEIGHBOUR_SIZE = 10, FULL_SAMPLE_SIZE = 10, INTERP_ENDING_ITS = 20; @@ -65,19 +65,19 @@ var MULTIPLIER = 50, // Create a color scheme for a range of numbers. var color = d3.scaleOrdinal(d3.schemeCategory10); -$(document).ready(function () { +$(document).ready(function() { distanceFunction = calculateDistance; d3.select('#startSimulation').on('click', startHybridSimulation); - $('#HLParameters').show(); + $("#HLParameters").show(); }); /** * Parse the data from the provided csv file using Papa Parse library * @param {file} evt - csv file. */ -function parseFile (evt) { +function parseFile(evt) { // Clear the previous nodes - d3.selectAll('.nodes').remove(); + d3.selectAll(".nodes").remove(); springForce = false; fileName = evt.target.files[0].name; @@ -96,7 +96,7 @@ function parseFile (evt) { * @param {array} data * @param {object} error */ -function processData (data, error) { +function processData(data, error) { if (error) throw error.message; nodes = data; @@ -107,17 +107,18 @@ function processData (data, error) { norm = calculateNormalization(nodes); props = Object.keys(nodes[0]); // Properties to consider by distance fn - COLOR_ATTRIBUTE = props[props.length - 1]; + COLOR_ATTRIBUTE = props[props.length-1]; var opts = document.getElementById('color_attr').options; props.forEach(function (d) { - opts.add(new Option(d, d, (d === COLOR_ATTRIBUTE))); + opts.add(new Option(d, d, (d === COLOR_ATTRIBUTE) ? true : false)); }); - opts.selectedIndex = props.length - 1; - // props.pop(); //Hide Iris index / last column from the distance function + opts.selectedIndex = props.length-1; + //props.pop(); //Hide Iris index / last column from the distance function + - // Put the nodes at (0,0) + //Put the nodes at (0,0) nodes.forEach(function (d) { d.x = 0; d.y = 0; @@ -133,99 +134,101 @@ function processData (data, error) { ticked(); }; -function addNodesToDOM (data) { - node = svg.append('g') - .attr('class', 'nodes') - .selectAll('circle') +function addNodesToDOM(data) { + node = svg.append("g") + .attr("class", "nodes") + .selectAll("circle") .data(data) - .enter().append('circle') - .attr('r', NODE_SIZE) - .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')') + .enter().append("circle") + .attr("r", NODE_SIZE) + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")") // Color code the data points by a property (for Poker Hands, // it is a CLASS property). - .attr('fill', function (d) { + .attr("fill", function (d) { return color(d[COLOR_ATTRIBUTE]); }) - .on('mouseover', function (d) { + .on("mouseover", function (d) { div.transition() .duration(200) - .style('opacity', 0.9); + .style("opacity", .9); div.html(formatTooltip(d)) - .style('left', (d3.event.pageX) + 'px') - .style('top', (d3.event.pageY - (15 * props.length)) + 'px') - .style('width', (6 * tooltipWidth) + 'px') - .style('height', (14 * props.length) + 'px'); + .style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - (15 * props.length)) + "px") + .style("width", (6 * tooltipWidth) + "px") + .style("height", (14 * props.length) + "px"); highlightOnHover(d[COLOR_ATTRIBUTE]); }) - .on('mouseout', function (d) { + .on("mouseout", function (d) { div.transition() .duration(500) - .style('opacity', 0); - node.attr('opacity', 1); + .style("opacity", 0); + node.attr("opacity", 1); }) - .on('click', function (d) { - console.log('click', clickedIndex); + .on("click", function (d) { + console.log("click", clickedIndex); if (clickedIndex !== d.index) { if (springForce) { highlightNeighbours(Array.from(simulation.force(forceName).nodeNeighbours(d.index).keys())); clickedIndex = d.index; } } else { - node.attr('r', NODE_SIZE).attr('stroke-width', 0); + node.attr("r", NODE_SIZE).attr("stroke-width", 0); clickedIndex = -1; } }); - if (selectedData) { unSelectNodes(selectedData); } + if (selectedData) + unSelectNodes(selectedData); } -function ticked () { +function ticked() { alreadyRanIterations++; // If rendering is selected, then draw at every iteration. if (rendering === true) { node // Each sub-circle in the SVG, update cx and cy - .attr('cx', function (d) { - return d.x * MULTIPLIER; + .attr("cx", function (d) { + return d.x*MULTIPLIER; }) - .attr('cy', function (d) { - return d.y * MULTIPLIER; + .attr("cy", function (d) { + return d.y*MULTIPLIER; }); } // Legacy: Emit the distribution data to allow the drawing of the bar graph - // if (springForce) { + //if (springForce) { // intercom.emit("passedData", simulation.force(forceName).distributionData()); - // } - if (manualStop && alreadyRanIterations == ITERATIONS) { + //} + if(manualStop && alreadyRanIterations == ITERATIONS) { ended(); } } -function ended () { +function ended() { simulation.stop(); simulation.force(forceName, null); if (rendering !== true) { // Never drawn anything before? Now it's time. node - .attr('cx', function (d) { - return d.x * MULTIPLIER; + .attr("cx", function (d) { + return d.x*MULTIPLIER; }) - .attr('cy', function (d) { - return d.y * MULTIPLIER; + .attr("cy", function (d) { + return d.y*MULTIPLIER; }); } if (p1 !== 0) { // Performance time measurement p2 = performance.now(); - console.log('Execution time: ' + (p2 - p1)); + console.log("Execution time: " + (p2 - p1)); p1 = 0; p2 = 0; } } -function brushEnded () { +function brushEnded() { var s = d3.event.selection, results = []; - if (s) { + if (s) { + var x0 = s[0][0] - width / 2, y0 = s[0][1] - height / 2, x1 = s[1][0] - width / 2, @@ -242,23 +245,24 @@ function brushEnded () { results = sel.map(function (a) { return a.index; }); } - // intercom.emit("select", { name: fileName, indices: results }); + //intercom.emit("select", { name: fileName, indices: results }); - d3.select('.brush').call(brush.move, null); + d3.select(".brush").call(brush.move, null); } } + /** * Format the tooltip for the data * @param {*} node */ -function formatTooltip (node) { - var textString = '', - temp = ''; +function formatTooltip(node) { + var textString = "", + temp = ""; tooltipWidth = 0; props.forEach(function (element) { - temp = element + ': ' + node[element] + '
'; + temp = element + ": " + node[element] + "
"; textString += temp; if (temp.length > tooltipWidth) { tooltipWidth = temp.length; @@ -270,7 +274,7 @@ function formatTooltip (node) { /** * Halt the execution. */ -function stopSimulation () { +function stopSimulation() { simulation.stop(); if (typeof hybridSimulation !== 'undefined') { hybridSimulation.stop(); @@ -282,8 +286,8 @@ function stopSimulation () { * @param {array} array * @return {number} the mean of the array. */ -function getAverage (array) { - console.log('getAverage', array); +function getAverage(array) { + console.log("getAverage", array); var total = 0; for (var i = 0; i < array.length; i++) { total += array[i]; @@ -295,11 +299,11 @@ function getAverage (array) { * Deselect the nodes to match the selection from other window. * @param {*} data */ -function unSelectNodes (data) { +function unSelectNodes(data) { selectedData = data; if (fileName === data.name && nodes) { node - .classed('notSelected', function (d) { + .classed("notSelected", function (d) { if (data.indices.indexOf(d.index) < 0) { return true; } @@ -308,33 +312,35 @@ function unSelectNodes (data) { } } + /** * Highlight the neighbours for neighbour and sampling algorithm * @param {*} indices */ -function highlightNeighbours (indices) { +function highlightNeighbours(indices) { node - .attr('r', function (d) { + .attr("r", function (d) { if (indices.indexOf(d.index) >= 0) { return NODE_SIZE * 2; } return NODE_SIZE; }) - .attr('stroke-width', function (d) { + .attr("stroke-width", function (d) { if (indices.indexOf(d.index) >= 0) { - return NODE_SIZE * 0.2 + 'px'; + return NODE_SIZE * 0.2 + "px"; } - return '0px'; + return "0px"; }) - .attr('stroke', 'white'); + .attr("stroke", "white"); } + /** * Highlight all the nodes with the same class on hover * @param {*} highlighValue */ -function highlightOnHover (highlighValue) { - node.attr('opacity', function (d) { +function highlightOnHover(highlighValue) { + node.attr("opacity", function (d) { return (highlighValue === d[COLOR_ATTRIBUTE]) ? 1 : 0.3; }); } @@ -342,12 +348,13 @@ function highlightOnHover (highlighValue) { /** * Color the nodes according to given attribute. */ -function colorToAttribute () { - node.attr('fill', function (d) { - return color(d[COLOR_ATTRIBUTE]); +function colorToAttribute() { + node.attr("fill", function (d) { + return color(d[COLOR_ATTRIBUTE]) }); } + /** * Update the distance range. @@ -357,24 +364,26 @@ function updateDistanceRange() { } } + /** * Implemented pause/resume functionality */ -function pauseUnPause () { +function pauseUnPause() { if (simulation) { if (paused) { simulation.force(forceName); simulation.restart(); - d3.select('#pauseButton').text('Pause'); + d3.select("#pauseButton").text("Pause"); paused = false; } else { simulation.stop(); - d3.select('#pauseButton').text('Resume'); + d3.select("#pauseButton").text("Resume"); paused = true; } } } + /** * Average distances for each node. * @param {*} dataNodes @@ -397,4 +406,4 @@ function calculateAverageDistance(dataNodes, properties, normalization) { } return sum / n; -} */ +}*/