A simple SVG bar chart. Part of the tutorial series Let’s Make a Bar Chart.
-
-
Save atestu/9647538 to your computer and use it in GitHub Desktop.
Let's make a bar chart... editor!
This file contains 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
name | value | |
---|---|---|
A | .08167 | |
B | .01492 | |
C | .02782 | |
D | .04253 | |
E | .12702 | |
F | .02288 | |
G | .02015 | |
H | .06094 | |
I | .06966 | |
J | .00153 | |
K | .00772 | |
L | .04025 | |
M | .02406 | |
N | .06749 | |
O | .07507 | |
P | .01929 | |
Q | .00095 | |
R | .05987 | |
S | .06327 | |
T | .09056 | |
U | .02758 | |
V | .00978 | |
W | .02360 | |
X | .00150 | |
Y | .01974 | |
Z | .00074 |
This file contains 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
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.bar { | |
fill: steelblue; | |
} | |
.axis text { | |
font: 10px sans-serif; | |
} | |
.axis path, | |
.axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.x.axis path { | |
display: none; | |
} | |
</style> | |
<svg class="chart"></svg> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<script> | |
// 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(); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment