zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    You are not late! You are not early!
    在同一个服务器(同一个IP)为不同域名绑定的免费SSL证书
    Vue.js Is Good, but Is It Better Than Angular or React?
    It was not possible to find any compatible framework version
    VS增加插件 Supercharger破解教程
    Git使用ssh key
    Disconnected: No supported authentication methods available (server sent: publickey)
    VS 2013打开.edmx文件时报类型转换异常
    asp.net MVC4 框架揭秘 读书笔记系列3
    asp.net MVC4 框架揭秘 读书笔记系列2
  • 原文地址:https://www.cnblogs.com/ximenchuifa/p/13976232.html
Copyright © 2011-2022 走看看