第3節中作了一個圖標,但沒有爲它添加一個相應的座標軸,這樣不知道每個柱形到底有多長。這一節作一個座標軸。javascript
D3中的座標軸都是以 svg 圖的形式出現的,這也是爲何在第3節中要使用 svg 的方法作柱形圖的緣由。第4節裏咱們講解了 scale (比例)的用法,在作座標軸的時候也須要用到比例。第4節中,咱們說到scale 是一個函數,這一節中的座標軸也是一個函數,可是用法卻有點不一樣,要注意。css
看下面的代碼,咱們分別定義數據,scale (比例),座標軸:java
- var dataset = [ 30 , 20 , 45 , 12 , 21 ];
- var xScale = d3.scale.linear()
- .domain([0,d3.max(dataset)])
- .range([0,500]);
- var axis = d3.svg.axis()
- .scale(xScale)
- .orient("bottom");
1-4行是定義數據和 scale (比例),關於比例的內容可看上一節。app
5-7是定義座標軸:dom
- d3.svg.axis() 調用這個函數就會生成一個座標軸的函數
- scale() 這個函數用於指定座標軸的 scale (比例)
- orient() 這個函數用於指定座標軸的分割點和數字的朝向,在哪一個方向顯示。 bottom 表示在座標軸的下方顯示。
畫出座標軸的代碼以下:
- svg.append("g")
- .call(axis);
在 svg 中添加一個g,g是 svg 中的一個屬性,是 group 的意思,它表示一組什麼東西,如一組 lines , rects ,circles 其實座標軸就是由這些東西構成的。
上面還調用了一個 call 函數,這個比較重要。在 D3 中,call 至關於定義一個函數,再把選擇的元素給它,即至關於以下代碼:
- function foo(selection) {
- selection
- .attr("name1", "value1")
- .attr("name2", "value2");
- }
- foo(d3.selectAll("div"))
這段代碼等同於:
- d3.selectAll("div").call(foo);
因此 svg.append("g").call(axis) 就至關於將選擇的g元素傳給 axis 函數。
調用以後,座標軸就會顯示在相應的 svg 中。
還能夠定義幾個css樣式改變座標軸的粗細,字體等等。 transform 屬性用於移動座標軸在 svg 中的位置。
- svg.append("g")
- .attr("class","axis")
- .attr("transform","translate(10,160)")
- .call(axis);
完整的代碼以下:
- <style>
-
- .axis path,
- .axis line{
- fill: none;
- stroke: black;
- shape-rendering: crispEdges;
- }
-
- .axis text {
- font-family: sans-serif;
- font-size: 11px;
- }
-
- </style>
-
- <body>
-
- <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
- <script>
-
- var width = 600;
- var height = 600;
- var dataset = [ 30 , 20 , 45 , 12 , 21 ];
-
- var svg = d3.select("body").append("svg")
- .attr("width",width)
- .attr("height",height);
-
- var xScale = d3.scale.linear()
- .domain([0,d3.max(dataset)])
- .range([0,500]);
-
- var axis = d3.svg.axis()
- .scale(xScale)
- .orient("bottom");
-
- svg.append("g")
- .attr("class","axis")
- .attr("transform","translate(10,160)")
- .call(axis);
-
- svg.selectAll("rect")
- .data(dataset)
- .enter()
- .append("rect")
- .attr("x",10)
- .attr("y",function(d,i){
- return i * 30;
- })
- .attr("width",xScale)
- .attr("height",28)
- .attr("fill","red");
-
- </script>
結果以下圖: