前端框架vue.js系列教程(5)-vue.js中实现echarts绘图

2023-04-13 08:45:50.0

前端框架vue.js系列教程:

ECharts是什么?

商业级数据图表,它是一个纯JavaScript的图标库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

Echarts支持的图表有折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)、雷达图(填充雷达图)、和弦图、力导向布局图、地图、仪表盘、漏斗图、事件河流图等12类图表。

很容易在vue.js中使用ECharts绘制各种可视化图表。

在vue.js中使用ECharts绘图

安装echarts包

首先需要在项目中安装echarts依赖包。这可以使用npm来安装:

$ npm install echarts

然后在你vue项目的js文件中使用import导入它:

import * as echarts from 'echarts';

接下来我们在上一节所创建的hellovue-app项目基础上,实现几个常见ECharts图表的绘制。

绘制柱状图

请按以下步骤实现一个ECharts柱状图的绘制。

(1) 在项目的src/views/文件夹下,新创建一个名为Bar.vue的文件,并编辑代码如下:

<template>
  <h2>柱状图</h2>
  <div class="right">
      <p><pre>{{ items }}</pre></p>
  </div>

  <div class="left"> 
    <!-- echarts图表绘制在这里 -->
    <div id="canvas" style="width: 600px;height:400px;"></div>    
  </div> 
</template>

<script>
    import * as echarts from 'echarts'     

    export default {
      name: 'BarGraph',
      data () {
        return {
          items: ''
        }
      },
      mounted () {
          // 根据准备好的dom初始化echarts实例
          var myChart = echarts.init(document.getElementById('canvas'));

          // 使用刚才指定的配置项和数据显示图表
          myChart.setOption({
            title: {
              text: '2016年11月平均销售额最高的5个品牌 (万元)(品牌, 平均销售额(万元)'
            },
            tooltip: {},
            legend: {
              data: ['平均销售额(万元)'],    // 要和series.name一致
              x:'right',
              y:'80px'              
            },
            xAxis: {
              type: 'category',
              data: ['SKII', 'DIOR', '美宝莲', '倩碧', '丝芙兰', '兰蔻']
            },
            yAxis: {
              type: 'value'
            },
            series: [
              {
                name: '平均销售额(万元)',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
              }
            ]
          });
      }
    }
</script>

<!-- 添加"scoped"属性来限制CSS仅作用于这个组件 -->
<style scoped>
.left{
  width:50%;
}
.right{
  float:right;
  padding-right: 30px;
}
</style>

(2) 打开App.vue文件,设置一个对柱状图绘制的导航链接和渲染组件,代码如下:

<template>  
  <div class="navigate">
    <ul>
        <!--使用 router-link 组件进行导航 -->
        <li><router-link to="/">首页</router-link></li> 
	<li><router-link to="/bar">柱状图</router-link></li>
    </ul>
  </div>
  <div class="pages">
      <!-- 渲染在这里 -->
      <router-view></router-view>
  </div> 
</template>

<script>
  export default {
    name: 'App',
  }
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
.navigate{
  width:200px;
  float:left;
  background-color: aliceblue;
}
.pages{
  margin-left: 210px;
}
</style>

(3) 在main.js主文件中,导入路由组件(Bar.vue)并配置路由映射,实现代码如下:

import { createApp } from 'vue'
import App from './App.vue'

// 导入 vue router
import { createRouter, createWebHashHistory } from 'vue-router'

// 1. 定义路由组件.  
import BarPage from "./views/Bar.vue"

// 2. 定义一些路由映射
const routes = [
    { path: '/', component: BarPage },
    { path: '/bar', component: BarPage },
]

// 3. 创建路由实例并传递 `routes` 配置
const router = createRouter({
    // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
    history: createWebHashHistory(),
    routes: routes, // `routes: routes` 的缩写
})

// 5. 创建并挂载根实例
// createApp(App).mount('#app')     
const app = createApp(App)

// 确保 _use_ 路由实例使整个应用支持路由。
app.use(router)

 // 把App挂载到#app节点上
app.mount('#app')

(4) 测试结果。首先启动服务器:

$ npm run serve

然后打开浏览器,访问http://http://localhost:8080/,点击柱状图链接,可以看到如下的绘图界面:

绘制饼状图

同样地,在src/views/文件夹下,创建一个Pie.vue文件,编辑内容如下:

<template>
  <h2>饼状图</h2>
  <div class="right">
      <p><pre>{{ items }}</pre></p>
  </div>

  <div class="left"> 
    <!-- echarts图表绘制在这里 -->
    <div id="canvas" style="width: 600px;height:400px;"></div>    
  </div> 
</template>

<script>
    import * as echarts from 'echarts'     

    export default {
      name: 'PieGraph',
      data () {
        return {
          items: ''
        }
      },
      mounted () {
          // 根据准备好的dom初始化echarts实例
          var myChart = echarts.init(document.getElementById('canvas'));

          // 使用刚才指定的配置项和数据显示图表
          myChart.setOption({
            title: {
              text: '销售额最高的5个品类,返回(品类,销售额)',
              subtext: '2016年11月',
              left: 'center'
            },
            tooltip: {
              trigger: 'item'
            },
            legend: {
              orient: 'vertical',
              data: ['销售额'],    // 要和series.name一致
              x:'left',
              y:'center'
            },
            series: [{
                name: '销售额',
                type: 'pie',
                radius: '50%',
                data: [
                  { value: 1048, name: '服装' },
                  { value: 735, name: '玩具' },
                  { value: 580, name: '家用电器' },
                  { value: 484, name: '图书' },
                  { value: 300, name: '化妆品' }
                ],         
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                  }
                }
              }
            ]           
          });
      }
    }
</script>

<!-- 添加"scoped"属性来限制CSS仅作用于这个组件 -->
<style scoped>
.left{
  width:50%;
}
.right{
  float:right;
  padding-right: 30px;
}
</style>

修改App.vue,增加导航链接如下:

<li><router-link to="/pie">饼状图</router-link></li> 

修改main.js,导入Pie.vue并增加路由映射,如下:

......
// 1. 定义路由组件.  
import BarPage from "./views/Bar.vue"
import PiePage from "./views/Pie.vue"

// 2. 定义一些路由映射
const routes = [
    { path: '/', component: BarPage },
    { path: '/bar', component: BarPage },
    { path: '/pie', component: PiePage },
]
......

测试结果。首先启动服务器,然后打开浏览器,访问http://http://localhost:8080/,点击饼状图链接,可以看到如下的绘图界面:


绘制折线图

同样地,在src/views/文件夹下,创建一个Line.vue文件,编辑内容如下:

<template>
  <h2>折线图</h2>
  <div class="right">
      <p><pre>{{ items }}</pre></p>
  </div>

  <div class="left"> 
    <!-- echarts图表绘制在这里 -->
    <div id="canvas" style="width: 600px;height:400px;"></div>    
  </div> 
</template>

<script>
    import * as echarts from 'echarts'     

    export default {
      name: 'LineGraph',
      data () {
        return {
          items: ''
        }
      },
      mounted () {
          // 根据准备好的dom初始化echarts实例
          var myChart = echarts.init(document.getElementById('canvas'));

          // 使用刚才指定的配置项和数据显示图表
          myChart.setOption({
              title: {
                text: '2016年11月总销售额的变化情况,返回(日期, 销售额(千万元))'
              },
              tooltip: { },
              legend: {
                data: ['销售额(千万元)'],    // 要和series.name一致
                x:'right',
                y:'30px'              
              },
              xAxis: {
                type: 'category',
                data: ['周一','周二','周三','周四','周五','周六','周日']  
              },
              yAxis: {
                type: 'value'
              },
              series: [
                {
                  name: '销售额(千万元)',
                  data: [820, 532, 901, 334, 1290, 730, 1320],    
                  type: 'line',
                  smooth: true
                }
              ]
            });
      }
    }
</script>

<!-- 添加"scoped"属性来限制CSS仅作用于这个组件 -->
<style scoped>
.left{
  width:50%;
}
.right{
  float:right;
  padding-right: 30px;
}
</style>

修改App.vue,增加导航链接如下:

<li><router-link to="/line">折线图</router-link></li> 

修改main.js,导入Pie.vue并增加路由映射,如下:

......
// 1. 定义路由组件.  
import BarPage from "./views/Bar.vue"
import PiePage from "./views/Pie.vue"
import LinePage from "./views/Line.vue"

// 2. 定义一些路由映射
const routes = [
    { path: '/', component: BarPage },
    { path: '/bar', component: BarPage },
    { path: '/pie', component: PiePage },
    { path: '/line', component: LinePage },
]
......

测试结果。首先启动服务器,然后打开浏览器,访问http://http://localhost:8080/,点击折线图链接,可以看到如下的绘图界面:

绘制折混图

同样地,在src/views/文件夹下,创建一个Line.vue文件,编辑内容如下:

<template>
  <h2>折混图</h2>
  <div class="right">
      <p><pre>{{ items }}</pre>   </p>
  </div>

  <div class="left"> 
    <!-- echarts图表绘制在这里 -->
    <div id="canvas" style="width: 600px;height:400px;"></div>    
  </div> 
</template>

<script>
    import * as echarts from 'echarts'     

    // 指定图表的配置项和数据
    var option = {
            title: {
              text: '每天的总销售量和总评论数'
            },
            tooltip: {
              trigger:'axis',
              formatter: '{b0}({a0}): {c0}<br />{b1}({a1}): {c1}%'
            },
            legend: {
                data:['销量','占比'],
                x:'right'
            },
            xAxis: {
                data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] 
            },
            yAxis: [ 
              {
                type: 'value',
                name: '销量',
                show:true,
                interval: 10,
                axisLine: {
                    lineStyle: {
                        color: '#5e859e',
                        width: 2
                    }
                }
              },
              {
                type: 'value',
                name: '占比',
                min: 0,
                max: 100,
                interval: 10,
                axisLabel: {
                    formatter: '{value} %'
                },
                axisLine: {
                    lineStyle: {
                        color: '#5e859e',//纵坐标轴和字体颜色
                        width: 2
                    }
                }
            }],
            series: [{
                name: '销量',
                type: 'bar',
                barWidth : '50%',
                data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] 
            },{
                name: '占比',
                type: 'line',
                smooth:true,
                data: [20.0, 22.0, 33.0, 45.5, 48.3, 78.2, 90.3, 103.4, 43.0, 26.5, 22.0, 16.2] 
            }]
        };

     export default {
          name: 'MixGraph',
          data () {
            return {
              items: ''
            }
          },
          mounted () {
              // 根据准备好的dom初始化echarts实例
              var myChart = echarts.init(document.getElementById('canvas'));
              // 使用指定的配置项和数据显示图表。
              myChart.setOption(option);
          }
        }
</script>

<!-- 添加"scoped"属性来限制CSS仅作用于这个组件 -->
<style scoped>
.left{
  width:50%;
}
.right{
  float:right;
  padding-right: 30px;
}
</style>

修改App.vue,增加导航链接如下:

<li><router-link to="/mix">折混图</router-link></li> 

修改main.js,导入Mix.vue并增加路由映射,如下:

......
// 1. 定义路由组件.  
import BarPage from "./views/Bar.vue"
import PiePage from "./views/Pie.vue"
import LinePage from "./views/Line.vue"
import MixPage from "./views/Mix.vue"

// 2. 定义一些路由映射
const routes = [
    { path: '/', component: BarPage },
    { path: '/bar', component: BarPage },
    { path: '/pie', component: PiePage },
    { path: '/line', component: LinePage },
    { path: '/mix', component: MixPage },
]
......

测试结果。首先启动服务器,然后打开浏览器,访问http://http://localhost:8080/,点击折混图链接,可以看到如下的绘图界面:


《Spark原理深入与编程实战》