第八章 完整的柱形图

一个完整的柱形图包含三部分:矩形、文字、坐标轴。本章将对前几章的内容进行综合的运用,制作一个实用的柱形图,内容包括:选择集、数据绑定、比例尺、坐标轴等内容。

柱形图

添加 SVG 画布

  1. //画布大小
  2. var width = 400;
  3. var height = 400;
  4. //在 body 里添加一个 SVG 画布
  5. var svg = d3.select("body")
  6. .append("svg")
  7. .attr("width", width)
  8. .attr("height", height);
  9. //画布周边的空白
  10. var padding = {left:30, right:30, top:20, bottom:20};

上面定义了一个 padding,是为了给 SVG 的周边留一个空白,最好不要将图形绘制到边界上。

定义数据和比例尺

  1. //定义一个数组
  2. var dataset = [10, 20, 30, 40, 33, 24, 12, 5];
  3. //x轴的比例尺
  4. var xScale = d3.scale.ordinal()
  5. .domain(d3.range(dataset.length))
  6. .rangeRoundBands([0, width - padding.left - padding.right]);
  7. //y轴的比例尺
  8. var yScale = d3.scale.linear()
  9. .domain([0,d3.max(dataset)])
  10. .range([height - padding.top - padding.bottom, 0]);

x 轴使用序数比例尺,y 轴使用线性比例尺。要注意两个比例尺值域的范围。

定义坐标轴

  1. //定义x轴
  2. var xAxis = d3.svg.axis()
  3. .scale(xScale)
  4. .orient("bottom");
  5. //定义y轴
  6. var yAxis = d3.svg.axis()
  7. .scale(yScale)
  8. .orient("left");

x 轴刻度的方向向下,y 轴的向左。

添加矩形和文字元素

  1. //矩形之间的空白
  2. var rectPadding = 4;
  3. //添加矩形元素
  4. var rects = svg.selectAll(".MyRect")
  5. .data(dataset)
  6. .enter()
  7. .append("rect")
  8. .attr("class","MyRect")
  9. .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  10. .attr("x", function(d,i){
  11. return xScale(i) + rectPadding/2;
  12. } )
  13. .attr("y",function(d){
  14. return yScale(d);
  15. })
  16. .attr("width", xScale.rangeBand() - rectPadding )
  17. .attr("height", function(d){
  18. return height - padding.top - padding.bottom - yScale(d);
  19. });
  20. //添加文字元素
  21. var texts = svg.selectAll(".MyText")
  22. .data(dataset)
  23. .enter()
  24. .append("text")
  25. .attr("class","MyText")
  26. .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  27. .attr("x", function(d,i){
  28. return xScale(i) + rectPadding/2;
  29. } )
  30. .attr("y",function(d){
  31. return yScale(d);
  32. })
  33. .attr("dx",function(){
  34. return (xScale.rangeBand() - rectPadding)/2;
  35. })
  36. .attr("dy",function(d){
  37. return 20;
  38. })
  39. .text(function(d){
  40. return d;
  41. });

矩形元素和文字元素的 x 和 y 坐标要特别注意,要结合比例尺给予适当的值。

添加坐标轴的元素

  1. //添加x轴
  2. svg.append("g")
  3. .attr("class","axis")
  4. .attr("transform","translate(" + padding.left + "," + (height - padding.bottom) + ")")
  5. .call(xAxis);
  6. //添加y轴
  7. svg.append("g")
  8. .attr("class","axis")
  9. .attr("transform","translate(" + padding.left + "," + padding.top + ")")
  10. .call(yAxis);

坐标轴的位置要结合空白 padding 的值来设定。

源代码

下载地址:rm51.zip

展示地址:http://www.ourd3js.com/demo/rm/R-5.1/Chart.html