直接使用:
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<html>
<head>
<meta charset="utf-8">
<title>d3.js</title>
</head>
<body>
<p>Hello World 1</p>
<p>Hello World 2</p>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
d3.select("body").selectAll("p").text("www.ourd3js.com");
var dataset = ["I like dog","I like cat","I like snake"];
var body = d3.select("body");
var p = body.selectAll("p");
p.data(dataset)
.text(function(d, i){
return d;
});
</script>
</body>
</html>
使用 d3.select() 或 d3.selectAll() 选择元素后返回的对象,就是选择集。
简单的图表例子:
var width = 300; //画布的宽度
var height = 300; //画布的高度
var svg = d3.select("body") //选择文档中的body元素
.append("svg") //添加一个svg元素
.attr("width", width) //设定宽度
.attr("height", height); //设定高度
// svg.append("rect");
var dataset1 = [ 2.5 , 1.3 , 0.9, 2.1 , 1.7 ]; //数据(表示矩形的宽度)
var linear = d3.scale.linear().domain([0, d3.max(dataset1)]).range([0,250])
var rectHeight = 25;
svg.selectAll("rect").data(dataset1).enter().append('rect')
.attr('x',20).attr('y',function(d,i){
return i * rectHeight
})
.attr('width',function(d){
return linear(d); //在这里用比例尺
})
.attr('height',rectHeight-2).attr('fill','blue');
比例尺:将某一区域的值映射到另一区域,其大小关系不变。
定义域 domain 值域 range 通过指定范围可得到一个计算关系
// 将 dataset 中最小的值,映射成 0;将最大的值,映射成 300
var dataset = [1.2, 2.3, 0.9, 1.5, 3.3];
var min = d3.min(dataset);
var max = d3.max(dataset);
var linear = d3.scale.linear()
.domain([min, max])
.range([0, 300]);
linear(0.9); //返回 0
linear(2.3); //返回 175
linear(3.3); //返回 300
d3.scale.linear() 返回一个线性比例尺。domain() 和 range() 分别设定比例尺的定义域和值域。
d3.max()取数组最大值 d3.min()取数组最小值
var index = [0, 1, 2, 3, 4];
var color = ["red", "blue", "green", "yellow", "black"];
var ordinal = d3.scale.ordinal()
.domain(index)
.range(color);
ordinal(0); //返回 red
ordinal(2); //返回 green
ordinal(4); //返回 black
d3.scale.ordinal() 返回一个序数比例尺
坐标轴:d3.svg.axis()
//数据
var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
//定义比例尺
var linear = d3.scale.linear()
.domain([0, d3.max(dataset)])
.range([0, 250]);
var axis = d3.svg.axis()
.scale(linear) //指定比例尺
.orient("bottom") //指定刻度的方向
.ticks(7); //指定刻度的数量
svg.append("g") //添加到svg
.call(axis);
完整的柱形图:
var dataset1 = [ 2.5 , 1.3 , 0.9, 2.1 , 1.7 ]; //数据(表示矩形的宽度)
var rectHeight = 25;
var xScale = d3.scale.linear().domain([0, d3.max(dataset1)]).range([0,250]);
var yScale = d3.scale.ordinal().domain(d3.range(dataset1.length)).rangeRoundBands([0, rectHeight * dataset1.length]);
//添加矩形元素
svg.selectAll("rect").data(dataset1).enter().append('rect')
.attr('x',20).attr('y',function(d,i){
return i * rectHeight
})
.attr('width',function(d){
return xScale(d)
})
.attr('height',rectHeight-2).attr('fill','blue')
.on('mouseover',function(d,i){
d3.select(this).attr('fill','yellow');
})
.on('mouseout',function(d,i) {
d3.select(this).transition().duration(500).attr('fill','blue')
});
//添加文字元素
var texts = svg.selectAll('text').data(dataset1).enter().append('text')
.attr('transform','translate(5,10)')
.attr('x', function(d,i){
return xScale(d) - 15
})
.attr('y', function(d,i){
return i * rectHeight + (rectHeight-10)/2
})
.text(function(d){
return d;
}).attr('fill','white');
var Xaxis = d3.svg.axis()
.scale(xScale) //指定比例尺
.orient("bottom") //指定刻度的方向
.ticks(7); //指定刻度的数量
var Yaxis = d3.svg.axis()
.scale(yScale)
.orient("left");
//添加x轴
svg.append("g") //添加到svg
.attr("class","axis")
.attr("transform","translate(20,130)")
.call(Xaxis);
//添加y轴
svg.append("g") //添加到svg
.attr("class","axis")
.attr("transform","translate(20,0)")
.call(Yaxis);
// 为柱状图的文字元素实现动态效果
texts.attr("x",function(d){
var min = xScale.domain()[0];
return xScale(min);
}).transition().delay(function(d,i){
return i * 200
}).duration(2000).ease('bounce')
.attr('x', function(d,i){
return xScale(d) - 15
})
交互操作
用户用于交互的工具一般有三种:鼠标、键盘、触屏。
var circle = svg.append("circle");
circle.on("click", function(){
//在这里添加交互内容
console.log(d3.event); //当某个事件被监听到时,D3 会把当前的事件存到 d3.event 对象,里面保存了当前事件的各种参数
});
在 D3 中,每一个选择集都有 on() 函数,用于添加事件监听器。
on() 的第一个参数是监听的事件,第二个参数是监听到事件后响应的内容,第二个参数是一个函数。
饼图demo:
// 饼图
var svg1 = d3.select("body") //选择文档中的body元素
.append("svg") //添加一个svg元素
.attr("width", width) //设定宽度
.attr("height", height); //设定高度
var dataset2 = [ 30 , 10 , 43 , 55 , 13 ];
var pie = d3.layout.pie();
var piedata = pie(dataset2)
var color = d3.scale.category10(); //有十种颜色的颜色比例尺
var outerRadius = 150;
var innerRadius = 0;
var arc = d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius);
var arcs = svg1.selectAll('g').data(piedata).enter().append('g')
.attr('transform','translate('+ (width/2) + ','+ (width/2) +')');
arcs.append('path').attr('fill',function(d,i){
return color(i);
}).attr('d',function(d){
return arc(d)
})
arcs.append('text').attr('transform',function(d) {
return 'translate('+ arc.centroid(d) +')'
}).attr('text-anchor', 'middle')
.text(function(d){
return d.data;
})
五年web前端经验
H5静态页面 需要交互 联调接口的项目 bug解决
有需求可以私信我