关于在小步伐项目中使用图表插件AntV(即F2)

打印 上一主题 下一主题

主题 1583|帖子 1583|积分 4749

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 前言:以前嘛从开发H5和各种图表系统被拉到来开发小步伐,拿到的一个项目里面就涉及几个图表,用canvas是能实现效果,但是周期长而且还不一定悦目稳定。所以嘛就上网找了相干资料。发现有Echarts为小步伐专门改写的一套,但是范例不是很全,就转到了AntV这里来,阿里写的F2内容也挺全的。所以就接纳了。在这里贴链接感谢这位码友的分享给我的灵感先 https://www.jianshu.com/p/6b9fe45f799f 。然后直接上代码(代码是经过项目需求更改的,仅做参考)如果找不到可以直接用下面我这个:GitHub - FreeGrowth/f2-canvas
(/* 截图小步伐为本人开发。转载请带上本文URL地点和出处,尊重劳动结果,谢谢 */)
1.如何引入F2在小步伐中
先下载上面的GitHub地点中的代码压缩包,然后把里面的f2-canvas整个文件夹放到你的项目当中,路径要记得。如图

2. 在你所要用到的页面中import进去,引入的地方分别是json和js文件(当然也可以在app.js和app.json中引入)切记,两个都要引入哦
js引入:import F2 from '../../common/f2-canvas/lib/f2'; (路径按照你本身放的路径去改)
json引入如下: 
  1. {
  2.   "usingComponents": {
  3.     "ff-canvas": "../../common/f2-canvas/f2-canvas" // 这里是路径
  4.   }
  5. }
复制代码
3. 一切就绪后开始撸图表啦,wxml要先写好对应的容器宽高,一定要给宽高
  1. <view class="pie-view">
  2.        <ff-canvas id="pieSelect" canvas-id="pieSelect" opts="{{ optspie }}"> </ff-canvas>
  3. </view>
复制代码
 这里的id可以任意给,但canvas-id最好按照F2的指定图表id来,详细可以看F2的demo。 opts绑定的是对应的数据变量名
css如下:(不给它宽高会报错的~)
  1. #pieSelect {
  2.   width: 600rpx;
  3.   height: 500rpx;
  4. }
复制代码
4.这里是js代码区域(仅展示项目中所需要用到的功能代码,更多的功能可以参考AntV和F2的API) 这里要写在onLoad是因为要在页面进来时间就开始数据图表渲染,所以只能作为借鉴哦~
  1. Page({
  2.   data: {
  3.     optspie: {}, // 资金占比饼状图
  4.   },
  5.   onLoad(options) {
  6.     const that = this // 绑定好this指向
  7.     // 资金占比模块-资金占比饼状图
  8.     let pie = null // 先声明一个变量用以后面做F2的new
  9.     function pieChart(canvas, width, height) { // F2实现回调的方法,方法名用来最后赋值绑定
  10.     //这里是为让请求接口返回数据能直接赋值给到图表数据渲染,所以用的ES6写法
  11.       new Promise(function(resolve,reject){
  12.         wx.request({
  13.           url: '这里是请求的接口,记得写上自己的~',
  14.           data: { code },
  15.           header: {
  16.             'content-type': 'application/json'
  17.           },
  18.         // 请求成功后执行
  19.           success: function (res) {
  20.             const dataNum =  res.data.response.day_fund_info
  21.             if (dataNum.length === 0 || !dataNum) {
  22.               console.log('饼状图没有数据')
  23.               that.setData({
  24.                 pieDataShow: true
  25.               })
  26.             } else {
  27.             // 这里是将返回的字符数据转换为数字以方便图表
  28.               const large_deal_amount = Number(dataNum.large_deal_amount)
  29.               const mid_deal_amount = Number(dataNum.mid_deal_amount)
  30.               const small_deal_amount = Number(dataNum.small_deal_amount)
  31.               if (large_deal_amount === 0 && mid_deal_amount === 0 && small_deal_amount === 0) {
  32.                 console.log('饼状图数据都是0')
  33.                 that.setData({
  34.                   pieDataShow: true
  35.                 })
  36.                 return
  37.               }
  38.               // 赋值对应值给到饼图(也可以把percent给改成纯数字这样你就能在自己的项目上看到效果了)
  39.               let pieData = [
  40.                 { name: '主力', percent: large_deal_amount,},
  41.                 { name: '跟风', percent: mid_deal_amount,},
  42.                 { name: '散户', percent: small_deal_amount,}
  43.               ]
  44.               resolve(pieData) // 将数据返回给到new上进行then索取
  45.             }
  46.           }
  47.         })
  48.       }).then((data) => {
  49.         const total = data[0].percent + data[1].percent + data[2].percent // 计算总数
  50.         let brunt = data[0].percent / total * 100 // 计算主力占比
  51.         let Retail = data[1].percent / total * 100 // 计算跟风占比
  52.         let follow = data[2].percent / total * 100 // 计算散户占比
  53.         // 饼图的图例配置
  54.         const map = {
  55.           '主力': `${brunt.toFixed(2)}%`,
  56.           '跟风': `${Retail.toFixed(2)}%`,
  57.           '散户': `${follow.toFixed(2)}%`
  58.         };
  59.         // 刚刚声明的变量就是用在这里,new到F2的指定
  60.         pie = new F2.Chart({
  61.           el: canvas,
  62.           width,
  63.           height
  64.         });
  65.         pie.source(data); // data就是传入的数据。给到F2
  66.         // 图例位置
  67.         pie.legend({
  68.           position: 'right', // 放在右边展示
  69.           itemFormatter(val) { //配置图例自定义展示内容
  70.             return val + '  ' + map[val];
  71.           },
  72.           nameStyle: {
  73.             fontSize: '13', // 图例文本大小
  74.             fill: '#ffffff' // 图例文本颜色
  75.           },
  76.           marker: {
  77.             symbol: 'circle', // marker 的形状(圆点)
  78.             radius: 4 // 半径大小
  79.           }
  80.         });
  81.         pie.tooltip(false); // 是否显示工具箱
  82.         pie.coord('polar', { // 匹配饼状图的元素圆度等
  83.           transposed: true,
  84.           radius: 0.85,
  85.           innerRadius: 0.618
  86.         });
  87.         pie.axis(false); // 关闭XY轴等线条
  88.         pie.interval()
  89.           .position('a*percent') // a为默认,percent即数据中的percent数值
  90.           .color('name', ['#FF4381', '#F2B356', '#F25E54']) // 饼图对应颜色
  91.           .adjust('stack')
  92.           .style({
  93.             lineWidth: 1,
  94.             stroke: '#fff',
  95.             lineJoin: 'round',
  96.             lineCap: 'round'
  97.           });
  98.         pie.interaction('pie-select', {
  99.           cancelable: true, // 允许取消选中
  100.           animate: { // 选中动画效果
  101.             duration: 300,
  102.             easing: 'backOut'
  103.           }
  104.         });
  105.         pie.render(); // 执行
  106.       })
  107.         return pie; //最后返回给到pie
  108.     }
  109.   }
  110. })
复制代码
5.以上js和wxml完成后,还有一个紧张步骤,在需要的地方或者要显示的时间赋值给到一开始opts绑定的变量中
  1. this.setData({
  2.       optspie: {
  3.         onInit: pieChart //这里就是在js中用到的方法名
  4.       }
  5.     })
复制代码
6.末了实现效果如图:

末了:当然不止这一个环形饼图,还有其他的柱状图折线图等。都是一样的逻辑,改不同的id和render前不同Geometry对象即可,附带官方API:Geometry · 语雀
(末了再贴几张图)(/* 转载请带上本文URL地点和出处,尊重劳动结果,谢谢 */)



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表