テキストフィールドに数列をタイプすると棒グラフに変換して表示する。
区切り文字としては空白、タブ、カンマが使用できる。
数字以外の値は0として扱われる。
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <script src="//d3js.org/d3.v3.min.js"></script> | |
| <body> | |
| <div id='control' style='height:20px;border:0;padding:0;margin:0'> | |
| <input type='text' style='width:640;height:18px;margin:0;padding:0;border:solid 1px'></input> | |
| </div> | |
| <div id='graph' style='height:480px;border:0;padding:0;margin:0'> | |
| </div> | |
| <script> | |
| var dim = {width:960,height:480}; | |
| var margin = {top: 0, left: 30, right: 30, bottom: 30}; | |
| dim.graphHeight = dim.height - margin.top - margin.bottom; | |
| dim.graphWidth = dim.width - margin.left - margin.right; | |
| var svg = d3.select('#graph').append('svg') | |
| .attr({width:dim.width,height:dim.height}); | |
| var axisLayer = svg.append('g').attr('transform','translate(' + margin.left + ',' + margin.top + ')'); | |
| var graphLayer = svg.append('g').attr('transform','translate(' + margin.left + ',' + margin.top + ')'); | |
| var xScale = d3.scale.linear().range([0,dim.graphWidth]); | |
| var yScale = d3.scale.ordinal().rangeBands([0,dim.graphHeight],0.1); | |
| var xAxis = d3.svg.axis().orient('bottom').scale(xScale); | |
| var yAxis = d3.svg.axis().orient('left').scale(yScale).tickValues([]); | |
| var xAxisObj = axisLayer.append('g') | |
| .attr('transform','translate('+0+','+dim.graphHeight+')') | |
| .attr('class','axis') | |
| .call(xAxis); | |
| var yAxisObj = axisLayer.append('g') | |
| .attr('transform','translate('+xScale(0)+','+0+')') | |
| .attr('class','axis') | |
| .call(yAxis); | |
| function update_axis() | |
| { | |
| axisLayer.selectAll('.axis text').style({'font':'"Lucida Grande", Helvetica, Arial','font-size': '14px'}); | |
| axisLayer.selectAll('.axis path.domain').style({fill:'none',stroke:'#000000','shape-rendering':'crispEdges'}); | |
| axisLayer.selectAll('.axis line').style({fill:'none',stroke:'#000000','shape-rendering':'crispEdges'}); | |
| } | |
| d3.select('input').on('keyup',function() | |
| { | |
| var data_ = d3.select(this) | |
| .property('value') | |
| .replace(/[,\n\t 、,]/g,' ').replace(/ +/g,' ') | |
| .replace(/[-0-9]/g, function(s){return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);}) | |
| .trim() | |
| .split(' ') | |
| .map(function(d){return d.replace(/"(.*)"/,'$1');}) | |
| .map(function(d){return {value:((isNaN(d))?void 0:+d),text:d};}); | |
| update_graph(data_); | |
| }); | |
| function update_graph(data) | |
| { | |
| var rng_ = d3.extent(data.map(function(d){return d.value;})); | |
| if (rng_[0] === void 0) {rng_[0] = 0;} | |
| if (rng_[1] === void 0) {rng_[1] = 0;} | |
| if (rng_[0] < 0 && rng_[1] < 0){rng_[1] = 0;} | |
| if (rng_[0] > 0 && rng_[1] > 0){rng_[0] = 0;} | |
| if (rng_[0] === 0 && rng_[1] === 0){rng_[1] = 1;} | |
| xScale.domain(rng_); | |
| yScale.domain(d3.range(0,data.length)); | |
| xAxisObj.transition().call(xAxis); | |
| yAxisObj.transition().attr('transform','translate('+xScale(0)+','+0+')').call(yAxis); | |
| update_axis(); | |
| var bind_ = graphLayer.selectAll('g') | |
| .data(data); | |
| bind_.exit().select('rect').transition().attr('x',0).attr('width',0); | |
| bind_.exit().select('text').remove(); | |
| bind_.exit().transition().remove(); | |
| var enter_ = bind_.enter().append('g') | |
| .attr('transform',function(d,i){return 'translate(' + xScale(0) + ',' + yScale(i) + ')';}); | |
| enter_.append('rect') | |
| .attr({width:0,height:yScale.rangeBand(),x:0,y:0}) | |
| .style('fill','steelblue'); | |
| enter_.append('text') | |
| .style({fill:'#000000','font':'"Lucida Grande", Helvetica, Arial','font-size': ''+Math.max(14,Math.min(yScale.rangeBand(),20))+'px', 'dominant-baseline':'middle', 'text-anchor':(xScale(0)<(dim.graphWidth*0.5))?'start':'end'}) | |
| .attr({x:0,y:yScale.rangeBand()*0.5,dx:0}) | |
| .text(''); | |
| bind_.transition() | |
| .attr('transform',function(d,i){return 'translate(' + xScale(0) + ',' + yScale(i) + ')';}); | |
| bind_.select('rect').transition() | |
| .attr('x', function(d){return (d.value===void 0)?0:((d.value < 0)?(xScale(d.value)-xScale(0)):0);}) | |
| .attr('width',function(d){return (d.value===void 0)?0:(Math.abs(xScale(0) - xScale(d.value)));}) | |
| .attr('height',yScale.rangeBand()) | |
| .attr('y',0); | |
| bind_.select('text').transition() | |
| .style('font-size',''+Math.max(14,Math.min(yScale.rangeBand(),20))+'px') | |
| .style('text-anchor',(xScale(0)<(dim.graphWidth*0.5))?'start':'end') | |
| .attr('y',yScale.rangeBand()*0.5) | |
| .attr('dx',(xScale(0)<(dim.graphWidth*0.5))?8:-8) | |
| .text(function(d){return (d.value===void 0)?d.text:'';}); | |
| } | |
| d3.select('input').property('value','-1 0 1 2'); | |
| update_graph([-1,0,1,2].map(function(d){return {value:d,text:''+d};})); | |
| </script> |