iT邦幫忙

DAY 14
2

SVG 與 D3.js系列 第 14

D3.js 軸線(Axis)

  • 分享至 

  • xImage
  •  

完整範例:http://wcc723.github.io/d3js/2014/10/13/Ironman-30-days-14/

到上一次為止,其實就可以畫出簡單的資料圖表,現在開始就要讓資料圖表更為豐富且好閱讀。

今天要介紹的軸線(Axis),讓圖表上多一個可以閱讀的尺標,D3.js正好有提供這樣的函式,可以輕鬆的產出軸線。

如果要憑空畫出這樣的軸線(Axis),說實在還有點複雜,D3提供的函式d3.svg.axis(),只要這短短一行就能產生軸線,並且加上尺度.scale()就完成一半了,剩下就只要調整位置、刻度範圍、單位等等就完成了。

所以這範例,主要也是看程式碼,加油吧!

Demo

var w = 600,h = 400,padding = 30;

//random data
var dataset = [];
var numDataPoints = 100; //總共100個點
var xRange = Math.random() * 500;
var yRange = Math.random() * 1000;
for (var i = 0; i < numDataPoints; i++){
	var num1 = Math.floor(Math.random() * xRange);
	var num2 = Math.floor(Math.random() * yRange);
	dataset.push([num1,num2])
}//和更早之前一樣,我們用假的資料來做範例
console.table(dataset)


var Xmax = d3.max(dataset, function(d){return d[0]}),
	Xmin = d3.min(dataset, function(d){return d[0]}),
	Ymax = d3.max(dataset, function(d){return d[1]}),
	Ymin = d3.min(dataset, function(d){return d[1]})
	//取得X,Y的最大及最小值

var xScale = d3.scale.linear() //製作線性尺度
	.domain([0, Xmax]) //輸入的範圍
	.range([padding , w - padding]) //輸出的範圍


var yScale = d3.scale.linear()
	.domain([0, Ymax])
	.range([ h - padding ,padding])




var svg = d3.select('.demo').append('svg').attr({'width': w,'height': h}) //增加SVG容器
	
	svg.selectAll('circle').data(dataset).enter() //插入資料
	.append('circle') //增加圓形物件
	.attr({
		'cx': function(d){return xScale(d[0])}, //利用尺度算出圓心x位置
		'cy': function(d){return yScale(d[1])}, //同上算出y
		'r': '2px', //圓心大小
		'fill': 'black' //填色
	});

	svg.selectAll('text').data(dataset).enter() //插入資料
	.append('text') //增加文字區塊
	.text(function(d){ return d[0]+ ',' + d[1]}) //補上坐標文字
	.attr({
		'x': function(d){return xScale(d[0])},
		'y': function(d){return yScale(d[1])},
		'fill': 'red', //填滿紅色
		'font-size': '10px' //文字大小
	});

//Axis
var xAxis = d3.svg.axis().scale(xScale) //增加軸線物件,並套用尺度(x)
	.orient("bottom") //標示位置
	.ticks(6) //刻度數量

var yAxis = d3.svg.axis().scale(yScale) //增加軸線物件,並套用尺度(y)
	.orient("left") //標示位置
	.ticks(10) //刻度數量

//刻度化標籤,這範例不使用
// var formatAsAxis = d3.format('.1%');
// xAxis.tickFormat(formatAsAxis);
//刻度化標籤


svg.append('g').attr('class', 'axis') //增加一個群組並加上class="axis"
	.attr('transform', 'translate(0, '+ (h - padding) +')') //移動到下方
	.call(xAxis); //將軸線匯入

svg.append('g').attr('class', 'axis')
	.attr('transform', 'translate('+ (padding) +')', 0) //移動到左方
	.call(yAxis);

剛剛最後還有加Class,別忘了...,記得補上喔。

.axis path, .axis line{
	fill: none;
	stroke: SlateGray;
	shape-rendering: cirspEdges;
}
.axis text{
	font-size: 11px;
	fill: #999;
}

上一篇
D3.js 讀取CSV資料並繪製成長條圖
下一篇
D3.js 折線圖(Line Chart)
系列文
SVG 與 D3.js30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言