Created
March 21, 2014 15:05
-
-
Save atestu/9688250 to your computer and use it in GitHub Desktop.
bar chart editor step 1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// all of these variables are independent of the data, | |
// so we exclude them from the draw function | |
var margin = {top: 20, right: 30, bottom: 30, left: 40}, | |
width = 960 - margin.left - margin.right, | |
height = 500 - margin.top - margin.bottom; | |
var x = d3.scale.ordinal() | |
.rangeRoundBands([0, width], .1); | |
var y = d3.scale.linear() | |
.range([height, 0]); | |
var xAxis = d3.svg.axis() | |
.scale(x) | |
.orient("bottom"); | |
var yAxis = d3.svg.axis() | |
.scale(y) | |
.orient("left"); | |
var chart = d3.select(".chart") | |
.attr("width", width + margin.left + margin.right) | |
.attr("height", height + margin.top + margin.bottom) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
var gXAxis = chart.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")"); | |
var gYAxis = chart.append("g") | |
.attr("class", "y axis"); | |
// this is the function that will be called each time we draw the chart | |
function draw () { | |
d3.tsv("data.tsv", type, function(error, data) { | |
// the data may have changed so we need to update the domain of our scales | |
x.domain(data.map(function(d) { return d.name; })); | |
y.domain([0, d3.max(data, function(d) { return d.value; })]); | |
// we update the axis to reflect the new scale domains | |
gXAxis.call(xAxis); | |
gYAxis.call(yAxis); | |
var bars = chart.selectAll(".bar").data(data); | |
// if there are new bars since we last called draw (or if it's the first time), | |
// we add them now | |
bars | |
.enter().append("rect") | |
.attr("class", "bar"); | |
// we update the bars with new attributes based on the new data | |
bars | |
.attr("x", function(d) { return x(d.name); }) | |
.attr("y", function(d) { return y(d.value); }) | |
.attr("height", function(d) { return height - y(d.value); }) | |
.attr("width", x.rangeBand()); | |
// maybe some bars are not present in the new data, let's remove them! | |
bars.exit().remove(); | |
}); | |
} | |
function type(d) { | |
d.value = +d.value; // coerce to number | |
return d; | |
} | |
draw(); | |
// we can call draw any number of time, axis won't be re drawn, just updated | |
draw(); | |
// bars won't superpose, they'll just be updated or removed | |
draw(); | |
// such is the magic of d3 data joins! http://bost.ocks.org/mike/join/ | |
draw(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment