Node+D3+Vue3

实验目的:

使用vue制作一个包含d3直方图的网页 再加上一个饼图、词云图或力导向图

实验过程

1. 安装Vue

1.1 下载nodejs

https://nodejs.org #下载地址

 1.2 安装cnpm

在管理员终端运行以下命令:

npm install -g cnpm --registry=https://registry.npm.taobao.org

1.3 安装调试工具

下载地址:

https://github.com/vuejs/devtools#/vue-devtools

1.4 下载vue3

https://cn.vuejs.org/

1.5 安装npm和命令工具 CLI

cnpm install vue

cnpm install -g vue-cli

1.6 测试安装结果

 2 使用vue制作包含d3的可视化图表

2.1 直方图

2.1.1 定义数据和比例尺

  • const data= [16.2,17.5,24.2,1.7,7.8,5.8,3,2.2,5.8];
        let name=['运输','建筑物','工业','农渔业','未分配燃料','无组织排放','水泥','化工','家畜','运输业','建筑物','工业','农渔业','燃料','排放','水泥','化工','  家畜'];
        let margin = 30; // 上下左右边距
        let svg = d3.select('svg');
        let width = svg.attr('width');
        let height = 480;
    
        let g = svg.append('g')
                    .attr("transform", 'translate('+ margin +','+ margin +')'); 
    
        let scaleX = d3.scaleBand()
                         .domain(d3.range(data.length))
                         .rangeRound([0,width - margin*2]);
               
          let scaleY = d3.scaleLinear()
                         .domain([0,d3.max(data)])
                         .range([height - margin * 2,0]); 

2.1.2 绘制矩形以及定义过渡效果 

  •  gs.append('rect')
            .attr('x', function(d,i){
              return scaleX(i) + rectP/2;
            })
            .attr('y',function(d,i){
              var min = scaleY.domain()[0];
              return scaleY(min); 
            })
            .attr('width',function(d,i){
              return scaleX.step() - rectP+10;
            })
            .attr('height',function(d,i){
              return 0;
            })
            .attr('fill',function(d,i){
              return color[i]; 
            })
            .transition() 
            .duration(800)
            .delay(function(d,i){
              return i*200 
            })
            .attr('y',function(d,i){
              return scaleY(d)
            })
            .attr('height',function(d,i){
              return height - margin * 2 - scaleY(d)
            })

    2.1.3 定义标签文字

  • gs.append('text')
            .attr('x',function(d,i){
              return scaleX(i) + rectP-10;
            })
            .attr('y',function(d,i){
              return height - 2 * margin;
            })
            .attr('dx',function(d,i){
              return -10;
            })
            .attr('dy',function(d,i){
              return 20;
            })
            .text(function(d,i){
              return d;
            })
            .attr('fill',function(d,i){
              return color[i];
            })
            .transition()
            .duration(1500)
            .delay(function(d,i){
              return i*200;
            })
            .attr('y',function(d,i){
              return scaleY(d) - 30
            })

2.1.4 在App.vue里引入该组件

 

2.1.5 实验截图

 2.2 饼图

2.2.1 定义svg画布

let w=window.innerWidth 
            || document.documentElement.clientWidth 
            || document.body.clientWidth;

            let h=window.innerHeight
            || document.documentElement.clientHeight
            || document.body.clientHeight;
            w=w*0.98;
            h=h*0.98;
            let svg=d3.select("#pie")
                    .append("svg")
                    .attr("width",w)
                    .attr("height",h);

2.2.2 定义数据信息和颜色信息

let dataset=[["Energy",73.2],["Industrial processes",5.2],["Waste",3.2],["Agriculture,Forestry",18.4]];
            
            
            let pie=d3.pie()
                        .value(d=>d[1]);
            let piedata=pie(dataset);
            let color=["#B22222","#8B7E66","#548B54","#4682B4"];
            let text_color=["#8B1A1A","black","#006400","#104E8B"]

2.2.3 设置弧,绘制环形

  • let arc=d3.arc()
                                .innerRadius(100)
                                .outerRadius(200)
                let arcs=svg.selectAll("g")
                            .data(piedata)
                            .enter()
                            .append("g")
                            .attr("transform","translate("+(w/2)+","+(h/2)+")");
                arcs.append("path")
                    .attr("d",d=>arc(d))
                    // .attr("fill","#7bbfea")
                    .attr("fill",(d,i)=>color[i])
                    .attr("stroke","white")
                    .on("mouseover",(item)=>{
                        d3.select(item.target)
                            .attr("fill","#f8aba6")
                    })
                    .on("mouseout",(item,i)=>{
                        d3.select(item.target)
                            .attr("fill",()=>color[i.index])
                    });            

    2.2.4 添加标签文字

svg.selectAll("text")
                .data(piedata)
                .enter()
                .append("text")
                .attr("fill","white")
                .attr("text-anchor","middle")
                .attr("font-size",function(d){
                    return (23+d.data[1]*0.5)/2;
                })
                .attr("transform",function(d){
                    let x=arc.centroid(d)[0];
                    let y=arc.centroid(d)[1];
                    return "translate("+(w/2+x)+","+(h/2+y)+")";
                })
                .text(function(d){return d.value+"%"});

2.2.5 实验截图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值