d3 绘制动态柱状图
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>svg</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<style type="text/css">
svg{
background-color: #DDD;
}
.axis line,.axis path{
fill:none;
stroke:black
}
</style>
</head>
<body>
</body>
<script type="text/javascript">
// 绘制柱状态
let width=500,height=500,num=30;
// 定义数据源 学员成绩
let score=[60,50,80,35,70,40]
let text=['语文','数学','英语','化学','物理','体育'];
// 1 创建svg容器
let svg = d3.select('body').append('svg').attr('width',width).attr('height',height);
// 需要创建g元素 相当于 block 只起到包裹元素作用 方便后期代码维护管理
let g = svg.append('g').attr('transform',`translate(${num},${num})`)
// // 定义比例尺
// let scaleY = d3.scale.linear().domain([0,d3.max(score)]).range([0,height-num*2])
let scaleY = d3.scale.linear().domain([0,d3.max(score)]).range([height-num*2,0])
let scaleX = d3.scale.ordinal().domain(text).rangeRoundBands([0,width-num*2],0.4)
// 颜色比例尺
let color = d3.scale.category10();
// 往g元素中追加rect矩形(根据数据) 绘制柱状图
//ease(): linear:线性 circle:缓慢 elastic:带有弹跳的到达最终状态 bounce:最后跳动
// transition:开启动画过度效果
// duration:指定每个元素的动画持续时间
// delay:指定每个元素的动画延迟时间
g.selectAll('rect').data(score).enter()
.append('rect')
.attr('x',(d,i)=>{return scaleX(text[i])})
// .attr('y',(d,i)=>{return scaleY(d)})
.attr('y',(d,i)=>{return height-num*2})
.attr('width',()=>{return scaleX.rangeBand()})
// .attr('height',(d,i)=>{return height-num*2-scaleY(d)})
.attr('height',(d,i)=>{return 0})
.attr('fill',(d,i)=>{return color(i)})
.on('mouseover',function(){
d3.select(this).attr('fill','yellow')
})
.on('mouseout',function(d,i){
d3.select(this).transition().duration(500).attr('fill',()=>{
return color(i)
})
})
.transition()
.duration(1000)
.delay((d,i)=>{
return i*400
})
.ease('bounce')
.attr('y',(d,i)=>{return scaleY(d)})
.attr('height',(d,i)=>{return height-num*2-scaleY(d)})
// 给柱状图添加文本描述
g.selectAll('text').data(score).enter()
.append('text')
.attr('x',(d,i)=>{return scaleX(text[i])})
.attr('y',(d,i)=>{return height-num*2})
.attr('dx',(d,i)=>{return 6})
.attr('dy',(d,i)=>{return -5})
.text((d,i)=>{return d})
.attr('fill',(d,i)=>{return color(i)})
.transition()
.duration(1000)
.delay((d,i)=>{
return i*400
})
.ease('bounce')
.attr('y',(d,i)=>{return scaleY(d)})
// .attr('height',(d,i)=>{return height-num*2-scaleY(d)})
// 绘制比例尺 axis() orient() 控制文本在轴的展示方向问题 left right top bottom
let x = d3.svg.axis().scale(scaleX)
let y = d3.svg.axis().scale(scaleY).orient('left')
// 追加比例尺
g.append('g').attr('class','axis').call(x).attr('transform',`translate(0,${height-num*2})`)
g.append('g').attr('class','axis').call(y)
</script>
</html>

不停学习,热爱是源源不断的动力。

浙公网安备 33010602011771号