addGradient = (node, { id, gradients = [], x1, y1, x2, y2 }) => {
if (!Array.isArray(gradients)) throw Error('gradients should be an array!');
const offsetScale = d3.scaleLinear([0, gradients.length - 1], [0, 1]);
node
.append('defs')
.append('linearGradient')
.attr('id', id)
.attr('x1', x1)
.attr('x2', x2)
.attr('y1', y1)
.attr('y2', y2)
.attr('spreadMethod', 'pad')
.selectAll('stop')
.data(gradients)
.enter()
.append('stop')
.attr('offset', (d, i) => d.offset || offsetScale(i))
.attr('stop-color', d => d.color || 'white')
.attr('stop-opacity', d => d.opacity || '1');
}