Built with blockbuilder.org
This exmaple is enlighten by http://bl.ocks.org/mbostock/1087001
| license: mit |
Built with blockbuilder.org
This exmaple is enlighten by http://bl.ocks.org/mbostock/1087001
| country | income | |
|---|---|---|
| France | 14 | |
| Russia | 20 | |
| Japan | 25 | |
| Korea | 30 | |
| Argentina | 28 |
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://d3js.org/d3.v3.min.js"></script> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
| .xGroup line, .xGroup path{ | |
| visibility: hidden; | |
| } | |
| .tooltip{ | |
| position : absolute; | |
| text-align : center; | |
| max-width : 70px; | |
| max-height : 30px; | |
| padding : 8px; | |
| border : none; | |
| border-radius : 8px; | |
| margin-top : -30px; | |
| font : 10px sans-serif; | |
| background : black; | |
| color : white; | |
| pointer-events: none; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id='container'></div> | |
| <script id='codeExcute'> | |
| // This exmaple is enlighten by http://bl.ocks.org/mbostock/1087001 | |
| var url = 'data_income.csv' | |
| d3.csv(url, function(error, data){ | |
| data.forEach(function (d) { | |
| d.income = +d.income; | |
| }); | |
| // console.log(data) | |
| var margin = {top: 65, bottom: 50, left: 50, right: 30}, axisPadding = 10; | |
| var Width = 500, Height = 300; | |
| var svgWidth = Width + margin.left + margin.right, | |
| svgHeight = Height + margin.top + margin.bottom; | |
| var maxIncome = d3.max(data, function(d){ return d.income; }); | |
| // define scales and axises | |
| var xScale = d3.scale.ordinal() | |
| .domain(data.map(function(d){ return d.country; })) | |
| .rangeBands([0, Width], 0.1); | |
| var yScale = d3.scale.linear() | |
| .domain([0, maxIncome]) | |
| .range([0, Height]); | |
| var color = d3.scale.category10(); | |
| var xAxis = d3.svg.axis() | |
| .scale(xScale) | |
| .tickSize(0,0) | |
| .orient('bottom'); | |
| var yAxis = d3.svg.axis() | |
| .scale(yScale.copy().domain([maxIncome, 0])) | |
| .tickSize(6,0) | |
| .ticks(5) | |
| .orient('left'); | |
| // create a svg canvas | |
| var svg = d3.select('#container') | |
| .append('svg') | |
| .attr({width: svgWidth, height: svgHeight}) | |
| // Drawing for axises | |
| var xGroup = svg.append('g') | |
| .attr('class', 'xGroup') | |
| .attr('transform', 'translate(' + [margin.left, margin.top + Height + axisPadding] + ')'); | |
| xGroup.call(xAxis); | |
| styleAxis(xGroup); | |
| var yGroup = svg.append('g') | |
| .attr('class', 'yGroup') | |
| .attr('transform', 'translate(' + [margin.left - axisPadding, margin.top] + ')'); | |
| yGroup.call(yAxis); | |
| styleAxis(yGroup); | |
| // Label layer | |
| var label = svg.append('g') | |
| .attr('transform', 'translate(' + [margin.left - axisPadding, margin.top] + ')'); | |
| label.append('text') | |
| .text('Income [%]') | |
| .attr('transform', 'rotate(-90)') | |
| .attr({ | |
| 'text-anchor': 'start', | |
| x: -75, | |
| y: 20, | |
| }) | |
| label.append('text') | |
| .text('Bar Chart with Tooltip') | |
| .attr('transform', 'translate(' + [Width / 2, - margin.top / 2] + ')') | |
| .attr({ | |
| 'text-anchor': 'middle', | |
| 'font-size': '1.5em', | |
| fill: 'steelblue', | |
| }); | |
| // Drawing for graph body | |
| var graph = svg.append('g') | |
| .attr('class', 'graph') | |
| .attr('transform', 'translate(' + [margin.left, margin.top + Height] + ')'); | |
| var bars = graph.selectAll('g') | |
| .data(data) | |
| .enter() | |
| .append('g') | |
| .attr('transform', function(d,i){ return 'translate(' + [xScale(d.country), -1 * yScale(d.income)] + ')'; }); | |
| bars.append('rect') | |
| .each(function(d,i){ | |
| d3.select(this).attr({ | |
| fill: color.range()[i], | |
| width: xScale.rangeBand(), | |
| height: yScale(d.income), | |
| }) | |
| }) | |
| .on('mouseover', mouseover) | |
| .on('mousemove', mousemove) | |
| .on('mouseout', mouseout); | |
| bars.append('text') | |
| .text(function(d){ return d.income; }) | |
| .each(function(d,i){ | |
| d3.select(this).attr({ | |
| fill: color.range()[i], | |
| stroke: 'none', | |
| x: xScale.rangeBand() / 2, | |
| y: -5, | |
| 'text-anchor': 'middle', | |
| }); | |
| }) | |
| // tooltips | |
| var div = d3.select('#container').append('div') | |
| .attr('class', 'tooltip') | |
| .style('display', 'none'); | |
| function mouseover(){ | |
| div.style('display', 'inline'); | |
| } | |
| function mousemove(){ | |
| var d = d3.select(this).data()[0] | |
| div | |
| .html(d.country + '<hr/>' + d.income) | |
| .style('left', (d3.event.pageX - 34) + 'px') | |
| .style('top', (d3.event.pageY - 12) + 'px'); | |
| } | |
| function mouseout(){ | |
| div.style('display', 'none'); | |
| } | |
| }) | |
| function styleAxis(axis){ | |
| // style path | |
| axis.select('.domain').attr({ | |
| fill: 'none', | |
| stroke: '#888', | |
| 'stroke-width': 1 | |
| }); | |
| // style tick | |
| axis.selectAll('.tick line').attr({ | |
| stroke: '#000', | |
| 'stroke-width': 1, | |
| }) | |
| } | |
| </script> | |
| </body> |