vue中使用G2(一)

前言

这一章节主要讲解的是如何使用G2和G2Plot, 通过阅读你可以学习到:

  • G2最基本的使用
  • 在vue中使用G2
  • 在vue中使用G2Plot

一、G2简介

G2其实就是一套基于可视化编码的图形语法,使得前端能够高效的生成各种统计图表...

不做过多介绍,直接贴文档:G2文档

二、最基本的使用

不结合任何的前端框架来使用G2

1. 浏览器引入

创建一个名为demo1.html的文件,

想要在html中使用G2的话,需要先引入进来。

这一部分官网也有详细介绍,有两种引入方式:

<!-- 引入在线资源 -->
<script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist/g2.min.js"></script>
<!-- 引入本地脚本 -->
<script src="./g2.js"></script>
<!-- 采用这种引入方式的话一般先要去官方把对应的g2脚本下载下来再放到文件的同级目录下 -->

2. 创建 div 图表容器

在页面的 body 部分创建一个 div,并制定必须的属性 id

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

3. 编写图表绘制代码

<script>
    const data = [
      { genre: 'Sports', sold: 275 },
      { genre: 'Strategy', sold: 115 },
      { genre: 'Action', sold: 120 },
      { genre: 'Shooter', sold: 350 },
      { genre: 'Other', sold: 150 }
    ]; // G2 对数据源格式的要求,仅仅是 JSON 数组,数组的每个元素是一个标准 JSON 对象。
    // Step 1: 创建 Chart 对象
    const chart = new G2.Chart({
      container: 'c1', // 指定图表容器 ID
      width : 600, // 指定图表宽度
      height : 300 // 指定图表高度
    });
    // Step 2: 载入数据源
    chart.source(data);
    // Step 3:创建图形语法,绘制柱状图,由 genre 和 sold 两个属性决定图形位置,genre 映射至 x 轴,sold 映射至 y 轴
    chart.interval().position('genre*sold').color('genre')
    // Step 4: 渲染图表
    chart.render();
</script>

先不管上面的字段你看不看得懂,咱先把效果给实现了,然后后面在去详细了解每个字段、方法的含义。

完成上述步骤后,用浏览器打开demo1.html,可以看到以下效果:

demo1.html

完整代码地址 demo1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>G2</title>
</head>
<!-- 引入G2在线资源 -->
<script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist/g2.min.js"></script>
<body>
    <div id="c1"></div>
    <script>
        const data = [
            { genre: 'Sports', sold: 275 },
            { genre: 'Strategy', sold: 115 },
            { genre: 'Action', sold: 120 },
            { genre: 'Shooter', sold: 350 },
            { genre: 'Other', sold: 150 }
        ]; // G2 对数据源格式的要求,仅仅是 JSON 数组,数组的每个元素是一个标准 JSON 对象。
        // Step 1: 创建 Chart 对象
        const chart = new G2.Chart({
            container: 'c1', // 指定图表容器 ID
            width: 600, // 指定图表宽度
            height: 300 // 指定图表高度
        });
        // Step 2: 载入数据源
        chart.source(data);
        // Step 3:创建图形语法,绘制柱状图,由 genre 和 sold 两个属性决定图形位置,genre 映射至 x 轴,sold 映射至 y 轴
        chart.interval().position('genre*sold').color('genre')
        // Step 4: 渲染图表
        chart.render();
    </script>
</body>
</html>

二、结合vue来使用G2

vue中使用G2的话,分为两种场景:

  • 直接用<script>引入
  • 命令行工具(CLI脚手架,需要使用npm安装)

1. 直接用<script>引入

若你的前端项目不是使用脚手架vue-cli开发的话,也就是直接下载并用 <script> 标签引入的话,可以参考上面一节最基本的使用

例如我下面一个简单的vue例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>G2</title>
    <style>
        #app {
            margin: 50px auto;
            text-align: center;
        }
    </style>
</head>
<!--vue-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<body>
    <div id="app">
        <h2>{{ msg }}</h2>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            mounted() {
                this.msg = 'vue案例'
            }
        })
    </script>
</body>
</html>

在上面的文件中使用G2:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>G2</title>
    <style>
        #app {
            margin: 50px auto;
            text-align: center;
        }
    </style>
</head>
<!--vue-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 引入G2在线资源 -->
<script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist/g2.min.js"></script>
<body>
    <div id="app">
        <h2>{{ msg }}</h2>
        <div id="c1"></div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                msg: '',
                chart: null, // 创建一个chart变量
                data: [
                    { genre: 'Sports', sold: 275 },
                    { genre: 'Strategy', sold: 115 },
                    { genre: 'Action', sold: 120 },
                    { genre: 'Shooter', sold: 350 },
                    { genre: 'Other', sold: 150 }
                ]
            },
            mounted() {
                this.msg = 'vue案例'
                // 初始化chart
                const chart = new G2.Chart({
                    container: 'c1',
                    width: 600,
                    height: 300
                })
                chart.source(this.data)
                chart
                    .interval()
                    .position('genre*sold')
                    .color('genre')
                this.chart = chart // 将chart变量赋值为vue中的chart, 后面可以直接使用this.chart调用图表对象
                this.chart.render()
            }
        })
    </script>
</body>
</html>

打开demo2.html文件同样可以看到效果。

2. npm安装

若你的前端项目是使用脚手架vue-cli开发的话,那么想要使用G2的话可以采用npm的安装方式,安装到项目中。

(1) 安装

打开项目文件目录,在终端输入:

npm install @antv/g2 --save

安装成功之后在你的node_modules文件夹下应该会多出@antv/g2文件夹。

(2) 引入

需要在main.js文件下引入G2

// main.js
import Vue from 'vue'
import G2 from '@antv/g2'
Vue.use(G2)
...

此时,你就可以在项目的任何vue文件下直接使用所有的G2功能了。

例如,我在项目中创建了一个g2Demo.vue文件

<template>
    ...
</template>
<script>
export default {
    ...
    mounted() {
        const chart = new G2.Chart({
            ...
        })
    }
}
</script>

案例完整代码地址: g2Demo.vue

三、在vue中使用G2Plot

g2plot 是一套简单、易用、并具备一定扩展能力和组合能力的统计图表库,基于图形语法理论搭建而成,"g2plot"中的 g2 即意指图形语法 (the Gramma of Graphics),同时也致敬了 ggplot2。具体可以查看《G2Plot官方文档》

而如果你要在vue中使用npm安装它并且使用是有一定区别的.

(1) 安装G2Plot

第一步安装它都没有什么区别:

npm i --save-dev @antv/g2plot

(2) 全局使用G2Plot

还记得g2里我们在vue项目是如何使用的吗?

我们在main.js中引用并使用它:

// main.js
import Vue from 'vue'
import G2 from '@antv/g2'
Vue.use(G2)
...

之所以可以这样用是因为g2的源码也就是@antv/g2向外暴露了一个对象, 这个对象携带了所有的图表组件.

而在G2Plot中它并没有暴露一个这个对象, 因此如果你也想用相同的方式引用它的话, 控制台会给你抛出一个警告:

 warning  in ./src/main.js

"export 'default' (imported as 'G2Plot') was not found in '@antv/g2plot'

其实这时候我们只需要换一种引入方式, 用CommonJS的引入方式就可以了:

// main.js
const g2plot = require('@antv/g2plot') // 1. 引入g2plot
Vue.prototype.$g2plot = g2plot // 2. 将g2plot挂载到vue中

new Vue({
    render: h => h(App),
}).$mount('#app')

在页面上使用:
例如在一个叫做demo.vue的文件中:

<template>
  <div id="canvas"></div>
</template>
<script>
export default {
  data () {
    return {
      mockData: [
        { year: '1991', value: 3 },
        { year: '1992', value: 4 },
        { year: '1993', value: 3.5 },
        { year: '1994', value: 5 },
        { year: '1995', value: 4.9 },
        { year: '1996', value: 6 },
        { year: '1997', value: 7 },
        { year: '1998', value: 9 },
        { year: '1999', value: 13 }
      ]
    }
  },
  mounted() {
    const linePlot = new this.$g2Plot.Line('canvas', {
      data: this.mockData,
      xField: 'year',
      yField: 'value'
    })
    linePlot.render()
  }
}
</script>

(3) 按需使用

上面👆那种方式是将整个g2plot都挂载到了全局的vue对象中, 有时候我们可能不需要所有的组件, 这时候你可以按需引用它, 而不必全部引用:

<template>
  <div id="canvas"></div>
</template>
<script>
+ import { Line } from '@antv/g2plot'
export default {
  data () {
    return {
      mockData: [
        { year: '1991', value: 3 },
        { year: '1992', value: 4 },
        { year: '1993', value: 3.5 },
        { year: '1994', value: 5 },
        { year: '1995', value: 4.9 },
        { year: '1996', value: 6 },
        { year: '1997', value: 7 },
        { year: '1998', value: 9 },
        { year: '1999', value: 13 }
      ]
    }
  },
  mounted() {
-    const linePlot = new this.$g2Plot.Line('canvas', {
+    const linePlot = new Line('canvas', {
      data: this.mockData,
      xField: 'year',
      yField: 'value'
    })
    linePlot.render()
  }
}
</script>

无论是哪种方式, 都是可以实现的:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,079评论 0 2
  • vue现代化使用方法(一) 目前前端开发已经非常类似GUI开发,前端人员需要了解大量业务逻辑,通过不同的页面交互行...
    li4065阅读 1,137评论 2 5
  • Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs三国鼎立,我不是职业前端...
    玄木阅读 272,750评论 70 259
  • 毒胆:2 三胆:249 复式: 24689 123467 1234689 精选: 296..265..918..9...
    福中仙阅读 261评论 0 1
  • 我本是爱买买买之人,老公却有点葛朗台潜质。于是,我就想若自己能闷声发大财去实现这些愿望该多好。 说起来我的愿望并不...
    静如水漪12阅读 633评论 12 10