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
<!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; | |
} | |
.editor, .svg { | |
display: inline-block; | |
vertical-align: top; | |
} | |
.editor { | |
padding-left: 12px; | |
} | |
.svg { | |
border-left: 1px solid #dedede; | |
padding-left: 12px; | |
margin-left: 12px; | |
} | |
</style> | |
<div class="editor"> | |
<p>Paste from Excel:</p> | |
<textarea cols="13" rows="32">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</textarea> | |
</div> | |
<div class="svg"><svg class="chart"></svg></div> | |
<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 = 800 - 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 () { | |
// now we source the data from the textarea instead of the external file | |
var data = d3.tsv.parse(d3.select('textarea').node().value); | |
// 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; | |
} | |
// we call the draw function when the focus is out of the textarea | |
d3.select('textarea').on('blur', draw); | |
// on page load we call the function which will use what is currently in the textarea | |
draw(); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment