import * as d3 from 'd3'; export interface DataPoint { x: number; y: number; } // TODO: nda - implement function that can handle range for strings export const minMaxRange = (dataPts: DataPoint[][]) => { // find the max and min of all the data points const yMin = d3.min(dataPts, d => d3.min(d, m => Number(m.y))); const yMax = d3.max(dataPts, d => d3.max(d, m => Number(m.y))); const xMin = d3.min(dataPts, d => d3.min(d, m => Number(m.x))); const xMax = d3.max(dataPts, d => d3.max(d, m => Number(m.x))); return { xMin, xMax, yMin, yMax }; }; export const scaleCreatorCategorical = (labels: string[], range: number[]) => { const scale = d3.scaleBand().domain(labels).range(range); return scale; }; export const scaleCreatorNumerical = (domA: number, domB: number, rangeA: number, rangeB: number) => d3.scaleLinear().domain([domA, domB]).range([rangeA, rangeB]); export const createLineGenerator = (xScale: d3.ScaleLinear, yScale: d3.ScaleLinear) => // TODO: nda - look into the different types of curves d3 .line() .x(d => xScale(d.x)) .y(d => yScale(d.y)) .curve(d3.curveMonotoneX); export const xAxisCreator = (g: d3.Selection, height: number, xScale: d3.ScaleLinear) => { g.attr('class', 'x-axis').attr('transform', `translate(0,${height})`).call(d3.axisBottom(xScale).tickSize(15)); }; export const yAxisCreator = (g: d3.Selection, marginLeft: number, yScale: d3.ScaleLinear) => { g.attr('class', 'y-axis').call(d3.axisLeft(yScale)); }; export const xGrid = (g: d3.Selection, height: number, scale: d3.ScaleLinear) => { g.attr('class', 'xGrid') .attr('transform', `translate(0,${height})`) .call( d3 .axisBottom(scale) .tickSize(-height) .tickFormat((/* a, b */) => '') ); }; export const yGrid = (g: d3.Selection, width: number, scale: d3.ScaleLinear) => { g.attr('class', 'yGrid').call( d3 .axisLeft(scale) .tickSize(-width) .tickFormat((/* a, b */) => '') ); }; export const drawLine = (p: d3.Selection, dataPts: DataPoint[], lineGen: d3.Line, extra: boolean) => { p.datum(dataPts) .attr('fill', 'none') .attr('stroke', 'rgba(53, 162, 235, 0.5)') .attr('stroke-width', 2) .attr('stroke', extra ? 'blue' : 'black') .attr('class', 'line') .attr('d', lineGen); };