D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
sugi2000
Full window
Github gist
Japan Prefectural Map
#Japan Prefectural Map
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script> <script src="//d3js.org/topojson.v1.min.js"></script> <title>都道府県マップ</title> <style> .keys.selected { font-weight: bold; } #tooltip { position: absolute; top: 0; left: 0; background-color: #f0f0f0; } </style> </head> <body> <div class="container"></div> <script type="text/javascript"> var mapfilepath = 'japan.topojson'; var csvpath = 'choka.csv'; var japan; var keys; // 項目名の配列 var currentKey; // 現在選択中の項目名 var zoom = d3.behavior.zoom() .scaleExtent([1, 8]) .on("zoom", zoomed); var w = 960; var h = 780; var container = d3.select('.container'); var svg = container.append('svg') .attr('width', w) .attr('height', h) .append("g"); var g = svg.append("g"); // ツールチップ var tooltip = d3.select("body") .append("div") .attr("id", "tooltip") .style("opacity", 0); svg.call(zoom) .call(zoom.event); var clickKey = function() { currentKey = d3.select(this).attr('value'); d3.selectAll('.keys') .classed("selected", function(){return (d3.select(this).attr('value') === currentKey)}); updateMap(); } // データの数値から色に変換する関数 var color = d3.scale.linear() .domain([-80000, -8000, 0, 8000, 80000]) .range(['red', 'orange', 'yellow', 'cyan', 'blue']); // マップの更新 var updateMap = function() { g.selectAll('path') .transition() .duration(1000) .style('fill', function(d) { return color(d.properties[currentKey]); }); } // 凡例を追加 svg.selectAll('rect.legend') .data(color.domain()) .enter() .append('rect') .attr('class', 'legend') .attr('x', 65) .attr('y', function(d, i) { return 100 + 20 * i; }) .attr('width', 20) .attr('height', 20) .attr('fill', function(d) { return color(d); }); svg.selectAll('text.legend') .data(color.domain()) .enter() .append('text') .attr('x', 60) .attr('y', function(d, i) { return 100 + 20 * i + 12; }) .attr('font-size', 9) .attr('text-anchor', 'end') .text(function(d) { return d + '人'; }); // mapファイルの読み込み d3.json(mapfilepath, function(error, collection) { var japan = topojson.feature(collection, collection.objects.japan).features; // setup map var projection = d3.geo.mercator() .scale(1500) .center([137, 34.5]) //.center(d3.geo.centroid(collection)) .translate([w / 2, h / 2]); var path = d3.geo.path().projection(projection); g.selectAll('path') .data(japan) .enter() .append('path') .attr('d', path) .attr('ken', function(d) { return d.properties.name_local; }) .style('fill', function(d, i) { return 'white'; }) .style('cursor', 'pointer') .on('mouseover', function(d){ tooltip.style("opacity", 1) .html(d.properties['name_local']+'<br/>'+d.properties[currentKey]+"人") .style("left", (d3.event.pageX + 10) + "px") .style("top", (d3.event.pageY - 40) + "px"); var self = d3.select(this); self.style('fill', 'red'); }) .on('mousemove', function(d){ tooltip .style("left", (d3.event.pageX + 10) + "px") .style("top", (d3.event.pageY - 40) + "px"); }) .on('mouseout', function(d, i){ tooltip.style("opacity", 0); var self = d3.select(this); self.transition() .duration(300) .style('fill', function(d, i) { return color(d.properties[currentKey]); }); }) ; // mapファイルを読み込んだ後にcsvファイルを読み込み d3.csv(csvpath, function(error, rows) { // ken以外の項目名を取り出す keys = Object.keys(rows[0]).filter(function(key){ return key !== 'ken'; }); svg.selectAll('.keys') .data(keys) .enter() .append('text') .attr('class', 'keys') .attr('x', w - 100) .attr('y', function(d,i){return 10 + i * h / keys.length; }) .attr('value', function(d){return d;}) .attr('font-size', 10) .style('cursor', 'pointer') .text(function(d){return d + '年';}) .on('click', clickKey); // 人口超過データを追加する for (var i = 0; i < rows.length; i++) { var municipality = japan.filter(function(obj) { return (obj.properties['name_local'] === rows[i]['ken']); })[0]; console.log('municipality', i, municipality, rows[i]); if (municipality) { // 各項目の数値を、pathのpropertiesに代入する keys.forEach(function(key){ municipality.properties[key] = rows[i][key]; }); } } // データを読み込んだので、現在の項目名を最初の項目名にして、マップの色を更新 currentKey = keys[0]; updateMap(); }); }); // ズーム用関数 function zoomed() { g.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); } // blocks公開用の高さ調節 d3.select(self.frameElement).style("height", h + "px"); </script> </body> </html>
https://d3js.org/d3.v3.min.js
https://d3js.org/topojson.v1.min.js