Skip to content

Instantly share code, notes, and snippets.

@t3o-it
Last active April 26, 2017 15:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save t3o-it/1de4522b724a4af16fa63d11ac844354 to your computer and use it in GitHub Desktop.
Save t3o-it/1de4522b724a4af16fa63d11ac844354 to your computer and use it in GitHub Desktop.
horizontal axis brush
<!DOCTYPE html>
<svg width="960" height="400"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
margin = {top: 20, right: 30, bottom: 30, left: 40},
radius = 16,
xDomain = [-500, 500],
yDomain = [0, 100],
_runtimeBrushes = [{id: 1, extents: []}, {id: 2, extents: []}];
var color = d3.scaleOrdinal()
.range(d3.schemeCategory20);
var xScale = d3.scaleLinear()
.domain(xDomain)
.range([0, width - margin.left - margin.right]);
var yScale = d3.scaleLinear()
.domain(yDomain)
.range([height, 0]);
var xAxis = d3.axisBottom(xScale);
var yAxis = d3.axisLeft(yScale);
var chartContainer = svg
.attr('width', (width + margin.right + margin.left))
.attr('height', (height + margin.top + margin.bottom))
.append('g')
.attr('id', 'chartcontainer')
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var xAxisEl = chartContainer.append('g')
.attr('class', 'x axis')
.attr('transform', 'translate(0,' + height + ')')
.call(xAxis)
var yAxisEl = chartContainer.append('g')
.attr('class', 'y axis')
.call(yAxis);
var drawarea = chartContainer.append('g')
.attr('class', 'draw-area')
.attr('width', width)
.attr('height', height)
drawSamplePoints();
var brushFn = d3.brushX()
.extent([[0, -height], [width, 16]])
.on("end", function(d,i,j){
filter(d,i,j);
});
xAxisEl.call(brushFn);
function drawSamplePoints() {
sampleData = d3.range(100).map(function () {
return {
x: Math.floor(Math.random() * (xDomain[1] - xDomain[0] -40) + xDomain[0] + 40),
y: Math.floor(Math.random() * (yDomain[1] - yDomain[0] - 10) + yDomain[0] + 10)
};
});
drawarea.selectAll("circle")
.data(sampleData)
.enter().append("circle")
.attr("cx", function (d) {
return xScale(d.x);
})
.attr("cy", function (d) {
return yScale(d.y);
})
.attr("opacity", 0.8)
.style("pointer-events", "none")
.attr("r", radius)
.style("fill", function (d, i) {
return color(i);
})
.style("stroke", function (d, i) {
return color(i);
})
}
function filter(d,i,j) {
var _sel = d3.brushSelection(j[i])? [xScale.invert(d3.brushSelection(j[i])[0]),xScale.invert(d3.brushSelection(j[i])[1])] : [];
drawarea.selectAll("circle")
.style("fill", function (d, i) {
return validCircle(d,_sel) ? color(i) : "#efefef";
})
}
function validCircle(_circle,_selection) {
return _selection.length === 0 || _selection[0] <= _circle.x && _circle.x <= _selection[1];
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment