<!DOCTYPE html>
<html>
<head>
<script data-require="d3@*" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<svg id="chart"></svg>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
var render = (selector, size, data) => {
var margin = size.margin;
var width = size.width - margin.left - margin.right;
var height = size.height - margin.top - margin.bottom;
var x = d3.scaleLinear()
.domain(d3.extent(data, d => d.value))
.range([0, width]);
var y = d3.scaleBand()
.domain(data.map(d => d.name))
.rangeRound([0, height])
.padding(0.2);
var xAxis = d3.axisBottom(x);
var yAxis = d3.axisLeft(y)
.tickSize(0);
var svg = d3.select(selector)
.attr('width', size.width)
.attr('height', size.height);
var chart = svg.append('g')
.attr('transform', `translate(${ margin.left }, ${ margin.top })`);
var bar = chart.selectAll('.bar')
.data(data)
.enter().append('rect')
.attr('class', d => `bar ${ d.value < 0 ? 'negative': 'positive' }`)
.attr('x', d => x(Math.min(0, d.value)))
.attr('y', d => y(d.name))
.attr('width', d => Math.abs(x(d.value) - x(0)))
.attr('height', y.bandwidth());
chart.append('g')
.attr('transform', `translate(0, ${ height })`)
.attr('class', 'axis x')
.call(xAxis);
chart.append('g')
.attr('class', 'axis y')
.attr('transform', `translate(${ x(0) }, 0)`)
.call(yAxis);
};
fetch('data.json')
.then(data => data.json())
.then(data => {
var settings = {
width: 500,
height: 300,
margin: {
top: 20,
right: 20,
bottom: 30,
left: 40
}
};
render('#chart', settings, data);
});
});
#chart {
background-color: #ddd;
}
rect.positive {
fill: steelblue;
}
rect.negative {
fill: darkorange;
}
.axis text {
font: 10px sans-serif;
fill: black;
}
.axis.y text {
text-anchor: end;
}
D3 Bar Chart
============
From the tutorials:
* [Let's make a bar chart](https://bost.ocks.org/mike/bar/)
* [Let's make a bar chart, Part II](https://bost.ocks.org/mike/bar/2/)
* [Let's make a bar chart, Part III](https://bost.ocks.org/mike/bar/3/)
* [Bar chart with negative values](https://bl.ocks.org/mbostock/2368837)
We are using D3 v4 while the examples are in v3 so there are some API
changes to be aware of
Additional resources
--------------------
* [D3 tutorials](https://github.com/d3/d3/wiki/Tutorials)
[
{
"name":"A",
"value":-15
},
{
"name":"B",
"value":-20
},
{
"name":"C",
"value":-22
},
{
"name":"D",
"value":-18
},
{
"name":"E",
"value":2
},
{
"name":"F",
"value":6
},
{
"name":"G",
"value":26
},
{
"name":"H",
"value":18
}
]