在vue项目中引用Antv G2,以饼图为例讲解


Posted in Javascript onOctober 28, 2020

我就废话不多说了,大家还是直接看代码吧~

npm install @antv/g2 --save

template内容:

<template>
 <div id="pieChart"></div>
</template>

js部分:

​//引入G2组件
import G2 from "@antv/g2";
 
​
export default {
  name:"",
  //数据部分
  data(){
    return{
     sourceData: [],//声明一个数组
     chart: {}, //全局定义chart对象
     id: Math.random().toString(36).substr(2), //动态生成ID,便于多次引用
    }
  },
  //初始加载 
  mounted() {
  this.initComponent();
 },
  methods: {
  //初始化获取数据
  initStrateGoal() {
   debugger;
   let _this = this;
   _this.$http
    .$get("后台接口地址")
    .then(function(response) {
     if (_this.$util.isBlank(response.data)) {
      return;
     }
     _this.sourceData = response.data;
     //调用绘图方法
     _this.getDrawing(_this.sourceData);
    })
    .catch(function(error) {
     _this.$message.error(_this, error);
    });
  },
  //绘制图形
  getDrawing(sourceData) {
   let _this = this;
   // Step 1: 创建 Chart 对象
   _this.chart = new G2.Chart({
    container: _this.id,
    forceFit: true,
    height: 255,
    padding: [30, 0, 35, 0],
    animate: false
    // margin: [0, 500]
   });
   let sumCount = 0;
   for (let i in sourceData) {
    sumCount = sumCount + Number(sourceData[i].count);
   }
   // Step 2: 载入数据源
   _this.chart.source(sourceData, {
    percent: {
     formatter: function formatter(val) {
      val = val + "%";
      return val;
     }
    }
   });
   _this.chart.coord("theta", {
    radius: 0.75,
    innerRadius: 0.6
   });
   //消息提示
   _this.chart.tooltip({
    showTitle: false,
    itemTpl:
     '<li><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>'
   });
   // 辅助文本
   _this.chart.guide().html({
    position: ["50%", "50%"],
    html:
     '<div style="color:#8c8c8c;font-size: 10px;text-align: center;width: 6em;">目标总数<br><span style="color:#8c8c8c;font-size:14px">' +
     sumCount +
     "</span></div>",
    alignX: "middle",
    alignY: "middle"
   });
   // Step 3:创建图形语法,绘制饼图
   var interval = _this.chart
    .intervalStack()
    .position("percent")
    .color("item")
    .label("percent", {
     formatter: function formatter(val, item) {
      return item.point.item + ": " + val;
     }
    })
    .tooltip("item*percent", function(item, percent) {
     //数据显示为百分比形式
     percent = percent + "%";
     return {
      name: item,
      value: percent
     };
    })
    .style({
     lineWidth: 1,
     stroke: "#fff"
    });
   // Step 4:最后一步渲染至画布
   _this.chart.render();
   //初始加载图片后默认显示第一个条目突起,点击后进行变更
   interval.setSelected(sourceData[0]);
  },
  //因为父级页面用的事Tab调用,会有显示不全的现象发生,所以销毁所有对象后重新加载
  reloadDrawing() {
   //销毁画布对象
   this.chart.destroy();
   //重新调用数据进行加载
   this.initStrateGoal();
  }
 } 
}

*父级页面时tab调用,并且是一个页面多次引用,有两个坑

1.tab点击时,有的页面显示不全,样式也有问题,需要销毁重构(只是我的个人方案,有其他方案的话可以推荐)

2.一个页面有多个图表,id是不能重复的,必须动态生成

补充知识:vue+antv与数据库交互实现数据可视化图表

一、安装antv

npm install @antv/g2

二、在官网选择自己需要的图表

https://g2.antv.vision/zh/examples/gallery

这里以这个图为例

在vue项目中引用Antv G2,以饼图为例讲解

右侧就是实现这个图的代码,在这里加上.color(“type”)即可根据字段名显示不同的颜色

在vue项目中引用Antv G2,以饼图为例讲解

这里数据的字段和值可以按需更改(更改字段名称的话要把下面相关的字段名全部替换)

在vue项目中引用Antv G2,以饼图为例讲解

三、整合vue antv

在vue中引入antv

import { Chart } from "@antv/g2";

指定一个容器来放图表

<template>
<div id="roomTypeCheckIn"></div>
</template>

替换默认的data数据

data() {
  return {
   mydata: [
    { roomTypeName: "单人间", checkInValue: 654, checkInPercent: 0.02 },
    { roomTypeName: "双人间", checkInValue: 654, checkInPercent: 0.02 },
    { roomTypeName: "钟点房", checkInValue: 4400, checkInPercent: 0.2 },
    { roomTypeName: "海景房", checkInValue: 5300, checkInPercent: 0.24 },
    { roomTypeName: "主题房", checkInValue: 6200, checkInPercent: 0.28 },
    { roomTypeName: "家庭房", checkInValue: 3300, checkInPercent: 0.14 },
    { roomTypeName: "总统房", checkInValue: 1500, checkInPercent: 0.06 }
   ]
  };
 },

把绘图代码复制进来

此处需要把默认的container:‘container' 修改为自己指定的容器id,渲染数据时,将data修改为this.xxx(自己定义的数据名称),不同的图修改的地方可能会不同

在vue项目中引用Antv G2,以饼图为例讲解

methods: {
  initComponent() {
   const chart = new Chart({
    container: "roomTypeCheckIn",
    autoFit: true,
    height: 500,
    padding: [50, 20, 50, 20]
   });
   chart.data(this.mydata);
   chart.scale("checkInValue", {
    alias: "销售额"
   });

   chart.axis("roomTypeName", {
    tickLine: {
     alignTick: false
    }
   });
   chart.axis("checkInValue", false);

   chart.tooltip({
    showMarkers: false
   });
   chart
    .interval()
    .position("roomTypeName*checkInValue")
    .color("roomTypeName");
   chart.interaction("element-active");

   // 添加文本标注
   this.mydata.forEach(item => {
    chart
     .annotation()
     .text({
      position: [item.roomTypeName, item.checkInValue],
      content: item.checkInValue,
      style: {
       textAlign: "center"
      },
      offsetY: -30
     })
     .text({
      position: [item.roomTypeName, item.checkInValue],
      content: (item.checkInPercent * 100).toFixed(0) + "%",
      style: {
       textAlign: "center"
      },
      offsetY: -12
     });
   });
   chart.render();
  }
 }

在mounted函数中调用绘图方法

mounted() {
  this.initComponent();
 },

启动项目即可看到最终效果

在vue项目中引用Antv G2,以饼图为例讲解

三、与数据库交互

添加一个获取数据的方法(按自己的接口进行相应的替换)

getData() {
   roomTypeApi.getRoomTypeStatistics().then(res => {
    this.mydata = res.data.data
   })
  },

在created函数中调用获取数据的函数

created() {
   this.getData()
 },

在watch函数中监听数据,数据发生变化时重新渲染图表

watch: {
  mydata(b,a) {
    this.chart.changeData(b)
    this.chart.render()
  }
 },

最后得到的图表数据就是数据库中的数据了

在vue项目中引用Antv G2,以饼图为例讲解

以上这篇在vue项目中引用Antv G2,以饼图为例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
仿新浪微博返回顶部的jquery实现代码
Oct 01 Javascript
jquery清空textarea等输入框实现代码
Apr 22 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
Oct 29 Javascript
详解Webwork中Action 调用的方法
Feb 02 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
Mar 10 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
Bootstrap 模态框(Modal)插件代码解析
Dec 21 Javascript
全站最详细的Vuex教程
Apr 13 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
Jan 03 Javascript
微信小程序实现拖拽功能
Sep 26 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 #Javascript
antd vue table跨行合并单元格,并且自定义内容实例
Oct 28 #Javascript
js 实现碰撞检测的示例
Oct 28 #Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 #Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 #Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 #Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 #Javascript
You might like
Php部分常见问题总结
2006/10/09 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
python使用百度翻译进行中翻英示例
2014/04/14 Python
详解在Python中处理异常的教程
2015/05/24 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python调用飞书发送消息的示例
2020/11/10 Python
python 调用Google翻译接口的方法
2020/12/09 Python
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
厨师岗位职责
2013/11/12 职场文书
煤矿班组长岗位职责
2013/12/29 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技