Vue怎么使用Echarts創建圖表


摘要:在后台管理系統中,我們經常會遇到圖表,比如說:柱形圖,餅狀圖,折線圖,雷達圖等等,而用來寫圖表插件有很多,我這里主要介紹Echarts在項目里怎么使用,官網地址如下:https://echarts.baidu.com/index.html,詳細信息請閱覽他們的官網文檔和實例,各種圖表都比較完善。

 

本文流程:

1.安裝插件→2.引入Echarts→3.創建圖表→4.修改樣式→5.接入數據

 

一.安裝插件

方法一:npm安裝Echarts

npm install echarts -S

方法二:cnpm安裝Echarts

1.首先我們需要安裝cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

2.然后

cnpm install echarts -S

 

二.引入Echarts

方法一:全局引入

打開main.js文件引入Echarts

import echarts from 'echarts'

然后將echart添加到vue的原型上,這樣就可以全局使用了

Vue.prototype.$echarts = echarts 

方法二:局部引入

全局引入會將所有的echarts圖表打包,導致體積過大,所以我覺得最好還是按需要來局部引入,比如我們需要引入一個柱狀圖

// 引入基本模板
let echarts = require('echarts/lib/echarts')
// 引入柱狀圖組件
require('echarts/lib/chart/bar')
// 引入提示框和title組件
require('echarts/lib/component/tooltip')
require('echarts/lib/component/title')

這里require直接從 node_modules 中查找文件位置進行引入

 

三.創建圖表

當你安裝完插件和在頁面里面引入圖表之后,那么恭喜你可以創建圖表了~

第一步:你首先得創造一個圖表的容器,寬高必須是行內樣式,單位必須是px

<template>
       <div id="myChart" :style="{width: '1000px', height: '600px'}"></div>
</template>

注意:這樣會出現一個問題,因為由於必須固定好寬高,你縮小屏幕的時候,圖表不會隨之適應的縮小,刷新頁面才能適應,解決方法的實現請接着往下看

第二步:繪制圖表,這里我們要注意,echarts初始化應在鈎子函數mounted()中,掛載之后調用

<script>
        export default {
             data() {
                    return {

                   }
              },
             //鈎子函數
             mounted(){
                   this.draw();
             },
             methods: {
                   draw(){
                       // 初始化echarts實例
                        let myChart = this.$echarts.init(document.getElementById('myChart'))
                       // 繪制圖表
                       var option = {
                            //此處占用篇幅過大,先省略等下會進行解釋
                       }
                       //防止越界,重繪canvas
                       window.onresize = myChart.resize;
                       myChart.setOption(option);//設置option
                   }
              }
         }
</script>

解釋

第一點:省略處為繪制圖表的代碼,首先,你打開Echarts官網,找到實例,選取你項目里面需要用到的圖表模板(樣式差不多就行,下文會教你如何修改圖表樣式),點進去,然后你可以看到左側的代碼,把option = {}括號里面的內容放置到我上方省略的代碼處,運行,你頁面即可以看到你所需要的圖表;

第二點:下方代碼防止越界,重匯canvas處,即為可以解決掉屏幕縮小,圖表不會隨之適應的縮小的方法,原理為當瀏覽器發生resize事件的時候,讓其觸發echart的resize事件,重繪canvas

//防止越界,重繪canvas
window.onresize = myChart.resize;
myChart.setOption(option);//設置option

 

四.修改樣式    

當你創建完圖表之后,你會發現你的圖表和UI給的樣式差距太大,這樣寫肯定是不能過關的,所以你得修改圖表樣式,現在我從圖表的左上角說到右下角,如何去更改圖表樣式,首先先上兩張圖表的差異圖:

圖一為Echarts未修改過的柱形圖:

 

圖二為修改樣式之后的柱形圖:

 

樣式修改方法:

1.左上角圖例處:

//圖例
legend: {
      data: ['降水量'],//與series的name對應
       left: '75%',//圖例的離左邊位置,可以用像素,可以用百分比,也可以用center,right等
       top: 12px,//圖例離頂部的位置
       itemWidth: 10,//圖例圖標的寬
       itemHeight: 10,//圖例圖標的高
       textStyle: {
             color: '#878787',//文字的具體的顏色
        }
},

2.右上角切換圖形處:

toolbox: {
       show : true,//顯示
       feature : {
              magicType : {show: true, type: ['line', 'bar']},
       },//柱形圖和折線圖切換
       right: '6%',//離右邊的距離
},

3.中部圖表X軸修改:

//x軸
xAxis: {
        type: 'category',
        data: ['1月', '2月', '3月', '4月', '5月'],//x軸的數據
        splitLine: {show: false},//去除網格分割線
        // splitArea: {show: true},//保留網格區域
        axisLine: {//坐標線
               lineStyle: {
                     type: 'solid',
                     color: '#d8d8d8',//軸線的顏色
                     width:'1'//坐標線的寬度
               }
        },
        axisTick: {//刻度
              show: false//不顯示刻度線
        },
        axisLabel: {
              textStyle: {
                    color: '#878787',//坐標值的具體的顏色
              }
        },
        splitLine: {
              show: false//去掉分割線
        },
 },

4.中部圖表Y軸修改:

yAxis: {
      name: '單位:次',//軸的名字,默認位置在y軸上方顯示,也可不寫
      max: 30,//最大刻度
      type: 'value',
      axisLine: {//
              show: false
      },
      axisTick: {//刻度
              show: false
      },
      axisLabel: {
              textStyle: {
                     color: '#878787',//坐標值得具體的顏色
              }
      },
      minInterval: 5,//標值的最小間隔
      splitLine: {
              lineStyle: {
                      color: ['#f6f6f6'],//分割線的顏色
              }
      }
},

5.柱狀圖形修改:

series: [{
       name: '數量',//每組數據的名字,與圖例對應
       data: [200, 300, 400, 350, 100],//數據
       type: 'bar',//柱狀圖
       itemStyle: {
            normal: {
                 color: '#FD6B71',//設置柱子顏色
                 abel: {
                        show: true,//柱子上顯示值
                        position: 'top',//值在柱子上方顯示
                         textStyle: {
                                color: '#FD6B71'//值得顏色
                         }
                  }
             }
        },
        barWidth: 15//設置柱子寬度,單位為px
 }],

 好吧!整體代碼我也發一份,當你安裝好插件和全局引入后,你可以用以下代碼進行測試有沒有成功,代碼如下:

<template>
       <div class="MyAchievement">
            <div class="MyAchievement-echart">
                   <div class="echart-title">我的業績</div>
                   <div class="echart-content">
                        <div id="myChart" :style="{width: '1500px', height: '460px'}"></div>
                   </div>
            </div>
       </div>
</template>

<script>
export default {
    data() {
        return {

        }
    },
    mounted(){
        this.drawLine();
    },
    methods: {
        drawLine(){
            var myChart = this.$echarts.init(document.getElementById('myChart'));//獲取容器元素
            var option = {
                tooltip : {
                    trigger: 'axis'
                },
                grid: {
                    left: '6%',
                    right: '6%',
                    bottom: '6%',
                    containLabel: true
                },
                legend: {
                    data:['訂單數量','我的業績'],
                    left: '6%',
                    top: 'top',
                    itemWidth: 15,//圖例圖標的寬
                    itemHeight: 15,//圖例圖標的高
                    textStyle: {
                        color: '#3a6186',
                        fontSize:20,
                    }
                },
                toolbox: {
                    show : true,
                    feature : {
                        magicType : {show: true, type: ['line', 'bar']},
                    },
                    right: '6%',
                },
                calculable : true,
                xAxis : [
                    {
                        type : 'category',
                        data : ['01-01','01-02','01-03','01-04','01-05','01-06','01-07'],
                        splitLine: {show: false},//去除網格分割線
                        axisTick: {//刻度
                            show: false//不顯示刻度線
                        },
                        axisLine: {//坐標線
                            lineStyle: {
                                type: 'solid',
                                color: '#e7e7e7',//軸線的顏色
                                width:'2'//坐標線的寬度
                            }
                        },
                        axisLabel: {
                            textStyle: {
                                color: '#3a6186',//坐標值的具體的顏色
                            }
                        },
                        splitLine: {
                            show: false//去掉分割線
                        },
                    }
                ],
                yAxis : [
                    {
                        type : 'value',
                        axisLine: {//
                            show: false
                        },
                        axisTick: {//刻度
                            show: false
                        },
                        axisLabel: {
                            textStyle: {
                                color: '#3a6186',//坐標值的具體的顏色
                            }
                        },
                        splitLine: {
                            lineStyle: {
                                color: ['#e7e7e7'],//分割線的顏色
                            }
                        }
                    }
                ],
                series : [
                    {
                        name:'訂單數量',
                        type:'bar',
                        barWidth: 20,
                        data:[20, 35, 55, 60, 120, 150, 140],
                        itemStyle: {
                            normal: {
                                color: '#00abf7',//設置柱子顏色
                                label: {
                                    show: true,//柱子上顯示值
                                    position: 'top',//值在柱子上方顯示
                                    textStyle: {
                                        color: '#00abf7',//值的顏色
                                        fontSize:16,
                                    }
                                }
                            }
                        },
                    },
                    {
                        name:'我的業績',
                        type:'bar',
                        barWidth: 20,
                        data:[40, 50, 90, 110, 130, 160, 150],
                        itemStyle: {
                            normal: {
                                color: '#ff4f76',//設置柱子顏色
                                label: {
                                    show: true,//柱子上顯示值
                                    position: 'top',//值在柱子上方顯示
                                    textStyle: {
                                        color: '#ff4f76',//值的顏色
                                        fontSize:16,
                                    }
                                }
                            }
                        },
                    }
                ]
            };
            //防止越界,重繪canvas
            window.onresize = myChart.resize;
            myChart.setOption(option);//設置option
        }
    }
}
</script>

<style lang="scss" scoped>
        .MyAchievement{
          display: flex;
          flex-direction: column;
          padding:0px 90px;
        }
        .MyAchievement .MyAchievement-echart{
            width: 100%;
            height: 570px;
            border-radius: 10px;
            border:1px solid #d3d9e9;
            box-shadow: 4px 6px 10px -2px #d3d9e9;
            background-color: #fff;
            display: flex;
            flex-direction: column;
        }
        .MyAchievement-echart .echart-title{
            width: 100%;
            height: 70px;
            background-color: #00abf7;
            border-top-left-radius: 10px;
            border-top-right-radius: 10px;
            font-size: 26px;
            color: #fff;
            text-align: center;
            line-height: 75px;
        }
        .MyAchievement-echart .echart-content{
            width: 100%;
            height: 500px;
            display: flex;
            // align-items: center;
            justify-content: center;
        }
        .echart-content #myChart{
            margin-top: 35px;
        }
</style>

 

 

 

五.接入數據

就比如上方柱形圖,數據為data: [200, 300, 400, 350, 100],我們通過調用接口,把接口數據替換掉之前寫死的數據即可,比如:

axios({
       method:'POST',
       url:this.API.drawline,
}).then(response => {
       //獲取數據
       this.draw= response.data;
       //把原先寫死的數據替換為接口數據即可
       //......           
}).catch(err => {
       console.log(err);
})

 然后,后台返回的參數也許是上面那個格式的,我們直接替換就好,但也可能返回這種格式

[
     {
         num: 16, 
         money: 500, 
         day: "2019-03-15"
      },
      {
         num: 17, 
         money: 540, 
         day: "2019-03-16"
      },
]

這樣我們就需要把參數取出放到一個新數組里面,再進行調用;

var newArrayday  = [];//日期新數組
var newArraynum  = [];//訂單數量新數組
var newArraymoney  = [];//我的業績新數組
var j1 = 0;
var j2 = 0;
var j3 = 0;
for(let i in this.draw){
    newArrayday[j1++] = this.draw[i].day
    newArraynum[j2++] = this.draw[i].num
    newArraymoney[j3++] = this.draw[i].money
}
console.log(newArrayday)
console.log(newArraynum)
console.log(newArraymoney)
this.daylist=newArrayday;//定義
...

然后我們需要把之前圖表方法里面的死數據替換成接口數據,這里需要注意,我們調用之后發現我們取到的數據為空,是因為我們圖表調用方法寫在了mounted里面了,我們需要把方法移至到接口成功方法里面:

axios({
       method:'POST',
       url:this.API.drawline,
}).then(response => {
       //成功調用圖表方法
       this.drawLine();        
}).catch(err => {
       console.log(err);
})

 

 

總結:希望對大家有所幫助,覺得好的可以點個關注,以后方便再來預覽,也可以對我其他博客進行評價,一起學習,一起成長,有什么問題歡迎留言,我將第一時間更改,也謝謝大家能閱讀到這里,你們的支持是我前進的動力!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM