| // 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; |