返回顶部
首页 > 资讯 > 精选 >在vue中怎么封装G2图表
  • 651
分享到

在vue中怎么封装G2图表

2023-06-30 11:06:17 651人浏览 泡泡鱼
摘要

本篇内容介绍了“在Vue中怎么封装G2图表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue封装G2图表<template>&

本篇内容介绍了“在Vue中怎么封装G2图表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

vue封装G2图表

<template>    <div id="id"></div></template>
<script>import G2 from '@antv/g2'import { DataSet } from '@antv/data-set'export default {    name: 'pie',    data () {        return {            chart: null        };    },    props:{        gtwopiedata:{            type: Array        },        // gtwopiecolor:{        //     type: Array        // },    },    methods:{        g2pie(){            if(this.chart){     // 如果存在的话就删除图表再重新生成                this.chart.destroy()            }            var startAngle = - Math.PI / 2 - Math.PI / 4;            var data = this.gtwopiedata.data;            var ds = new DataSet();            var dv = ds.createView().source(data);            dv.transfORM({                type: 'percent',                field: 'value',                dimension: 'type',                as: 'percent'            });            this.chart = new G2.Chart({                container: 'id',                forceFit: true,                height: this.gtwopiedata.height,                padding: 'auto'            });            this.chart.source(dv);            this.chart.legend(false);            this.chart.coord('theta', {                radius: 0.75,                innerRadius: 0.5,                startAngle: startAngle,                endAngle: startAngle + Math.PI * 2            });            this.chart.intervalStack().position('value').color('type', this.gtwopiedata.color).opacity(1).label('percent', {                offset: -20,                textStyle: {                    fill: 'white',                    fontSize: 12,                    shadowBlur: 2,                    shadowColor: 'rgba(0, 0, 0, .45)'                },                formatter: function formatter(val) {                    return parseInt(val * 100) + '%';                }            });            this.chart.guide().html({                position: ['50%', '50%'],                html: '<div class="g2-guide-html"><p class="title">'+this.gtwopiedata.title+'</p></div>'            });            this.chart.render();            //draw label            var OFFSET = 20;            var APPEND_OFFSET = 50;            var LINEHEIGHT = 60;            var coord = this.chart.get('coord'); // 获取坐标系对象            var center = coord.center; // 极坐标圆心坐标            var r = coord.radius; // 极坐标半径            var canvas = this.chart.get('canvas');            var canvasWidth = this.chart.get('width');            var canvasHeight = this.chart.get('height');            var labelGroup = canvas.addGroup();            var labels = [];            // addPieLabel(this.chart);            var halves = [[], []];            var data = dv.rows;            var angle = startAngle;                    for (var i = 0; i < data.length; i++) {                var percent = data[i].percent;                var targetAngle = angle + Math.PI * 2 * percent;                var middleAngle = angle + (targetAngle - angle) / 2;                angle = targetAngle;                var edgePoint = this.getEndPoint(center, middleAngle, r);                var routerPoint = this.getEndPoint(center, middleAngle, r + OFFSET);                //label                var label = {                    _anchor: edgePoint,                    _router: routerPoint,                    _data: data[i],                    x: routerPoint.x,                    y: routerPoint.y,                    r: r + OFFSET,                    fill: '#bfbfbf'                };                // 判断文本的方向                if (edgePoint.x < center.x) {                    label._side = 'left';                    halves[0].push(label);                } else {                    label._side = 'right';                    halves[1].push(label);                }            } // end of for                    var maxCountForOneSide = parseInt(canvasHeight / LINEHEIGHT, 10);            halves.forEach(function(half, index) {                // step 2: reduce labels                if (half.length > maxCountForOneSide) {                    half.sort(function(a, b) {                    return b._percent - a._percent;                    });                    half.splice(maxCountForOneSide, half.length - maxCountForOneSide);                }                            // step 3: distribute position (x and y)                half.sort(function(a, b) {                    return a.y - b.y;                });                // antiCollision(half, index);                var startY = center.y - r - OFFSET - LINEHEIGHT;                var overlapping = true;                var totalH = canvasHeight;                var i = void 0;                            var maxY = 0;                var minY = Number.MIN_VALUE;                var boxes = half.map(function(label) {                    var labelY = label.y;                    if (labelY > maxY) {                    maxY = labelY;                    }                    if (labelY < minY) {                    minY = labelY;                    }                    return {                    size: LINEHEIGHT,                    targets: [labelY - startY]                    };                });                if (maxY - startY > totalH) {                    totalH = maxY - startY;                }                            while (overlapping) {                    boxes.forEach(function(box) {                    var target = (Math.min.apply(minY, box.targets) + Math.max.apply(minY, box.targets)) / 2;                    box.pos = Math.min(Math.max(minY, target - box.size / 2), totalH - box.size);                    });                                // detect overlapping and join boxes                    overlapping = false;                    i = boxes.length;                    while (i--) {                    if (i > 0) {                        var previousBox = boxes[i - 1];                        var box = boxes[i];                        if (previousBox.pos + previousBox.size > box.pos) {                        // overlapping                        previousBox.size += box.size;                        previousBox.targets = previousBox.targets.concat(box.targets);                                    // overflow, shift up                        if (previousBox.pos + previousBox.size > totalH) {                            previousBox.pos = totalH - previousBox.size;                        }                        boxes.splice(i, 1); // removing box                        overlapping = true;                        }                    }                    }                }                            // step 4: normalize y and adjust x                i = 0;                boxes.forEach(function(b) {                    var posInCompositeBox = startY; // middle of the label                    b.targets.forEach(function() {                    half[i].y = b.pos + posInCompositeBox + LINEHEIGHT / 2;                    posInCompositeBox += LINEHEIGHT;                    i++;                    });                });                            // (x - cx)^2 + (y - cy)^2 = totalR^2                half.forEach(function(label) {                    var rPow2 = label.r * label.r;                    var dyPow2 = Math.pow(Math.abs(label.y - center.y), 2);                    if (rPow2 < dyPow2) {                        label.x = center.x;                    } else {                        var dx = Math.sqrt(rPow2 - dyPow2);                        if (!index) {                            // left                            label.x = center.x - dx;                        } else {                            // right                            label.x = center.x + dx;                        }                    }                    // drawLabel(label);                    var _anchor = label._anchor,                    _router = label._router,                    fill = label.fill,                    y = label.y;                                var labelAttrs = {                        y: y,                        fontSize: 12, // 字体大小                        fill: '#808080',                        text: label._data.type + '\n' + label._data.value,                        textBaseline: 'bottom'                    };                    var lastPoint = {                        y: y                    };                                if (label._side === 'left') {                        // 具体文本的位置                        lastPoint.x = APPEND_OFFSET;                        labelAttrs.x = APPEND_OFFSET; // 左侧文本左对齐并贴着画布最左侧边缘                        labelAttrs.textAlign = 'left';                    } else {                        lastPoint.x = canvasWidth - APPEND_OFFSET;                        labelAttrs.x = canvasWidth - APPEND_OFFSET; // 右侧文本右对齐并贴着画布最右侧边缘                        labelAttrs.textAlign = 'right';                    }                                // 绘制文本                    var text = labelGroup.addShape('Text', {                        attrs: labelAttrs                    });                    labels.push(text);                    // 绘制连接线                    var points = void 0;                    if (_router.y !== y) {                        // 文本位置做过调整                        points = [[_anchor.x, _anchor.y], [_router.x, y], [lastPoint.x, lastPoint.y]];                    } else {                        points = [[_anchor.x, _anchor.y], [_router.x, _router.y], [lastPoint.x, lastPoint.y]];                    }                                labelGroup.addShape('polyline', {                        attrs: {                            points: points,                            lineWidth: 1,                            stroke: fill                        }                    });                });            });            canvas.draw();            // this.chart.on('afterpaint', function() {            //   addPieLabel(this.chart);            // });        },        // g2获取饼图点位置        getEndPoint(center, angle, r) {            return {                x: center.x + r * Math.cos(angle),                y: center.y + r * Math.sin(angle)            };        }    },    watch: {        gtwopiedata: function (val, oldVal) {    // 监听数据,当发生变化时,触发回调函数绘制图表,使用mounted无法正常绘制            // if(this.dothisfun){                this.g2pie(val);            //     this.dothisfun = false            // }        }    },    // mounted(){    //     this.g2pie();    // }}</script>
<style scoped>    #id{        width: 100%;        height: 100%;    }</style>

本来是想将生成的方法封装到js文件中的,但是不知道为什么,import G2 进入js文件之后,vue便会卡在92%无法继续热更新,node的cpu占用率也会饱满,所以只好封装在.vue文件中,以子组件的形式被父组件调用。

本处需要注意的第一个问题,即为data中定义的chart,如果不定义,直接用let chart = new G2.chart(),也确实能够正常生成图表,但是当数据更新的时候,便会重新渲染生成新的图表,此时页面上会同时存在多个图表,所以需要提前定义chart,并使用this.chart = new G2.chart()。

本处需要注意的第二个问题,即为使用mounted钩子函数运行此函数时,因为并未检测到数据变化,所以不会生成有效图表,所以需要使用watch监听数据变化,当发生变化的时候,执行方法渲染图表。 

vue引入G2图表

G2 是一套基于图形语法理论的可视化底层引擎,以数据驱动,提供图形语法与交互语法,具有高度的易用性和扩展性。使用 G2,你可以无需关注图表各种繁琐的实现细节,一条语句即可使用 Canvas 或 SVG 构建出各种各样的可交互的统计图表;

线上示例

在vue中怎么封装G2图表

特性

  • ???? 完善的图形语法:数据到图形的映射,能够绘制出所有的图表;

  • ???? 全新的交互语法:通过触发和反馈机制可以组合出各种交互行为,对数据进行探索;

  • ???? 强大的 View 模块:可支持开发个性化的数据多维分析图形;

  • ???? 双引擎渲染:Canvas 或 SVG 任意切换;

  • ???? 可视化组件体系:面向交互、体验优雅;

  • ✨全面拥抱 typescript:提供完整的类型定义文件;

介绍一下在vue中使用G2

安装G2依赖:

npm instal @antv/g2

在绘图前我们需要为 G2 准备一个 DOM 容器:

<div id="c1"></div>

执行代码:

    import * as G2 from '@antv/g2';      export default {    mounted() {           const data = [                { genre: 'Sports', sold: 275 },                { genre: 'Strategy', sold: 115 },                { genre: 'Action', sold: 120 },                { genre: 'Shooter', sold: 350 },                { genre: 'Other', sold: 150 },            ];            // Step 1: 创建 Chart 对象            const chart = new G2.Chart({                container: 'c1', // 指定图表容器 ID                width: 600, // 指定图表宽度                height: 300, // 指定图表高度            });            // Step 2: 载入数据源            chart.data(data);            // Step 3:创建图形语法,绘制柱状图            chart.interval().position('genre*sold');            // Step 4: 渲染图表            chart.render();    }  }

效果展示:

在vue中怎么封装G2图表

“在vue中怎么封装G2图表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 在vue中怎么封装G2图表

本文链接: https://lsjlt.com/news/328346.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在vue中怎么封装G2图表
    本篇内容介绍了“在vue中怎么封装G2图表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue封装G2图表<template>&...
    99+
    2023-06-30
  • 在vue中如何封装G2图表
    目录vue封装G2图表vue引入G2图表线上示例特性介绍一下在vue中使用G2vue封装G2图表 <template>     <div id="id">&l...
    99+
    2024-04-02
  • Vue中怎么封装Dialog
    Vue中怎么封装Dialog,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。解决方案有两个:在根组件里面引入动态组件,在业务里面通过this.$root.openDialog...
    99+
    2023-06-20
  • 如何在vue中封装axios
    本篇文章为大家展示了如何在vue中封装axios,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基础版第一步:配置axios首先,创建一个Service.js,这里面存放的时axios的配置以及拦截器...
    99+
    2023-06-15
  • Vue怎么封装axios
    今天小编给大家分享一下Vue怎么封装axios的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2024-04-02
  • vue中怎么封装axios请求
    这篇文章将为大家详细讲解有关vue中怎么封装axios请求,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。axiosAxios 是一个基于 promise 的...
    99+
    2024-04-02
  • 在Vue中是如何封装axios
    目录1、安装1、引入3、接口根地址4、使用事例4.1下载4.2get4.3post1、安装 npm install axios; // 安装axios 1、引入 imp...
    99+
    2024-04-02
  • 怎么在ThinkPHP中封装Layui
    本文小编为大家详细介绍“怎么在ThinkPHP中封装Layui”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在ThinkPHP中封装Layui”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、为什么要在Th...
    99+
    2023-07-05
  • vue-echarts如何实现图表组件封装详解
    目录背景:有哪些工具?怎么封装?总结背景: 需要大量使用图表的项目,为了提升开发效率,可以对图表类进行封装成组件,方便页面的搭建,也能进行统一管理维护,即使后面系统风格需要调整,调整...
    99+
    2024-04-02
  • Vue怎么封装Swiper实现图片轮播效果
    这篇“Vue怎么封装Swiper实现图片轮播效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue怎么封装Swiper实现...
    99+
    2023-07-04
  • vue中怎么封装一个webSQL插件
    这篇文章主要讲解了“vue中怎么封装一个webSQL插件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中怎么封装一个webSQL插件”吧!需求先理清需求,而后才好有个目标。数据库的初始...
    99+
    2023-07-04
  • Vue怎么封装一个TodoList
    这篇文章主要介绍Vue怎么封装一个TodoList,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优势,Vue...
    99+
    2023-06-14
  • Axios在vue项目中的封装步骤
    目录1. 什么是Axios?2. 回顾Ajax3. 回顾Promise4. Vue封装Axios1. 什么是Axios? Axios 是一个基于 promise 的网络请求库,可以用...
    99+
    2024-04-02
  • 怎么在vue中更优雅的封装第三方组件
    本篇内容主要讲解“怎么在vue中更优雅的封装第三方组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在vue中更优雅的封装第三方组件”吧!一、需求场景描述实际开发的时候,为了减少重复造轮子,...
    99+
    2023-06-30
  • VUE项目中封装Echart折线图的方法
    本文实例为大家分享了VUE项目中封装Echart折线图的具体代码,供大家参考,具体内容如下 封装Echart折线图,可显示多条折线 1. 首先在项目中全局引入Echarts,main...
    99+
    2024-04-02
  • 怎么用Vue组件封装上传图片和视频
    这篇文章主要介绍“怎么用Vue组件封装上传图片和视频”,在日常操作中,相信很多人在怎么用Vue组件封装上传图片和视频问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Vue组件封装上传图片和视频”的疑惑有所...
    99+
    2023-06-20
  • C++链表类怎么封装
    这篇文章主要介绍“C++链表类怎么封装”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++链表类怎么封装”文章能帮助大家解决问题。1.CList.h#ifndef CLIST_H#defi...
    99+
    2023-06-30
  • Vue中怎么对ElementUI的Dialog组件封装
    本篇内容主要讲解“Vue中怎么对ElementUI的Dialog组件封装”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中怎么对ElementUI的Dialog组件封装”吧!对Element...
    99+
    2023-07-05
  • 怎么用vue封装axios请求
    这篇文章将为大家详细讲解有关怎么用vue封装axios请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。其实vue封装axios是很简单的首先 在src路径下建http文件夹 并且创建api.js env...
    99+
    2023-06-15
  • Vue组件封装怎么实现
    这篇文章主要介绍“Vue组件封装怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue组件封装怎么实现”文章能帮助大家解决问题。一、组件封装的优势复用性:组件封装可以将常用的功能或视图模块抽象...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作