var d3 = Plotly.d3;
var gd = document.getElementById('graph');
var currentLocation = null;
var padding = 20;
var csvStates = null;
var csvCities = null;
getStates(getCities(createMap));
function getStates(cb) {
var url = 'https://raw.githubusercontent.com/plotly/datasets/master/2014_usa_states.csv';
d3.csv(url, function(err, csv) {
if(err) throw err;
csvStates = csv;
cb();
});
}
function getCities(cb) {
var url = 'https://raw.githubusercontent.com/plotly/datasets/master/2014_us_cities.csv';
d3.csv(url, function(err, csv) {
if(err) throw err;
csvCities = csv;
cb();
})
}
function createMap() {
var data = [
makeChoropleth(csvStates),
makeBubbles(csvCities)
];
var layout = {
title: [
'2014 US population by states',
'(Click on state to see population by cities)'
].join('
'),
geo: {
scope: 'usa',
countrycolor: 'rgb(255, 255, 255)',
showland: true,
landcolor: 'rgb(217, 217, 217)',
showlakes: true,
lakecolor: 'rgb(255, 255, 255)',
subunitcolor: 'rgb(255, 255, 255)',
lonaxis: {},
lataxis: {}
}
};
gd.on('plotly_click', handleClick);
Plotly.plot(gd, data, layout);
}
function makeChoropleth(csv) {
var trace = {
type: 'choropleth',
locationmode: 'USA-states',
locations: [],
z: [],
text: []
};
csv.forEach(function(datum) {
trace.locations.push(datum.postal);
trace.z.push(datum.pop);
trace.text.push(datum.state);
});
return trace;
}
function makeBubbles(csv) {
var trace = {
type: 'scattergeo',
lon: [],
lat: [],
text: [],
name: '',
marker: {
size: [],
sizemode: 'area',
sizeref: 5e3,
sizemin: 4
},
visible: false
};
csv.forEach(function(datum) {
trace.lon.push(datum.lon);
trace.lat.push(datum.lat);
trace.text.push([
datum.name, '
',
'Population: ', datum.pop
].join(''));
trace.marker.size.push(datum.pop);
});
return trace;
}
function handleClick(d) {
if(d3.event.defaultPrevented) return;
var geoLayout = gd._fullLayout.geo,
geo = geoLayout._geo,
projection = geo.projection,
bb = d3.geo.path().projection(projection).bounds(d);
var lonlat0, lonlat1;
function invert(p) {
return projection.invert(p);
}
if(currentLocation === d.id) {
currentLocation = null;
gd.layout.geo.lonaxis.range = geoLayout.lonaxis._fullRange;
gd.layout.geo.lataxis.range = geoLayout.lataxis._fullRange;
Plotly.restyle(gd, 'visible', false, 1);
}
else {
currentLocation = d.id;
lonlat0 = invert([bb[0][0] - padding, bb[0][1] - padding]);
lonlat1 = invert([bb[1][0] + padding, bb[1][1] + padding]);
gd.layout.geo.lonaxis.range = [lonlat0[0], lonlat1[0]];
gd.layout.geo.lataxis.range = [lonlat1[1], lonlat0[1]];
Plotly.restyle(gd, 'visible', true, 1);
}
Plotly.Fx.loneUnhover(gd);
}