/* global d3 */
// D3 convention: define margin as an object called margin with these props:
let margin = {
top: 10,
right: 20,
bottom: 60,
left: 40
};
let width = 425 - margin.left - margin.right;
let height = 625 - margin.top - margin.bottom;
let svg = d3.select('.chart')
.append('svg')
// Match the size of the chart-containing
.
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.append('g')
.attr('transform', () => `translate(${margin.left},${margin.top})`);
// Everything below this line no longer needs to care about margins.
// At this point, the "svg" variable actually contains the selection.
svg.append('rect')
.attr('width', width)
.attr('height', height)
.style('fill', 'lightblue')
.style('stroke', 'green');
let yScale = d3.scaleLinear()
.domain([0, 100])
// reversed because SVG coordinates are top to bottom.
.range([height, 0]);
let yAxis = d3.axisLeft(yScale)
// For 2nd ticks() param:
// - '%' assumes a [0,1] domain
// - 's' uses human-readable sizes
// - '.2s' gives 2 digits after decimal separator
// The value is a suggestion, in this case we get 6, not 5.
// .ticks(5);
// Can use explicit tick positions:
// .tickValues([8, 19, 43, 77])
svg.call(yAxis);
let xScale = d3.scaleTime()
.domain([new Date(2016, 0, 1, 6), new Date(2016, 0, 1, 9)])
.range([0, width])
let xAxis = d3.axisBottom(xScale)
.ticks(5)
// .tickSize(20)
.tickSizeInner(10)
.tickSizeOuter(20)
.tickPadding(15)
// Not every 45 minutes, but every 45 minutes after the hour, plus the hour.
//.ticks(d3.timeMinute.every(45))
;
// This would appear at the top (but drawn for a bottom position, ticks down).
// svg.call(xAxis);
// So we put it in an additional below the graph.
svg.append('g')
.attr('transform', `translate(0, ${height})`)
.call(xAxis);