The slider is taken from http://bl.ocks.org/shancarter/5979700
Inspired by "Enhancing Scatterplots with Multi-Dimensional Focal Blur", Joachim Staib, Sebastian Grottel, Stefan Gumhold - EuroVis 2016
The slider is taken from http://bl.ocks.org/shancarter/5979700
Inspired by "Enhancing Scatterplots with Multi-Dimensional Focal Blur", Joachim Staib, Sebastian Grottel, Stefan Gumhold - EuroVis 2016
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <meta name="description" content=""> | |
| <meta name="author" content=""> | |
| <link rel="icon" href="favicon.ico"> | |
| <title>Scratterplot Blur</title> | |
| <style type="text/css"> | |
| circle{ | |
| fill:#000; | |
| stroke:transparent; | |
| } | |
| svg{ | |
| margin:80px 0 0 40px; | |
| } | |
| .slider { | |
| position: relative; | |
| top: 40px; | |
| left: 40px; | |
| } | |
| .slider-tray { | |
| position: absolute; | |
| width: 100%; | |
| height: 6px; | |
| border: solid 1px #ccc; | |
| border-top-color: #aaa; | |
| border-radius: 4px; | |
| background-color: #f0f0f0; | |
| box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.08); | |
| } | |
| .slider-handle { | |
| position: absolute; | |
| top: 3px; | |
| } | |
| .slider-handle-icon { | |
| width: 14px; | |
| height: 14px; | |
| border: solid 1px #aaa; | |
| position: absolute; | |
| border-radius: 10px; | |
| background-color: #fff; | |
| box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); | |
| top: -7px; | |
| left: -7px; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="slider"></div> | |
| <script src="https://d3js.org/d3.v3.min.js"></script> | |
| <script type="text/javascript"> | |
| var min = 0, max = 500, width = 500, height = 500, data = [], blur = 10, radius=5; | |
| for(var i = 0; i<500; i++){ | |
| data.push({ | |
| x:Math.random()*max, | |
| y:Math.random()*max, | |
| z:Math.random()*max | |
| }); | |
| } | |
| var svg = d3.select("body").append("svg").attr("width",width).attr("height",height); | |
| /*SLIDER START*/ | |
| var x = d3.scale.linear() | |
| .domain([1, 100]) | |
| .range([0, width]) | |
| .clamp(true); | |
| var dispatch = d3.dispatch("sliderChange"); | |
| var slider = d3.select(".slider") | |
| .style("width", width + "px"); | |
| var sliderTray = slider.append("div") | |
| .attr("class", "slider-tray"); | |
| var sliderHandle = slider.append("div") | |
| .attr("class", "slider-handle"); | |
| sliderHandle.append("div") | |
| .attr("class", "slider-handle-icon") | |
| slider.call(d3.behavior.drag() | |
| .on("dragstart", function() { | |
| dispatch.sliderChange(x.invert(d3.mouse(sliderTray.node())[0])); | |
| d3.event.sourceEvent.preventDefault(); | |
| }) | |
| .on("drag", function() { | |
| dispatch.sliderChange(x.invert(d3.mouse(sliderTray.node())[0])); | |
| })); | |
| dispatch.on("sliderChange.slider", function(value) { | |
| sliderHandle.style("left", x(value) + "px") | |
| scatter.attr("filter",function(d){ | |
| return "url(#blur_"+Math.round(Math.abs(value*(max/100)-d.z)/max*100)+")"; | |
| }); | |
| }); | |
| /*SLIDER END*/ | |
| var filter = svg.append("defs").selectAll("filter").data(new Array(100)).enter().append("filter") | |
| .attr("id",function(d,i){ return "blur_"+i; }) | |
| .attr("x",-blur) | |
| .attr("y",-blur) | |
| .attr("width",(blur*2+radius)) | |
| .attr("height",(blur*2+radius)); | |
| filter.append("feGaussianBlur").datum(function(d,i){ return i; }) | |
| .attr("in","SourceGraphic") | |
| .attr("stdDeviation",function(d){ return blur/100*d; }); | |
| var scatter = svg.append("g").selectAll("circle").data(data).enter().append("circle") | |
| .attr("cx",function(d){return d.x;}) | |
| .attr("cy",function(d){return d.y;}) | |
| .attr("r",radius) | |
| .attr("filter",function(d){return "url(#blur_0)";}); | |
| </script> | |
| </body> | |
| </html> |