為了來了解d3.svg.axis()
其他的api用途,這邊要做一點變化,把原來的資料改成用百分比的方式來呈現。
比例尺做一點修改,把定義域範圍直接改為0~1(代表0%~100%)。
var xScale = d3.scale.linear()
.domain([0,1])
.range([0,xAxisWidth])
var yScale = d3.scale.linear()
.domain([1,0]) // 為了讓y軸數字由下往上所以參數倒過來放 [最大值, 最小值]
.range([0,yAxisWidth])
再來開始繪製刻度。這裡的寫法和前一篇大致相同,但多了ticks()
、tickFormat()
、tickSize()
三個方法。
tick()
設定刻度的數量tickFormat()
設定資料格式,在這邊修改為百分比的資料格式tickSize()
使用此方法後可以加上分隔線,裡面的兩個參數分別是隔線和外框,正數是往外負數是往內(往圖表中間的方向)。所以這兩個參數都加上圖表的寬/高並加上負數及可。
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(5)
.tickFormat(function(d){
return d * 100 + '%'
})
.tickSize(-yAxisWidth,-yAxisWidth)
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
.ticks(5)
.tickFormat(function(d){
return d * 100 + '%'
})
.tickSize(-xAxisWidth,-xAxisWidth)
最後在svg上加入<g>
標籤,並使用call()
傳入剛才所寫的axis()
的回傳變數即可。
var xAxisG = svg.append('g')
.attr("transform","translate("+padding.left+","+(padding.top + yAxisWidth)+")")
.classed("xAxis",true)
.call(xAxis)
var yAxisG = svg.append('g')
.attr("transform","translate("+padding.left+","+padding.top+")")
.classed("yAxis",true)
.call(yAxis)
同樣的為了讓隔線好看一點,這邊有自訂了css樣式
.xAxis line, .yAxis line {
fill:none;
stroke:rgba(0,0,0,.1);
}
.xAxis path, .yAxis path{
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.xAxis text, .yAxis text {
font-family: sans-serif;
font-size: 11px;
}
再來,要把資料點繪製上去。暫不考慮更新資料的方法,所以直接使用enter()
把元素加入即可。
這邊要加入的元素是<circle>
,使用fill()
來填色,cx
、cy
設定圓心點的坐標、r
設定圓的半徑。
其中坐標也是使用剛才所寫好的坐標尺函式,將資料傳入參數就可以計算出在畫面上的位置。
var circle = svg.selectAll("circle")
.data(dataSet)
.enter()
.append("circle")
.attr("fill","black")
.attr("cx",function(d){
return padding.left + xScale(d[0])
})
.attr("cy",function(d){
return padding.top + yScale(d[1])
})
.attr("r",5)
完成的結果
程式碼有上傳到jsfiddle:http://jsfiddle.net/upstairs0102/pu9z3ygc/