Skip to content

Instantly share code, notes, and snippets.

@sebastian-meier
Last active June 8, 2016 08:16
Show Gist options
  • Save sebastian-meier/e124ccdd68d7cf170407a7e9c92a118a to your computer and use it in GitHub Desktop.
Save sebastian-meier/e124ccdd68d7cf170407a7e9c92a118a to your computer and use it in GitHub Desktop.
Scatterplots with Blur

Scatterplots with Blur

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment