blob: a9ab714a5ecc4826006688a9be927b4ce0c18e72 [file] [log] [blame]
// JS
const d3 = require('d3');
const Datamap = require('datamaps');
// CSS
require('./world_map.css');
function worldMapChart(slice, payload) {
const container = slice.container;
const div = d3.select(slice.selector);
container.css('height', slice.height());
div.selectAll('*').remove();
const fd = slice.formData;
// Ignore XXX's to get better normalization
let data = payload.data.filter(d => (d.country && d.country !== 'XXX'));
const ext = d3.extent(data, function (d) {
return d.m1;
});
const extRadius = d3.extent(data, function (d) {
return d.m2;
});
const radiusScale = d3.scale.linear()
.domain([extRadius[0], extRadius[1]])
.range([1, fd.max_bubble_size]);
const colorScale = d3.scale.linear()
.domain([ext[0], ext[1]])
.range(['#FFF', 'black']);
data = data.map(d => Object.assign({}, d, {
radius: radiusScale(d.m2),
fillColor: colorScale(d.m1),
}));
const mapData = {};
data.forEach((d) => {
mapData[d.country] = d;
});
const f = d3.format('.3s');
container.show();
const map = new Datamap({
element: slice.container.get(0),
data,
fills: {
defaultFill: '#ddd',
},
geographyConfig: {
popupOnHover: true,
highlightOnHover: true,
borderWidth: 1,
borderColor: '#fff',
highlightBorderColor: '#fff',
highlightFillColor: '#005a63',
highlightBorderWidth: 1,
popupTemplate: (geo, d) => (
`<div class="hoverinfo"><strong>${d.name}</strong><br>${f(d.m1)}</div>`
),
},
bubblesConfig: {
borderWidth: 1,
borderOpacity: 1,
borderColor: '#005a63',
popupOnHover: true,
radius: null,
popupTemplate: (geo, d) => (
`<div class="hoverinfo"><strong>${d.name}</strong><br>${f(d.m2)}</div>`
),
fillOpacity: 0.5,
animate: true,
highlightOnHover: true,
highlightFillColor: '#005a63',
highlightBorderColor: 'black',
highlightBorderWidth: 2,
highlightBorderOpacity: 1,
highlightFillOpacity: 0.85,
exitDelay: 100,
key: JSON.stringify,
},
});
map.updateChoropleth(mapData);
if (fd.show_bubbles) {
map.bubbles(data);
div.selectAll('circle.datamaps-bubble').style('fill', '#005a63');
}
}
module.exports = worldMapChart;