// JS var d3 = window.d3 || require('d3'); //var Datamap = require('../vendor/datamaps/datamaps.all.js'); var Datamap = require('datamaps'); // CSS require('./world_map.css'); function worldMapChart(slice) { var render = function () { var container = slice.container; var div = d3.select(slice.selector); container.css('height', slice.height()); d3.json(slice.jsonEndpoint(), function (error, json) { div.selectAll("*").remove(); if (error !== null) { slice.error(error.responseText, error); return ''; } var fd = json.form_data; var data = json.data.filter(function (d) { // Ignore XXX's to get better normalization return d.country && d.country !== 'XXX'; }); var ext = d3.extent(data, function (d) { return d.m1; }); var extRadius = d3.extent(data, function (d) { return d.m2; }); var radiusScale = d3.scale.linear() .domain([extRadius[0], extRadius[1]]) .range([1, fd.max_bubble_size]); data.forEach(function (d) { d.radius = radiusScale(d.m2); }); var colorScale = d3.scale.linear() .domain([ext[0], ext[1]]) .range(["#FFF", "black"]); var d = {}; for (var i = 0; i < data.length; i++) { var country = data[i]; country.fillColor = colorScale(country.m1); d[country.country] = country; } var f = d3.format('.3s'); container.show(); var map = new Datamap({ element: slice.container.get(0), data: data, fills: { defaultFill: '#ddd', }, geographyConfig: { popupOnHover: true, highlightOnHover: true, borderWidth: 1, borderColor: '#fff', highlightBorderColor: '#fff', highlightFillColor: '#005a63', highlightBorderWidth: 1, popupTemplate: function (geo, data) { return '
' + data.name + '
' + f(data.m1) + '
'; }, }, bubblesConfig: { borderWidth: 1, borderOpacity: 1, borderColor: '#005a63', popupOnHover: true, radius: null, popupTemplate: function (geo, data) { return '
' + data.name + '
' + f(data.m2) + '
'; }, 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(d); if (fd.show_bubbles) { map.bubbles(data); div.selectAll("circle.datamaps-bubble").style('fill', '#005a63'); } slice.done(json); }); }; return { render: render, resize: render, }; } module.exports = worldMapChart;