viewof chart = {
const svg = d3.select(DOM.svg(width, height))
.style('background', theme.svg)
const tileSize = 66;
const tileMargin = 1;
const textMargin = 3;
const sparklineMargin = 5;
const sparklineTileScale = .8;
svg.append('g')
.selectAll('rect')
.data(states)
.enter()
.append('rect')
.attr('x', (d,i) => {return (tileSize+tileMargin)*d.x})
.attr('y', (d,i) => {return (tileSize+tileMargin)*d.y})
.attr('width', tileSize)
.attr('height', tileSize)
.attr('fill',(d,i) => {
if (serieVolume[d.name] > 0){
const colorScore = 0.7+1*(serieVolume[d.name]-volumeMin)/(volumeMax-volumeMin);
return d3.interpolateGnBu(colorScore)
} else {
return '#e3e3e3'
}
})
.attr('class', (d,i) => {return d.name});
svg.append('g')
.selectAll('text')
.data(states)
.enter()
.append('text')
.text((d,i) => {return d.name})
.attr('x', (d,i) => {return (tileSize+tileMargin)*d.x+tileSize-textMargin})
.attr('y', (d,i) => {return (tileSize+tileMargin)*d.y+textMargin})
.attr('fill', theme.text)
.attr('text-anchor', 'end')
.attr('alignment-baseline', 'hanging')
.style('font-family', 'sans-serif')
.style('font-size', '13px');
const x = d3.scaleLinear().range([-tileSize+sparklineMargin, -sparklineMargin]);
const y = d3.scaleLinear().range([tileSize*sparklineTileScale, 0]);
x.domain([1996, 2017]);
y.domain([0, dataMedian*3]);
const xAxis = d3.axisBottom(x).ticks(5);
const yAxis = d3.axisLeft(y).ticks(4).tickFormat(d3.format(',.0%'));
const line = d3.line()
.defined(d => d)
.x(d => x(d[0]))
.y(d => y(d[1]));
for (const i in states){
const xTransform = (tileSize+tileMargin)*states[i].x+tileSize;
const yTransform = (tileSize+tileMargin)*states[i].y+tileSize*(1-sparklineTileScale)-5;
const chart = svg.append('g').attr('transform', 'translate(' + xTransform + ',' + yTransform + ')')
chart.append('path')
.attr('class', `line`)
.attr('d', line(data[states[i].name]))
.attr('clip-path', 'url(#clip-'+states[i].name+')')
.attr('stroke', theme.text)
.attr('stroke-width', 1.5)
.attr('fill','none');
};
return svg.node();
}