Built with blockbuilder.org
Made with data from selfiecity
Built with blockbuilder.org
Made with data from selfiecity
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <style type="text/css"> | |
| .axis path, | |
| .axis line { | |
| fill: none; | |
| stroke: black; | |
| stroke-width: 2; | |
| shape-rendering: crispEdges; | |
| } | |
| .axis text { | |
| font-family: helvetica; | |
| font-size: 11px; | |
| } | |
| circle { | |
| fill: #B2B2B2; | |
| fill-opacity: .5; | |
| } | |
| circle:hover { | |
| -moz-transition: all 0.1s; | |
| -o-transition: all 0.1s | |
| -webkit-transition: all 0.1s; | |
| transition: all 0.1s; | |
| fill: #FFCC00; | |
| } | |
| #tooltip { | |
| position: absolute; | |
| width: 200px; | |
| height: auto; | |
| padding: 10px; | |
| background-color: white; | |
| -webkit-border-radius: 10px; | |
| -moz-border-radius: 10px; | |
| border-radius: 10px; | |
| -webkit-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); | |
| -moz-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); | |
| box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); | |
| pointer-events: none; | |
| } | |
| #tooltip.hidden { | |
| display: none; | |
| } | |
| #tooltip p { | |
| margin: 0; | |
| font-family: sans-serif; | |
| font-size: 12px; | |
| line-height: 20px; | |
| } | |
| p { | |
| font-family: sans-serif; | |
| font-size: 10px; | |
| /*padding: {top: 1000px, right: 0px, bottom: 0px, left: 1000px};*/ | |
| /*font-style: italic;*/ | |
| } | |
| #title { | |
| font-family:helvetica; | |
| font-size: 12px; | |
| /*text-transform: uppercase;*/ | |
| } | |
| .x.label { | |
| font-family: helvetica; | |
| font-size: 10px; | |
| } | |
| .y.label { | |
| font-family: helvetica; | |
| font-size: 10px; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <p id="info">A visualization using <a href="http://selfiecity.net/">data published by selfiecity</a>.</p> | |
| <p id="click">—Click to update value range—</p><p id="click2">—Click to zoom in on new value range—</p> | |
| <div id="tooltip" class="hidden"> | |
| <p><strong>xy coordinates</strong></p> | |
| <p><span id="value">100</span>%</p> | |
| </div> | |
| <script type="text/javascript"> | |
| var w = 850; | |
| var h = 400; | |
| var padding = 50; | |
| //static dataset | |
| var dataset = [ | |
| [.6, .93], [.6, .92], [.58, .95], [.59, .90], [.60, .91] | |
| ]; | |
| //format tick labels | |
| var xScale = d3.scale.linear() | |
| .domain([0, d3.max(dataset, function(d) {return d[0];} ) ]) | |
| .range([padding, w - padding * 2]); | |
| var yScale = d3.scale.linear() | |
| .domain([0, d3.max(dataset, function(d) {return d[1];} ) ]) | |
| .range([h - padding, padding]); | |
| var rScale = d3.scale.linear() | |
| .domain([0, d3.max(dataset, function(d) {return d[1];} ) ]) | |
| .range([2, 5]); | |
| var xAxis = d3.svg.axis() | |
| .scale(xScale) | |
| .orient("bottom") | |
| .ticks(5) | |
| var yAxis = d3.svg.axis() | |
| .scale(yScale) | |
| .orient("left") | |
| .ticks(5) | |
| //create SVG element | |
| var svg = d3.select("body") | |
| .append("svg") | |
| .attr("width", w) | |
| .attr("height", h); | |
| //create circles | |
| svg.selectAll("circle") | |
| .data(dataset) | |
| .enter() | |
| .append("circle") | |
| .attr("cx", function(d) {return xScale(d[0]);}) | |
| .attr("cy", function(d) {return yScale(d[1]);}) | |
| //r: function(d) {return Math.sqrt(h - d[1]);} | |
| .attr("r", function(d) {return rScale(d[1]);}) | |
| .append("title") | |
| .text(function(d) { | |
| return "xy coordinates: " + d[0] + ", " + d[1]; | |
| }) | |
| //Create SVG element tooltips | |
| .on("mouseover", function(d) { | |
| //Get this bar's x/y values, then augment for the tooltip | |
| var xPosition = parseFloat(d3.select(this).attr("cx")) + xScale.rangeBand() / 2; | |
| var yPosition = parseFloat(d3.select(this).attr("cy")) + 14; | |
| //Create the tooltip label | |
| svg.append("text") | |
| .attr("id", "tooltip") | |
| .attr("x", xPosition) | |
| .attr("y", yPosition) | |
| .attr("text-anchor", "middle") | |
| .attr("font-family", "sans-serif") | |
| .attr("font-weight", "bold") | |
| .attr("font-size", "11px") | |
| .attr("fill", "black") | |
| .text(d); | |
| }) | |
| .on("mouseout", function() { | |
| //Remove the tooltip | |
| d3.select("#tooltip").remove(); | |
| }); | |
| //create X axis | |
| svg.append("g") | |
| .attr("class", "x axis") | |
| .attr("transform", "translate(0," + (h - padding) + ")") | |
| .call(xAxis); | |
| //label X axis | |
| svg.append("text") | |
| .attr("class", "x label") | |
| .attr("text-anchor", "end") | |
| .attr("x", w - 100) | |
| .attr("y", h - 60) | |
| .text("smile rating"); | |
| //create Y axis | |
| svg.append("g") | |
| .attr("class", "y axis") | |
| .attr("transform", "translate(" + padding + ",0)") | |
| .call(yAxis); | |
| svg.append("text") | |
| .attr("class", "y label") | |
| .attr("text-anchor", "end") | |
| .attr("y", 60) | |
| .attr("dy", 10) | |
| .attr("x", -50) | |
| .attr("transform", "rotate(-90)") | |
| .text("confidence rating"); | |
| //1. On click, update with new data | |
| d3.select("#click") | |
| .on("click", function() { | |
| //New values for dataset | |
| var numValues = dataset.length; | |
| //Count original length of dataset | |
| var maxRange = Math.random() * 1000; | |
| //Max range of new values | |
| dataset = [ [.45, .51], [.47, .55], [.44, .53], [.45, .53], [.48, .54] | |
| ]; | |
| //Update all circles | |
| svg.selectAll("circle") | |
| .data(dataset) | |
| .transition() | |
| .duration(1000) | |
| .each("start", function () { | |
| d3.select(this) // Selects 'this', the current element | |
| //.transition() -- Will override first transition | |
| //.duration(250) | |
| .attr("fill", "#FFCC00") //Sets fill of 'this' to magenta | |
| .attr("r", 9); //Sets radius of 'this' to 3 | |
| }) | |
| .attr("cx", function(d) { | |
| return xScale(d[0]); | |
| }) | |
| .attr("cy", function(d) { | |
| return yScale(d[1]); | |
| }) | |
| /*.each("end", function(){ | |
| d3.select(this)*/ | |
| .transition() | |
| .duration(1000) | |
| .attr("fill", "black") | |
| .attr("r", 9); | |
| }); | |
| //2. On click, update with new data | |
| d3.select("#click2") | |
| .on("click", function() { | |
| //New values for dataset | |
| var numValues = dataset.length; | |
| //Count original length of dataset | |
| var maxRange = Math.random() * 1000; | |
| //Max range of new values | |
| dataset = [ [.45, .51], [.47, .55], [.44, .53], [.45, .53], [.48, .54] | |
| ]; | |
| //Update scale domains | |
| xScale.domain([0, d3.max(dataset, function(d) { return d[0]; })]); | |
| yScale.domain([0, d3.max(dataset, function(d) { return d[1]; })]); | |
| //Update all circles | |
| svg.selectAll("circle") | |
| .data(dataset) | |
| .transition() | |
| .duration(1000) | |
| .each("start", function () { | |
| d3.select(this) // Selects 'this', the current element | |
| //.transition() -- Will override first transition | |
| //.duration(250) | |
| .attr("fill", "#FFCC00") //Sets fill of 'this' to magenta | |
| .attr("r", 12); //Sets radius of 'this' to 3 | |
| }) | |
| .attr("cx", function(d) { | |
| return xScale(d[0]); | |
| }) | |
| .attr("cy", function(d) { | |
| return yScale(d[1]); | |
| }) | |
| /*.each("end", function(){ | |
| d3.select(this)*/ | |
| .transition() | |
| .duration(1000) | |
| .attr("fill", "black") | |
| .attr("r", 12); | |
| //Update x-axis | |
| svg.select(".x.axis") | |
| .transition() | |
| .ease("bounce") | |
| .duration(1000) | |
| .call(xAxis); | |
| //Update y-axis | |
| svg.select(".y.axis") | |
| .transition() | |
| .ease("bounce") | |
| .duration(1000) | |
| .call(yAxis); | |
| }); | |
| </script> | |
| </body> | |
| </html> |