在绘制二维数组的动态图表之前,我们先来理一下思路:
1、我们需要绘制一张图表;
2、这张图表的数据来源是二维数组;
3、这张图表有动态效果。
那么,我们一步一步来:
首先,我们来随意写一串二维数组,确定数据来源:
var data =[[1993,10],[1998,20],[2002,25],[2007,30],[2010,50],[2015,80],[2016,90]]
然后,我们来定义好整个图表所需要的宽高以及svg的宽高:
var width =1000,//放置柱形图的宽度
height =500,//放置柱形图的高度
margin={left:30,top:30,right:30,bottom:30}
svg_width = width+margin.left+margin.right,
svg_height =height+margin.top+margin.bottom;
但是,二维数组的坐标应该如何绘制呢?
var scale_x = d3.scale.ordinal()
.domain(data.map(function(d){
return d[0]
}))
.rangeBands([0,width],0.1)
var scale_y = d3.scale.linear()
.domain([0,d3.max(data,function(d){
return d[1]
})])
.range([height,0])
var svg = d3.select("#container")
.append("svg")
.attr("width",svg_width)
.attr("height",svg_height)
var chart = svg.append("g")
.attr("transform","translate("+margin.left+","+margin.top+")");
//添加坐标轴
var x_axis = d3.svg.axis().scale(scale_x),
y_axis = d3.svg.axis().scale(scale_y).orient("left");
chart.append("g")
.call(x_axis)
.attr("transform","translate(0,"+height+")")
chart.append("g")
.call(y_axis)
.append("text")
.text("数量(个)")
.attr("transform","rotate(-90)")
.attr("dy","1em")
.attr("text-anchor","end");
我们可以看到,在
scale_x.domain 这里是采用了
data.map() 这个函数,以此可以直接返回数组形式的值
最后我们来进行柱形图的绘制,在这里我将直接把动画效果的代码也附上,大家注意看注释:
//绘制柱状图
var bar = chart.selectAll(".bar")
.data(data)
.enter()
.append("g")
.attr("class","bar")
.attr("transform",function(d,i){return "translate("+scale_x(d[0])+",0)";})
//这里将开始动画设置
bar.append("rect")
.attr("y",function(d,i){
return 500
})//动画开始的y值
.attr("height",0)//动画开始高度
.attr("fill","red")//动画开始颜色
.transition()//实现动态效果函数
.duration(3000)//指定整个转变持续的时间,单位为毫秒
.ease("elastic")//指定转变的方式,linear:普通的线性变化;circle:慢慢地到达变换的最终状态;elastic带有弹跳的到达最终状态;bounce在最终状态处弹跳几次.
.delay(function(d,i){
return 200*i;
})//指定延迟的时间,表示一定时间后才开始转变,单位同样为毫秒
.attr("y",function(d,i){
return scale_y(d[1])
})
.attr("width",function(){
return scale_x.rangeBand()
})
.attr("height",function(d,i){
return height-scale_y(d[1])
})
.attr("fill","steelblue")//动画结束后显示的颜色
//添加数据显示
bar.append("text")
.text(function(d){return d[1]})
.attr("y",function(d){return scale_y(d[1])})
.attr("x", function(d,i){
return scale_x.rangeBand()/3;
})//注意这里是rangeBand而不是rangeBands。ordinal.rangeBands - 指定输出范围为连续区间。ordinal.rangeBand - 获取区间段的宽度。
.attr("dy",15)
.attr("text-anchor","center")
.attr("fill","white")
那么简单的二维数组的动态图表就完成咯~