timeSeriesChart = () => {
var width = 800;
var height = width * 0.5;
var timeSeries;
var colorScale;
var margin = {
top: 5,
right: 20,
bottom: 30,
left: 60
}
function timeSeriesChartReturnValue() {
const seriesNames = Object.keys(timeSeries[0]).filter(seriesName => seriesName != "date");
const seriesClass = seriesName => seriesName.includes('average') ? 'average' : 'positivity';
const yIsPercent = seriesNames.some(seriesName => seriesName.includes('positivity'));
const yMax = Math.max(...seriesNames.map(seriesName => d3.max(timeSeries.map(d => d[seriesName]))));
const xScale = d3.scaleTime()
.domain(d3.extent(timeSeries, d => d.date))
.range([margin.left, width - margin.right]);
const yScale = d3.scaleLinear()
.domain([0, yMax]).nice()
.range([height - margin.bottom, margin.top]);
const xAxis = g => g
.attr("transform", `translate(0, ${height - margin.bottom})`)
.call(d3.axisBottom(xScale).ticks(d3.timeMonth, 1).tickSizeOuter(0).tickFormat(d3.timeFormat("%b %Y")));
const yAxis = g => g
.attr("transform", `translate(${margin.left}, 0)`)
.call(d3.axisLeft(yScale).tickFormat(yIsPercent ? d3.format('.0%') : null));
const svg = d3.create('svg')
.attr("viewBox", [0, 0, width, height]);
svg.append("g")
.call(xAxis);
svg.append("g")
.call(yAxis);
const lineGenerator = seriesName =>
d3.line()
.defined(d => !isNaN(d[seriesName]))
.x(d => xScale(d.date))
.y(d => yScale(d[seriesName]));
const appendPath = seriesName => {
svg.append('g')
.append('path')
.datum(timeSeries)
.attr('d', lineGenerator(seriesName))
.attr('id', seriesName)
.attr('class', seriesClass(seriesName))
.style('stroke', colorScale(seriesName.split(' ')[0]))
.append('title')
.text(seriesName);
}
seriesNames.map(seriesName => appendPath(seriesName));
return svg.node();
}
timeSeriesChartReturnValue.width = function(value) {
if (!arguments.length) return width;
width = value;
return this;
};
timeSeriesChartReturnValue.height = function(value) {
if (!arguments.length) return height;
height = value;
return this;
};
timeSeriesChartReturnValue.timeSeries = function(value) {
if (!arguments.length) return timeSeries;
timeSeries = value;
return this;
};
timeSeriesChartReturnValue.colorScale = function(value) {
if (!arguments.length) return colorScale;
colorScale = value;
return this;
};
timeSeriesChartReturnValue.margin = function(value) {
if (!arguments.length) return margin;
margin = value;
return this;
};
return timeSeriesChartReturnValue;
}