From 9136b17ed9021bd9435117f68ff66c4dbb1a1889 Mon Sep 17 00:00:00 2001 From: Naafiyan Ahmed Date: Thu, 14 Jul 2022 16:38:00 -0400 Subject: refactored code into d3 utils --- src/client/views/nodes/DataVizBox/utils/D3Utils.ts | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/client/views/nodes/DataVizBox/utils/D3Utils.ts (limited to 'src/client/views/nodes/DataVizBox/utils') diff --git a/src/client/views/nodes/DataVizBox/utils/D3Utils.ts b/src/client/views/nodes/DataVizBox/utils/D3Utils.ts new file mode 100644 index 000000000..285298472 --- /dev/null +++ b/src/client/views/nodes/DataVizBox/utils/D3Utils.ts @@ -0,0 +1,59 @@ +import d3 from 'd3'; +import { DataPoint } from '../ChartBox'; + +// TODO: nda - implement function that can handle range for strings + +export const minMaxRange = (dataPts: DataPoint[]) => { + const yMin = d3.min(dataPts, d => d.y); + const yMax = d3.max(dataPts, d => d.y); + + const xMin = d3.min(dataPts, d => d.x); + const xMax = d3.max(dataPts, d => d.x); + + return { xMin, xMax, yMin, yMax }; +}; + +export const scaleCreator = (domA: number, domB: number, rangeA: number, rangeB: number) => { + return 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 + return 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, width: 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', 'grid') + .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', 'grid').call( + d3 + .axisLeft(scale) + .tickSize(-width) + .tickFormat((a, b) => '') + ); +}; + +export const drawLine = (p: d3.Selection, dataPts: DataPoint[], lineGen: d3.Line) => { + p.datum(dataPts).attr('fill', 'none').attr('stroke', 'rgba(53, 162, 235, 0.5)').attr('stroke-width', 2).attr('class', 'line').attr('d', lineGen); +}; -- cgit v1.2.3-70-g09d2