canvas 原生实现饼状图

预览效果

直接上代码

    var spend = 4, 
     data = [
      {
        name:'小明',
        money:11200,
        color:"#2562d9"
      },
      {
        name:'小红',
        money:36277,
        color:"#229322"
      },
      {
        name:'小黑',
        money:87451,
        color:"#25d98b"
      },
      {
        name:'小白',
        money:47854,
        color:"#d925a6"
      },
      {
        name:'小绿',
        money:117854,
        color:"#d99125"
      },
      {
        name:'小蓝',
        money:48951,
        color:"#f00"
      }
    ]
    
    function DrawArc(content,start,end,color){
      content.beginPath();
      content.moveTo(canvas.width / 2,canvas.height / 2);
      content.fillStyle = color;
      content.arc(canvas.width / 2,canvas.height / 2,100,start * Math.PI / 180,end * Math.PI / 180,false)
      content.closePath();
      content.fill()
    }
    function charts(){
      var cvs = document.querySelector('#canvas');
      var ctx = cvs.getContext('2d');
      ctx.clearRect(0,0,cvs.width,cvs.height);
      for(let i = 0; i < data.length; ++i){
        DrawArc(ctx,data[i].starting,data[i].ending,data[i].color)
      }
    }
    function every(data){
      let pd = false;
      for(let i = 0; i < data.length; ++i){
        if(data[i].starting >= data[i].start && data[i].ending >= data[i].end){
          pd = true;
        }else{
          pd = false;
        }
      }
      return pd
    }
    (function init(){
      var moneyCount = data.reduce((curr,next) => curr + next.money,0);
      var starts = 0,end = 0,pd = false;
      for(let i = 0; i < data.length; ++i){
        const bili = data[i].money / moneyCount * 100 * 3.6;
        data[i].start = starts == 0 ? 0 : Math.floor(starts + 1),
        data[i].end = bili + starts == 360 ? 360 :Math.floor(bili + starts + 1),
        data[i].starting = i,
        data[i].ending = i + 1;
        starts += bili;
      }
      function start(){
        for(let i = 0; i < data.length; ++i){
          if(data[i].starting < data[i].start){
            data[i].starting + spend  > data[i].start ? data[i].starting = data[i].start : data[i].starting += spend;
          }
          if(data[i].ending < data[i].end){
            data[i].ending + spend  > data[i].end ? data[i].ending = data[i].end : data[i].ending += spend;
          }
        }
        charts();
        pd = every(data);
        if(!pd){
          requestAnimationFrame(start)
        }
      }
      start()
    })()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在小程序中实现ECharts饼状图,你可以按照以下步骤进行操作: 1. 首先,在小程序项目中引入ECharts库。可以通过在`app.json`文件中配置: ```json "usingComponents": { "ec-canvas": "path/to/ec-canvas/ec-canvas" } ``` 2. 在需要展示图表的页面的`wxml`文件中添加一个`ec-canvas`标签: ```html <view style="width: 100%; height: 300rpx;"> <ec-canvas id="myChart" canvas-id="myChartCanvas"></ec-canvas> </view> ``` 3. 在对应页面的`js`文件中引入ECharts库,并初始化一个图表实例: ```javascript import * as echarts from 'path/to/echarts.min.js'; Page({ data: { chart: null, }, onLoad() { this.initChart(); }, initChart() { const that = this; this.setData({ chart: this.selectComponent('#myChart'), }, () => { that.data.chart.init((canvas, width, height) => { // 初始化图表 const chart = echarts.init(canvas, null, { width: width, height: height, }); that.setChartData(chart); // 设置图表数据 return chart; }); }); }, setChartData(chart) { const option = { series: [ { name: '访问来源', type: 'pie', radius: '55%', data: [ { value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' }, ], }, ], }; chart.setOption(option); }, }); ``` 在这个示例中,我们使用了一个简单的饼状图作为示例数据。你可以根据自己的需求修改数据和图表类型。同时,你也可以使用ECharts提供的丰富的配置项来自定义图表的样式和交互行为。 记得在小程序开发中,需要安装相关依赖并进行配置,具体操作可以参考ECharts官方文档或者相关教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值