我就废话不多说了,大家还是直接看代码吧~
npm install @antv/g2 --save
template内容:
<template> <div id="pieChart"></div> </template>
js部分:
"@antv/g2"; "", //数据部分 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
这里以这个图为例
右侧就是实现这个图的代码,在这里加上.color(“type”)即可根据字段名显示不同的颜色
这里数据的字段和值可以按需更改(更改字段名称的话要把下面相关的字段名全部替换)
三、整合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(自己定义的数据名称),不同的图修改的地方可能会不同
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(); },
启动项目即可看到最终效果
三、与数据库交互
添加一个获取数据的方法(按自己的接口进行相应的替换)
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,以饼图为例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 羽泉《给未来的你&天黑天亮》[WAV+CUE][968M]
- 庄心妍《我也许在等候》[低速原抓WAV+CUE]
- 王雅洁《小调歌后2》[原抓WAV+CUE]
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]