第七章 坐标轴

    在 SVG 画布的预定义元素里,有六种基本图形:

    • 矩形
    • 圆形
    • 椭圆
    • 线段
    • 折线
    • 多边形

    另外,还有一种比较特殊,也是功能最强的元素:

    • 路径

    画布中的所有图形,都是由以上七种元素组成。

    显然,这里面没有坐标轴 这种元素。如果有的话,我们可以采用类似以下的方式定义:

    很可惜,没有这种元素。但是,这种设计是合理的:不可能为每一种图形都配备一个单独的元素,那样 SVG 就会过于庞大。

    因此,我们需要用其他元素来组合成坐标轴,最终使其变为类似以下的形式:

    1. <!-- 第一个刻度 -->
    2. <g>
    3. <line></line> <!-- 第一个刻度的直线 -->
    4. <text></text> <!-- 第一个刻度的文字 -->
    5. </g>
    6. <!-- 第二个刻度 -->
    7. <g>
    8. <text></text> <!-- 第二个刻度的文字 -->
    9. </g>
    10. ...
    11. <!-- 坐标轴的轴线 -->
    12. <path></path>
    13. </g>

    如果需要手动添加这些元素就太麻烦了,为此,D3 提供了一个组件:d3.svg.axis()。它为我们完成了以上工作。

    上一章提到了比例尺的概念,要生成坐标轴,需要用到比例尺,它们二者经常是一起使用的。下面,在上一章的数据和比例尺的基础上,添加一个坐标轴的组件。

    1. var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
    2. //定义比例尺
    3. var linear = d3.scale.linear()
    4. .domain([0, d3.max(dataset)])
    5. .range([0, 250]);
    6. var axis = d3.svg.axis()
    7. .scale(linear) //指定比例尺
    8. .orient("bottom") //指定刻度的方向
    9. .ticks(7); //指定刻度的数量

    第 1 – 2 行:定义数组。

    第 4 – 7 行:定义比例尺,其中使用了数组 dataset。

    第 9 – 12 行:定义坐标轴,其中使用了线性比例尺 linear。其中:

    • d3.svg.axis():D3 中坐标轴的组件,能够在 SVG 中生成组成坐标轴的元素。
    • scale():指定比例尺。
    • orient():指定刻度的朝向,bottom 表示在坐标轴的下方显示。

    定义了坐标轴之后,只需要在 SVG 中添加一个分组元素 ,再将坐标轴的其他元素添加到这个 里即可。代码如下:

    上面有一个 call() 函数,其参数是前面定义的坐标轴 axis。

    1. function foo(selection) {
    2. selection
    3. .attr("name1", "value1")
    4. .attr("name2", "value2");
    5. foo(d3.selectAll("div"))

    1. d3.selectAll("div").call(foo);

    因此,

    1. axis(svg.append(g));

    默认的坐标轴样式不太美观,下面提供一个常见的样式:

    1. <style>
    2. .axis path,
    3. .axis line{
    4. fill: none;
    5. stroke: black;
    6. shape-rendering: crispEdges;
    7. }
    8. .axis text {
    9. font-family: sans-serif;
    10. font-size: 11px;

    分别定义了类 axis 下的 path、line、text 元素的样式。接下来,只需要将坐标轴的类设定为 axis 即可。

    坐标轴的位置,可以通过 transform 属性来设定。

    通常在添加元素的时候就一并设定,写成如下形式:

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