第三章——vue、d3进阶之完整的柱状图

1、效果图,图中有数据值,x轴坐标,y轴轴

2、代码

<template>
  <div id="mydiv">
    <!-- <svg>
      <rect></rect>
    </svg> -->
  </div>
</template>
<script>
import * as d3 from "d3";
export default {
  mounted(){
    this.getlist();
  },
  created(){
    // this.getlinear();
  },
  methods:{
    // getlinear(){},
    getlist(){
      //制作画布
      let width = 400;//画布宽度
      let height = 400;//画布高度
      let svg = d3.select("body")
        .append("svg")
        .attr("width",width)
        .attr("height",height);
      //画布周边的空白
      let padding = {left:30, right:30, top:20, bottom:20};

      //定义一个数组
      let datas = [20,10,30,60,33,24,12,5];

      //定义坐标轴比例尺
      //x轴比例尺
      let ranges = d3.range(datas.length)//ranges是datas数组下标集合的一个数组
      /*注意:4版本后下面的这种用法好像不可以了
        var xScale = d3.scale.ordinal()
                       .domain(d3.range(datas.length))
                       .rangeRoundBands([0, width - padding.left - padding.right])
      */
      let xScale = d3.scaleBand()
                        .domain(ranges) //这里装的是一个数组
                        .range([0, width - padding.left - padding.right])

      //y轴比例尺
      let min = d3.min(datas);
      let max = d3.max(datas);
      let yScale = d3.scaleLinear()
                     .domain([0 , max])//值域范围,即y轴的最大最小值
                     .range([height-padding.top-padding.bottom , 0]);
    
      //定义坐标轴
      //X轴
      let xAxis = d3.axisBottom(xScale);
      //Y轴
      let yAxis = d3.axisLeft(yScale);    

      //矩形之间的空白
      let rectPadding = 4;
      //添加矩形元素
      let rects = svg.selectAll(".MyRect")
                     .data(datas)
                     .enter()
                     .append("rect")//添加矩形
                     .attr("class","MyRect")//添加类名
                     .attr("transform","translate("+padding.left+","+padding.top+")")//矩形的位置
                     .attr("x",function(d,i){//生成的矩形距离画布左侧的距离
                        return xScale(i) + rectPadding/2;
                     })
                     .attr("y",function(d){//生成的矩形距离画布顶部的距离
                        return yScale(d);
                     })
                     .attr("width",xScale.bandwidth() - rectPadding )//根据比例尺来计算出矩形的宽度
                     .attr("height",function(d){
                        return height - padding.top -padding.bottom - yScale(d);//画布高度-距离顶部-距离底部-矩形距离顶部的高算出矩形的高度
                     })
                     .attr("fill","steelblue");//矩形颜色
      //添加文字元素
      let texts = svg.selectAll(".MyText")
                     .data(datas)
                     .enter()
                     .append("text")//添加图形数据
                     .attr("class","MyText")
                     .attr("transform","translate("+padding.left+","+padding.top+")")
                     .attr("x",function(d,i){
                        return xScale(i) + rectPadding/2;
                     })
                     .attr("y",function(d){
                        return yScale(d);
                     })
                     .attr("dx",function(){//文字距离矩形左边的距离
                        return (xScale.bandwidth() - rectPadding*5)/2;
                     })
                     .attr("dy",function(d){//文字距离矩形顶部的距离
                        return 0;
                     })
                     .text(function(d){
                        return d;
                     })
      
      //添加坐标轴元素
      //添加X轴
      svg.append("g")
         .attr("class","axis")
         .attr("transform","translate("+padding.left+","+(height-padding.bottom)+")")
         .call(xAxis)
      //添加Y轴
      svg.append("g")
         .attr("class","axis")
         .attr("transform","translate("+padding.left+","+padding.top+")")
         .call(yAxis) 
    },
  },
};
</script>
<style lang="sass" scoped>

</style>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值