如何用D3.js绘制柱状图

 我来答
想吃什么我给你做
高粉答主

2016-08-28 · 光怪陆离,荧惑守心,历史风云,说给你听
想吃什么我给你做
采纳数:19185 获赞数:92680

向TA提问 私信TA
展开全部

  1、模拟数据

  // 模拟100条0-100的随机数,作为柱状图的高度
var data = Array.apply(0, Array(100)).map(function() {
 return Math.random() * 100;
});

  2、创建SVG容器

  var margin = {top: 20, right: 20, bottom: 30, left: 50},
   width = document.body.clientWidth - margin.left - margin.right,
   height = 500 - margin.top - margin.bottom;

var chart = d3.select('body')
 .append('svg')
 .attr('width', width + margin.left + margin.right)
 .attr('height', height + margin.top + margin.bottom)
 .append('g')
 .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')');

  chart就是最终建立的容器,下面就往容器里面放元素。

  3、画柱状图

  // 计算每根柱状物体的宽度
var barWidth = width / data.length;
// 用g作每根柱状物体的容器,意义可类比div
// 前一篇文章已经介绍过selectAll的意义,即生成占位符,等待填充svg图形
var bar = chart.selectAll('g')
 .data(data)
 .enter()
 .append('g')
 // 接收一个数据填充一个g元素
 // 同时为g设置位置
 .attr('transform', function(d, i) {
   return 'translate(' + i * barWidth + ', 0)';
 });

bar.append('rect')
 // 添加一个矩形
 .attr('y', function(d) {
   return height - d;
 })
 .attr('height', function(d) {
   return d;
 })
 .attr('width', barWidth - 1);

  前文提到svg的元素定位都是基于整个svg容器左上角作为原点,但并不能使用position: absolute等方法定位,此处的g元素通过位移来定位x坐标,即transform: translate(x, 0)。

  这里的bar可类比jQuery对象,是一个类数组对象,bar调用的方法都会对bar里面每个对象进行调用。代码中每一次调用都插入一个矩形,同时设置y坐标、高度和宽度,x坐标跟父容器(g)保持一致即可。这里需要注意y坐标往下为正,为了让所有矩形的下边处于同一高度,这里设置每个矩形的y坐标为容器高度减去矩形高度。为了用一像素区分开每个矩形,这里设置矩形宽度为父容器的宽度减1。

  通过以上js代码再稍微设置一点css

  rect {
 fill: #2177BB;
}

  即可看到一张最简单的柱状图了。

  

  4、添加坐标轴

  var y = d3.scale.linear()
 .domain([0, d3.max(data)])
 .range([height, 0]);
var xAxis = d3.svg.axis()
 .scale(x)
 .orient('bottom')
 .ticks(1);
var yAxis = d3.svg.axis()
 .scale(y)
 .orient('left');
// 添加x坐标轴
chart.append('g')
 .attr('class', 'x axis')
 .attr('transform', 'translate(0,' + height + ')')
 .call(xAxis);
// 添加y坐标轴
chart.append('g')
 .attr('class', 'y axis')
 .call(yAxis);

  完整的柱状图就是这样了

  

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式