0


在 Visual Studio Code 中创建 Vue 工程使用 Echarts 代码实现可视化

一、下载安装Node.js

(1)Node.js官方安装包及源码下载地址:Node.js — Run JavaScript Everywhere

(2)检测是否安装成功:win+R,输入“cmd”,打开,输入“node --version”检查Node.js版本

(3)Node.js安装完毕,会自动在系统的path环境变量中配置,无法在终端查看,重启电脑重新加载就可以了。也可以删掉自动配置的,手动再加上即可。如:打开计算机属性-高级系统设置-环境变量,在系统变量列表中找到path变量

二、安装vue脚手架

【win+R,输入“cmd”,打开,复制粘贴】

**(1)切换淘宝镜像:npm config set registry https://registry.npmmirror.com **

(2)安装vue脚手架:npm install -g @vue/cli

三、下载安装Visual Studio Code

(1)Visual Studio Code 官方安装包及源码下载地址:Visual Studio Code - Code Editing. Redefined

(2)快捷键Ctrl + Shift + X,左侧上方输入Chinese,安装中文包

bcccf7b1d6964d0f8ec8eba2ddc6d019.png

四、创建文件夹方便代码存放

(1)找到Visual Studio Code的安装目录,进入创建文件夹(不要用中文),我这里为vue_stud

0588f42bdb614f8e910e29045be01712.png

0d44c0c2fee646e3a8c987ed7ef41786.png

五、进入Visual Studio Code 创建vue项目

(1)新建终端

32ade44dcd564425a0a44d91ee7f334d.png

(2)cd进入之前创建的文件夹里面vue_study,点击新建终端也可能直接进入这个路径

0e35298e704b4cb39e0c4c28b79d0b2a.png

(3)创建项目:vue create vue_project 这里的(vue_project)为项目名称,回车

4e552b12217548b29fa24232f3948f74.png

(4)选择安装版本,我这里选择的自义定配置(Manually select features),相比直接配置vue3和vue2,可以节省后续的一些配置,键盘上下方向键选择,回车

5662f2e3c4ae46b0a548264b7a112e68.png

(5)按空格键选择要安装的配置资源,()中带“*”说明选中,未选完前千万不要按回车,不小心按了回车可以退出重来。下面是我用到的一些配置资源选择,回车

d43c3a8aa5034bad810e57be22c89ec4.png

(6)选择版本,我这里用的是2.x,键盘上下方向键选择,回车

a1d3ec0b300444f5a68db75aa75fb031.png

(7)Use history mode for router? (Requires proper server setup for index fallback in production),是否为路由使用历史模式?(在生产环境中需要正确设置服务器以实现索引回退),我这里选择的是n

34a945124c9b4dde8cc3d107095d196f.png

(8)请选择Css预处理语言 键盘上下方向键选择Less,回车 (选择Less主要为css解决浏览器兼容,简化css代码等问题)

412938d008284b138a29a79c3b0bf5c8.png

(9)如何存放配置,键盘上下方向键选择In package.json,回车

b35cbaab67ea4f88a73b2b9d0ba673bd.png

(10)是否保存本地配置(这里选择yes会保存一个模版,以后创建项目可以直接选择,但是刚学习应该多练手,不建议保存),所以我选择的是n

756337ea267140dfb9f9cebd273b26e8.png

**(11)等待安装配置即可,自义定配置的过程相比会比较慢 **

899fe0686e4e4688babbf9327a3870ef.png

(12)搭建完毕,输入所给命令进入项目:cd vue_project 启动项目:npm run serve 按住Ctrl点击Local后面的http://localhost:8080/**进行访问**

eedf4ee8bdb74477b1b5e1192297fc61.png

8f676488c92b4be489e08143894c5e2c.png

1d7e976c3fe24ef6ba76b0e854f85535.png

六、vue引入echarts

在终端输入npm install echarts

30787ef7692f495aaeb999f7ae35cc80.png

七、vue引入Axios

(1)新建终端,进入刚才创建的项目cd vue_project

109407e6d04142838b61062c7263d573.png

(2)命令安装axios和vue-axios

npm install axios

cdbd9c7cae6f43cbbb77241c903d0237.png

npm install vue-axios

c138893d618f48149af11b236a72f390.png

(3)之后在main.js里面完整引入

3c45a5ecd49b426b838c85c342a27e26.png

import axios from 'axios'

import VueAxios from 'vue-axios'

// VueAxi0s 与 axios 的位置不能交换

//否则出现 TypeError:Cannot read property 'protocol' of undefined

Vue.use(VueAxios,axios)

fb87cec1dc3c4176b1e9bd18e03b207d.png

八、修改vue.config.js文件

3b8926b08633435f8009472c8eb0b7eb.png

module.exports = {

** devServer: {**

** port: 9000, // 端口号的配置**

** open: true, // 自动打开浏览器**

** proxy: {**

** '/api': {**

** target: 'http://192.168.45.10:8999/', // 目标 API 地址**

** changeOrigin: true, // 允许跨域**

** pathRewrite: {**

** '^/api': '' // 重写路径**

** }**

** }**

** }**

** }**

}

c1e7f73784d34a2d8083390165d4053c.png

九、删除无关内容

(1)项目vue_project下的App.vue

嫌美观可以删掉这里面的内容,之后会在这引入自定的组件按钮,也可以直接注释,当一个模板使用

0aa0038329284707a2f69042e2570f7f.png

(2)项目vue_project下的子文件夹views,直接删除这俩个vue项目,

jsconfig.json文件会警告,重新保存即可

4eb64c41c5b443c48907b3dbd8906d0b.png

(3)项目vue_project下的子文件夹router里的index.js文件

嫌美观的可以删掉这里面的内容,之后会在这引入自定的组件,也可以不用删除,当一个模板使用

28ad2b7de87648809d0b5a28b6bfc8e2.png

十、新建子组件

5a633a4c8da041cb9f6edf48362b38d8.png

我这里建了bar_study.vue 和 pie_study.vue

9c14cd1fec0141ef9b4808de3804d4c7.png

十一、引入子组件

项目vue_project下的子文件夹router里的index.js文件

import bar_study from '../views/bar_study.vue'

import pie_study from '../views/pie_study.vue'

======================================

{

path: '/echatr_bar',

name: 'bar',

component: bar_study,

},

{

path: '/echart_pie',

name: 'pie',

component: pie_study,

},

======================================

6982457217544faa97b44e2e08b1b671.png

十二、在父组件中调用子组件

<nav>

 ♡ <router-link to="/echatr_bar">服务器柱状图</router-link> ♡

  <router-link to="/echatr_pie">服务器饼图</router-link> ♡

</nav>

<router-view/>

1682d6fe6b8a428e8bf6bbf0825dbb54.png

十三、在子组件中编写echarts代码获取服务器数据

基本格式

<template> </template> <script> </script> <style> </style>

终端启动

fd548b49a26446fab7e9fc66ad5cb72b.png

任务一:用柱状图展示消费额最高的省份

编写Vue工程代码,根据接口,用柱状图展示2020年消费额最高的5个省份,同时将用于图表展示的数据结构在浏览器的console中进行打印输出,将图表可视化结果和浏览器console打印结果分别截图并粘贴至对应报告中。

代码如下,注意调用部分已经使用特殊格式标注:

<template>
<div id="echart_bar"></div>
</template> <script> import * as echarts from 'echarts'; import axios from 'axios'; export default { name: 'bar', data() { return { // 存储 echarts 实例 myEcharts: {} }; }, mounted() { // 请求数据 axios({ url: "/api/dataVisualization/selectOrderInfo", method: 'post', data: { "startTime": "2020-01-01 00:00:00", "endTime": "2020-12-31 23:59:59" } }).then(({ data }) => { // 对获取到的接口数据进行省份名字分组聚合处理,并排序过滤出最大的7个省份 var a = data.data.reduce((acc, r) => {// 使用数组的reduce方法对data.data进行迭代处理,在回调函数中,acc代表累加器,初始为一个空数组,随着迭代逐渐积累处理后的结果;r代表当前正在处理的数组元素,即接口数据中的每一个对象。 // 检查是否已存在当前省份的聚合数据 var flag = acc.find(item => item.provinceName === r.provinceName);// 使用数组的find方法在累加器acc中查找是否有省份名称与当前处理对象r的省份名称相同的元素 if (!flag) { // 如果不存在相同省份名称的元素,将当前对象的省份名称和对应的金额作为一个新的对象添加到累加器acc中 acc.push({ provinceName: r.provinceName, value: r.finalTotalAmount }); } else { // 如果存在相同省份名称的元素,将当前对象的金额累加到已有的省份对应的金额上 flag.value += r.finalTotalAmount; } return acc; }, []).sort((a, b) => b.value - a.value).slice(0, 7);// 对处理后的累加器数组进行排序,按照每个对象的value属性(金额)从大到小排序。slice(0, 7)取排序后的前 7 个元素。 // 打印出最终处理得到的包含前 7 个省份聚合数据的数组 console.log(a); // 使用 echarts.init 初始化 echarts 实例 this.myEcharts = echarts.init(document.getElementById('echart_bar'), // 主题颜色大小 'pink', { height: 480, width: 900 }); // 设置 echarts 图表选项 this.myEcharts.setOption({ title: { text: '2020年消费额最高的5个省份', left: 'left', // 标题水平向左显示 top: 'top', // 标题置顶显示 //文字样式 textStyle: { color: 'purple' // 设置字体颜色为紫色 }, //标题边框 borderWidth: 1, // 标题边框数值 borderColor: 'red', // 标题边框颜色 borderRadius: 10 // 标题边框圆角 }, legend: {}, // 提示框 tooltip: {}, //toolbox工具----导出图片、数据视图、动态类型切换、数据区域缩放、重置 toolbox: { show: true, // 开启 feature: { saveAsImage: {}, // 导出图片 dataView: {}, // 数据视图 magicType: { // 动态类型切换 type: ['line', 'bar'] // 折线图》》》柱状图 }, dataZoom: {}, // 数据区域缩放 restore: {}, // 重置 } }, xAxis: { type: 'category', data: a.map(r => r.provinceName) }, yAxis: { type: 'value' }, series: [ { data: a.map(r => ({ value: [ r.provinceName, r.value ] })), type: 'bar', } ] }); }); } }; </script> <style> #echart_bar { width: 850px; height: 400px; } </style>

一键复制

<template>
    <div id="echart_bar"></div>
</template>

<script>
import * as echarts from 'echarts';
import axios from 'axios';
export default {
    name: 'bar',
    data() {
        return {
            // 存储 echarts 实例
            myEcharts: {}
        };
    },
    mounted() {
        // 请求数据
        axios({
            url: "/api/dataVisualization/selectOrderInfo",
            method: 'post',
            data: {
                "startTime": "2020-01-01 00:00:00",
                "endTime": "2020-12-31 23:59:59"
            }
        }).then(({ data }) => {
            // 对获取到的接口数据进行省份名字分组聚合处理,并排序过滤出最大的7个省份
            var a = data.data.reduce((acc, r) => {// 使用数组的reduce方法对data.data进行迭代处理,在回调函数中,acc代表累加器,初始为一个空数组,随着迭代逐渐积累处理后的结果;r代表当前正在处理的数组元素,即接口数据中的每一个对象。
                // 检查是否已存在当前省份的聚合数据
                var flag = acc.find(item => item.provinceName === r.provinceName);// 使用数组的find方法在累加器acc中查找是否有省份名称与当前处理对象r的省份名称相同的元素
                if (!flag) {
                    // 如果不存在相同省份名称的元素,将当前对象的省份名称和对应的金额作为一个新的对象添加到累加器acc中
                    acc.push({ provinceName: r.provinceName, value: r.finalTotalAmount });
                } else {
                    // 如果存在相同省份名称的元素,将当前对象的金额累加到已有的省份对应的金额上
                    flag.value += r.finalTotalAmount;
                }
                return acc;
            }, []).sort((a, b) => b.value - a.value).slice(0, 7);// 对处理后的累加器数组进行排序,按照每个对象的value属性(金额)从大到小排序。slice(0, 7)取排序后的前 7 个元素。
            // 打印出最终处理得到的包含前 7 个省份聚合数据的数组
            console.log(a);
            // 使用 echarts.init 初始化 echarts 实例
            this.myEcharts = echarts.init(document.getElementById('echart_bar'),
                // 主题颜色大小
                'pink', {
                height: 480,
                width: 900
            });
            // 设置 echarts 图表选项
            this.myEcharts.setOption({
                title: {
                    text: '2020年消费额最高的5个省份',
                    left: 'left', // 标题水平向左显示
                    top: 'top',  // 标题置顶显示
                    //文字样式
                    textStyle: {
                        color: 'purple' // 设置字体颜色为紫色
                    },
                    //标题边框
                    borderWidth: 1, // 标题边框数值
                    borderColor: 'red', // 标题边框颜色
                    borderRadius: 10 // 标题边框圆角
                },
                legend: {},
                // 提示框
                tooltip: {},
                //toolbox工具----导出图片、数据视图、动态类型切换、数据区域缩放、重置
                toolbox: {
                    show: true, // 开启
                    feature: {
                        saveAsImage: {}, // 导出图片
                        dataView: {}, // 数据视图
                        magicType: { // 动态类型切换
                            type: ['line', 'bar'] // 折线图》》》柱状图
                        },
                        dataZoom: {}, // 数据区域缩放
                        restore: {}, // 重置
                    }
                },
                xAxis: {
                    type: 'category',
                    data: a.map(r => r.provinceName)
                },
                yAxis: {
                    type: 'value'
                },
                series: [
                    {
                        data: a.map(r => ({
                            value: [
                                r.provinceName,
                                r.value
                            ]
                        })),
                        type: 'bar',
                    }
                ]
            });
        });
    }
};
</script>

<style>
#echart_bar {
    width: 850px;
    height: 400px;
}
</style>

b08fcd21bfc84515b3d9d4ca2170bca8.png

任务二:用饼状图展示各地区消费能力

编写Vue工程代码,根据接口,用饼状图展示2020年各地区的消费总额占比,同时将用于图表展示的数据结构在浏览器的console中进行打印输出,将图表可视化结果和浏览器console打印结果分别截图并粘贴至对应报告中。

代码如下,注意调用部分已经使用特殊格式标注:

<template>
<div id="app">

    <!-- 用于容纳图表的容器 -->

    <div id="echart_pie"></div>

    <!-- 添加一个用于显示数据的 div

    <div v-if="dataForChart.length > 0">数据:{{ dataForChart }}</div> -->

</div>
</template> <script> import axios from 'axios'; import * as echarts from 'echarts'; export default { name: 'App', data() { return { // 存储 Echarts 图表实例 chartInstance: null, // 存储用于图表展示的数据 dataForChart: [] }; }, mounted() { axios({ url: 'api/dataVisualization/selectOrderInfo', method: 'post', data: { startTime: '2020-01-01 00:00:00', endTime: '2020-12-31 23:59:59' } }).then(({ data }) => { // 对获取到的数据进行地区消费总额的聚合处理 let regionData = data.data.reduce((acc, r) => { // 获取数据中的地区名称 let region = r.regionName; // 获取数据中的总金额 let amount = r.finalTotalAmount; // 在累加器中查找是否有当前地区的数据 let existingRegion = acc.find(item => item.region === region); if (!existingRegion) { // 如果不存在,添加新的地区数据 acc.push({ region, amount }); } else { // 如果存在,累加消费金额 existingRegion.amount += amount; } return acc; }, []); // 将处理后的数据存储起来 this.dataForChart = regionData; console.log(this.dataForChart); // 初始化图表 this.initChart(); }); }, methods: { initChart() { var chartDom = document.getElementById('echart_pie'); this.chartInstance = echarts.init(chartDom); var totalAmount = this.dataForChart.reduce((acc, item) => acc + item.amount, 0); var option = { title: { text: '2020 年各地区消费总额占比', left: 'center', // 标题水平向左显示 top: 'top', // 标题置顶显示 //文字样式 textStyle: { color: 'purple' // 设置字体颜色为紫色 }, //标题边框 borderWidth: 1, // 标题边框数值 borderColor: 'red', // 标题边框颜色 borderRadius: 10 // 标题边框圆角 }, legend: { show: true, // 开启图例显示 orient: 'vertical', // 图例以垂直方向排列 如果设置为 'horizontal',则图例会以水平方向排列 left: 'right' // 将图例放置在图表的右侧 'left'(左侧)、'top'(顶部)、'bottom'(底部) }, // 提示框 tooltip: { formatter: (params) => { const region = params.name; const amount = params.value; const percent = ((amount / totalAmount) * 100).toFixed(2) + '%'; return `【${region}】消费: ${amount} / 占: ${percent}`; } }, series: [ { name: '消费占比', type: 'pie', data: this.dataForChart.map(item => ({ name: item.region, value: item.amount, percent: ((item.amount / totalAmount) * 100).toFixed(2) + '%' })) } ] }; this.chartInstance.setOption(option); } } }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; } #echart_pie { width: 600px; height: 400px; } </style>

一键复制

<template>
    <div id="app">
        <!-- 用于容纳图表的容器 -->
        <div id="echart_pie"></div>
        <!-- 添加一个用于显示数据的 div
        <div v-if="dataForChart.length > 0">数据:{{ dataForChart }}</div> -->
    </div>
</template>

<script>
import axios from 'axios';
import * as echarts from 'echarts';

export default {
    name: 'App',
    data() {
        return {
            // 存储 Echarts 图表实例
            chartInstance: null,
            // 存储用于图表展示的数据
            dataForChart: []
        };
    },
    mounted() {
        axios({
            url: 'api/dataVisualization/selectOrderInfo',
            method: 'post',
            data: {
                startTime: '2020-01-01 00:00:00',
                endTime: '2020-12-31 23:59:59'
            }
        }).then(({ data }) => {
            // 对获取到的数据进行地区消费总额的聚合处理
            let regionData = data.data.reduce((acc, r) => {
                // 获取数据中的地区名称
                let region = r.regionName;
                // 获取数据中的总金额
                let amount = r.finalTotalAmount;
                // 在累加器中查找是否有当前地区的数据
                let existingRegion = acc.find(item => item.region === region);
                if (!existingRegion) {
                    // 如果不存在,添加新的地区数据
                    acc.push({ region, amount });
                } else {
                    // 如果存在,累加消费金额
                    existingRegion.amount += amount;
                }
                return acc;
            }, []);
            // 将处理后的数据存储起来
            this.dataForChart = regionData;
            console.log(this.dataForChart);
            // 初始化图表
            this.initChart();
        });
    },
    methods: {
        initChart() {
            var chartDom = document.getElementById('echart_pie');
            this.chartInstance = echarts.init(chartDom);
            var totalAmount = this.dataForChart.reduce((acc, item) => acc + item.amount, 0);
            var option = {
                title: {
                    text: '2020 年各地区消费总额占比',
                    left: 'center', // 标题水平向左显示
                    top: 'top',  // 标题置顶显示
                    //文字样式
                    textStyle: {
                        color: 'purple' // 设置字体颜色为紫色
                    },
                    //标题边框
                    borderWidth: 1, // 标题边框数值
                    borderColor: 'red', // 标题边框颜色
                    borderRadius: 10 // 标题边框圆角
                },
                legend: {
                    show: true, // 开启图例显示
                    orient: 'vertical', // 图例以垂直方向排列 如果设置为 'horizontal',则图例会以水平方向排列
                    left: 'right' // 将图例放置在图表的右侧 'left'(左侧)、'top'(顶部)、'bottom'(底部)
                },
                // 提示框
                tooltip: {
                    formatter: (params) => {
                        const region = params.name;
                        const amount = params.value;
                        const percent = ((amount / totalAmount) * 100).toFixed(2) + '%';
                        return `【${region}】消费: ${amount} / 占: ${percent}`;
                    }
                },
                series: [
                    {
                        name: '消费占比',
                        type: 'pie',
                        data: this.dataForChart.map(item => ({
                            name: item.region,
                            value: item.amount,
                            percent: ((item.amount / totalAmount) * 100).toFixed(2) + '%'
                        }))
                    }
                ]
            };
            this.chartInstance.setOption(option);
        }
    }
};
</script>

<style>
#app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
}

#echart_pie {
    width: 600px;
    height: 400px;
}
</style>

fd15bef9475247dc8e48ef3b9b7f4c9a.png

接口文档

  • 获取时间区间内的订单数据:

http****请求方式:POST

**请求地址:**
http://192.168.45.10(标红的地址为可视化接口虚拟机的直连IP):8999/dataVisualization/selectOrderInfo

请求参数:

字段

说明

类型

是否必填

startTime

开始时间

String

endTime

结束时间

String

请求格式:json示例如下

{

"startTime":"2020-01-01 00:00:00",

"endTime":"2020-12-30 00:00:00"

}

返回参数说明:

** **id : 主键

    finalTotalAmount :总金额

** **outTradeNo :订单交易编号(第三方支付用)

    provinceName :省名称

  regionName :地区名称

  userName : 用户名

请求成功返回JSON数据包:

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%2FUsers%2Fhuang%2FAppData%2FLocal%2FTemp%2Fmsohtmlclip1%2F01%2Fclip_image072.gif&pos_id=YTfToczc

{

"msg": "操作成功",

"code": 200,

"data": [

    {

        "id": 78506,

        "finalTotalAmount": 305062.00,

        "outTradeNo": "756847726439369",

        "provinceName": "北京",

        "regionName": "华北",

        "userName": "华馥"

    },

    {

        "id": 78559,

        "finalTotalAmount": 6111.00,

        "outTradeNo": "341957455961748",

        "provinceName": "北京",

        "regionName": "华北",

        "userName": "罗菊兰"

    },

    {

        "id": 78568,

        "finalTotalAmount": 84610.00,

        "outTradeNo": "489992944636772",

        "provinceName": "北京",

        "regionName": "华北",

        "userName": "毛岚"

    },

    …

]

}

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%2FUsers%2Fhuang%2FAppData%2FLocal%2FTemp%2Fmsohtmlclip1%2F01%2Fclip_image072.gif&pos_id=WBXjFiLr

  • 查询每年上架的商品

http****请求方式:POST

**请求地址:**
http://192.168.45.10(标红的地址为可视化接口虚拟机的直连IP):8999/dataVisualization/selectGoodsInfo

请求参数(无具体参数):{},格式为json

返回参数说明:

** **id : 编号

    price :总金额

** **skuName :商品名称

  year :年份

请求成功返回JSON数据包:

{

"msg": "操作成功",

"code": 200,

"data": [

            {

        "id": 1,

        "price": 2220,

        "skuName": "荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB 渐变蓝 移动联通电信4G全面屏手机 双卡双待",

        "year": "2019"

    },

    {

        "id": 2,

        "price": 3321,

        "skuName": "TCL 55A950C 55英寸32核人工智能 HDR曲面超薄4K电视金属机身(枪色)",

        "year": "2019"

    },

    {

        "id": 3,

        "price": 3100,

        "skuName": "小米(MI)电视 55英寸曲面4K智能WiFi网络液晶电视机4S L55M5-AQ 小米电视4S 55英寸 曲面",

        "year": "2019"

    },

    ...

     ]

}

Echarts练习代码

柱状图

<template>
  <div id="echart_bar">条形图</div>
</template>

<script>
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts';
// 按需引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
// import * as echarts from 'echarts/core';
// // 引入柱状图图表,图表后缀都为 Chart
// import { BarChart } from 'echarts/charts';
// // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
// import {
//   TitleComponent,
//   TooltipComponent,
//   GridComponent,
//   DatasetComponent,
//   TransformComponent,
//   DataZoomComponent
// } from 'echarts/components';
// // 标签自动布局、全局过渡动画等特性
// import { LabelLayout, UniversalTransition } from 'echarts/features';
// // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
// import { CanvasRenderer } from 'echarts/renderers';
export default {
  // created() {
  //   // 注册必须的组件
  //   echarts.use([
  //     TitleComponent,
  //     TooltipComponent,
  //     GridComponent,
  //     DatasetComponent,
  //     TransformComponent,
  //     BarChart,
  //     LabelLayout,
  //     UniversalTransition,
  //     CanvasRenderer
  //   ]);
  // },
  mounted() {
    // 初始化图表,设置配置项
    var myChart = echarts.init(document.getElementById('echart_bar'));
    var xdata = ['星期一', '星期二', '星期三', '星期三', '星期五', '星期六', '星期天'];
    var ydata = [912, 680, 568, 792, 699, 872, 563];
    var ydata01 = [832, 729, 654, 699, 750, 799, 612];
    let option = {
      // 标题
      title: {
        text: '张佐天一周看妹子的数量', // 标题名称
        left: 'left', // 标题水平向左显示
        top: 'top',  // 标题置顶显示
        //文字样式
        textStyle: {
          color: 'purple' // 设置字体颜色为紫色
        },
        //标题边框
        borderWidth: 1, // 标题边框数值
        borderColor: 'red', // 标题边框颜色
        borderRadius: 10 // 标题边框圆角
      },
      //提示框
      tooltip: {
        show: true, // 开启提示框
        //trigger: 'axis', // 触发类型为 axis 即在坐标轴触发(默认)       
        trigger: 'item', //  触发类型为 item 在柱状上显示数据       
        //触发类型
        //triggerOn:'mouseover',//移动显示数据
        //triggerOn:'click',//点击显示数据
        //数据显示格式
        //formatter: '{b} : “张佐天”看了 {c} 条抖音妹子'  //【折线图、柱状图、K线图】分别表示  a系列名、b类目名、c数值
        formatter: (params) => {
          if (params.seriesName === '抖音数量') {
            return `${params.name} : “张佐天”看了 ${params.value} 条抖音妹子`;
          } else if (params.seriesName === '快手数量') {
            return `${params.name} : “张佐天”看了 ${params.value} 条快手妹子`;
          }
        }
        // 在 tooltip 的配置中,formatter 接收一个参数 params
        // 这个参数包含了与当前触发提示框的数据点相关的信息,比如数据系列名称(seriesName)、数据项名称(name)和数据值(value)等
        // 根据不同的数据系列名称,formatter 函数返回不同的格式化字符串,以在提示框中显示特定的信息
      },
      //toolbox工具----导出图片、数据视图、动态类型切换、数据区域缩放、重置
      toolbox: {
        show: true, // 开启
        feature: {
          saveAsImage: {}, // 导出图片
          dataView: {}, // 数据视图
          magicType: { // 动态类型切换
            type: ['line', 'bar'] // 折线图》》》柱状图
          },
          dataZoom: {}, // 数据区域缩放
          restore: {}, // 重置
        }
      },
      legend: {
        show: true, // 开启
        data: ["抖音数量", "快手数量"], // 与 series 里面的 name 的值保持一致
      },
      // 直角坐标系
      xAxis: {
        type: 'category', // 类目轴
        data: xdata
      },
      yAxis: {
        type: 'value' // 数值轴
      },
      // 系列列表。每个 series 是一个数据集的配置项及绘制图表所用的属性。
      series: [
        {
          name: '抖音数量',//系列名称
          type: 'bar',//图表类型
          data: ydata,
          //最值
          markPoint: {
            data: [
              { type: 'max', name: '最大值' }, // 最大值
              { type: 'min', name: '最小值' } // 最小值
            ]
          },
          // 平均值
          markLine: {
            data: [
              { type: 'average', name: '平均值' } // 平均值
            ]
          },
        },
        {
          name: '快手数量',//系列名称
          type: 'bar',//图表类型
          data: ydata01,
          //最值
          markPoint: {
            data: [
              { type: 'max', name: '最大值' }, // 最大值
              { type: 'min', name: '最小值' } // 最小值
            ]
          },
          // 平均值
          markLine: {
            data: [
              { type: 'average', name: '平均值' } // 平均值
            ]
          },
        }
      ]
    }
    myChart.setOption(option);
  }
}
</script>

<style>
#echart_bar {
  width: 600px;
  height: 400px;
  margin: 40px auto;
}
</style>

5e9b19c56b02405eb1ca32e06b189234.png

折线图

<template>
  <div id="echart_line">折线图</div>
</template>

<script>
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts';
export default {
  mounted() {
    // 初始化图表,设置配置项
    var myChart = echarts.init(document.getElementById('echart_line'));   
    // 指定图表的配置项和数据
    var x_data = ['星期一', '星期二', '星期三', '星期三', '星期五', '星期六', '星期天'];
    var y_data_01 = [912, 680, 568, 792, 699, 872, 563];
    var y_data_02 = [732, 629, 654, 599, 650, 699, 512];
    let option = {
      // 标题
      title: {
        text: '粟文宣一周看妹子的数量', // 标题名称
        left: 'left', // 标题水平向左显示
        top: 'top',  // 标题置顶显示
        //文字样式
        textStyle: {
          color: 'purple' // 设置字体颜色为紫色
        },
        //标题边框
        borderWidth: 1, // 标题边框数值
        borderColor: 'red', // 标题边框颜色
        borderRadius: 10 // 标题边框圆角
      },
      //提示框
      tooltip: {
        show: true, // 开启提示框
        //trigger: 'axis', // 触发类型为 axis 即在坐标轴触发(默认)       
        trigger: 'item', //  触发类型为 item 在柱状上显示数据       
        //触发类型
        //triggerOn:'mouseover',//移动显示数据
        //triggerOn:'click',//点击显示数据
        //数据显示格式
        //formatter: '{b} : “张佐天”看了 {c} 条抖音妹子'  //【折线图、柱状图、K线图】分别表示  a系列名、b类目名、c数值
        formatter: (params) => {
          if (params.seriesName === '抖音数量') {
            return `${params.name} : “粟文宣”看了 ${params.value} 条抖音妹子`;
          } else if (params.seriesName === '快手数量') {
            return `${params.name} : “粟文宣”看了 ${params.value} 条快手妹子`;
          }
        }
        // 在 tooltip 的配置中,formatter 接收一个参数 params
        // 这个参数包含了与当前触发提示框的数据点相关的信息,比如数据系列名称(seriesName)、数据项名称(name)和数据值(value)等
        // 根据不同的数据系列名称,formatter 函数返回不同的格式化字符串,以在提示框中显示特定的信息
      },
      //toolbox工具----导出图片、数据视图、动态类型切换、数据区域缩放、重置
      toolbox: {
        show: true, // 开启
        feature: {
          saveAsImage: {}, // 导出图片
          dataView: {}, // 数据视图
          magicType: { // 动态类型切换
            type: ['line', 'bar'] // 折线图》》》柱状图
          },
          dataZoom: {}, // 数据区域缩放
          restore: {}, // 重置
        }
      },
      legend: {
        show: true, // 开启
        data: ["抖音数量", "快手数量"], // 与 series 里面的 name 的值保持一致
      },
      // 直角坐标系
      xAxis: {
        type: 'category', // 类目轴
        data: x_data,
        //boundaryGap: false, // 紧挨边缘,默认值true
      },
      yAxis: {
        type: 'value', // 数值轴
        scale: true, // y 轴值不从 0 开始,从数据中 最小值 开始
      },
      // 系列列表。每个 series 是一个数据集的配置项及绘制图表所用的属性。
      series: [
        {
          name: '抖音数量',//系列名称
          type: 'line',//图表类型
          data: y_data_01,         
          //stack: "stack", // 堆叠图,俩数据中的 stack 值必须 相同
          //areaStyle: {}, // 堆叠图,使效果更明显

          // 最值
          markPoint: {
            data: [
              { type: 'max', name: '最大值' }, // 最大值
              { type: 'min', name: '最小值' } // 最小值
            ]
          },
          // 平均值
          markLine: {
            data: [
              { type: 'average', name: '平均值' } // 平均值
            ]
          },
          // 标注区间
          markArea: {
            data: [
              [
                {x_data:'星期一'}, //开始值
                {x_data:'星期二'}, //结束值
              ],
            ],
          },
          // 区域填充
          areaStyle: {
            type: 'default', // 区域填充样式
            //color: 'red' // 区域填充颜色
          },
          // 线条样式
          lineStyle: {
            width: 3,// 线宽
            color: 'red', // 线条颜色
            type: 'dashed' //虚线  【dotted 点线】、【solid 实线】
          },
          // 点样式
          symbolSize: 6, // 点的大小
          symbol: 'circle', // 点的形状
          smooth: true // 平滑曲线
        },
        {
          name: '快手数量',//系列名称
          type: 'line',//图表类型
          data: y_data_02,        
          //stack: "stack", // 堆叠图,俩数据中的 stack 值必须 相同
          //areaStyle: {}, // 堆叠图,使效果更明显

          // 最值
          markPoint: {
            data: [
              { type: 'max', name: '最大值' }, // 最大值
              { type: 'min', name: '最小值' } // 最小值
            ]
          },
          // 平均值
          markLine: {
            data: [
              { type: 'average', name: '平均值' } // 平均值
            ]
          },
          // 区域填充
          areaStyle: {
            type: 'default' // 区域填充样式
          }
        }
      ]
    }
    myChart.setOption(option);
  }
}
</script>

<style>
#echart_line {
  width: 600px;
  height: 400px;
  margin: 40px auto;
}
</style>

14dd792880304d77aa034af7706a6328.png

饼图

<template>
  <div id="echart_pie">饼图</div>
</template>

<script>
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts';
export default {
  mounted() {
    // 创建数据集
    var myCharts = echarts.init(document.getElementById('echart_pie'));
    var pieData = [
      { value: 10, name: '星期一' },
      { value: 9, name: '星期二' },
      { value: 11, name: '星期三' },
      { value: 9, name: '星期四' },
      { value: 12, name: '星期五' },
      { value: 8, name: '星期六' },
      { value: 9, name: '星期天' }
    ]
    var option = {
      title: {
        text: '黄思勤一周的学习占比', // 标题名称
        left: 'center', // 标题水平向左显示
        top: 'top',  // 标题置顶显示
        //文字样式
        textStyle: {
          fontSize: 25, // 字体大小
          color: 'purple', // 字体颜色
        },
        //标题边框
        borderWidth: 1, // 标题边框数值
        borderColor: 'red', // 标题边框颜色
        borderRadius: 10 // 标题边框圆角
      },
      tooltip: {
        trigger: 'item' // 提示框的触发方式为当鼠标悬停在数据项(饼图的扇区)上时触发
      },
      legend: {
        show: true, // 开启
        orient: 'vertical', // 图例以垂直方向排列 如果设置为 'horizontal',则图例会以水平方向排列
        left: 'left' // 将图例放置在图表的左侧 'right'(右侧)、'top'(顶部)、'bottom'(底部)
      },
      series: [
        {
          emphasis: {
            itemStyle: {
              shadowBlur: 10, // 图形的阴影模糊度为 10
              shadowOffsetX: 0, // 阴影在水平方向上的偏移量为 0
              shadowColor: 'rgba(0, 0, 0, 0.5)' // 阴影的颜色为半透明的黑色。rgba表示颜色的红、绿、蓝和透明度值,这里黑色的 RGB 值为 (0, 0, 0),透明度为 0.5,即半透明状态。
            }
          },
          type: 'pie', // 图表类型
          data: pieData,
          // 饼图文字的显示
          label: {
            show: true, // 显示开启
            //formatter: '{b} : {d}%' //文字显示的内容【饼图、仪表盘、漏斗图】表示 {a}(系列名称),{b}(数据项名称),{c}(数值),{d}(百分比)
            //formatter 的回调函数使用
            formatter: function (params) {
              return params.name + ':学习了【' + params.value + "】小时\n" + params.percent + '%'
            }
          },
          //radius: '60%', // 饼图半径: 百分比参照的是宽度和高度中较小的那一部分的一半来进行百分比设置
          //radius: '60' ,// 饼图半径
          radius: ['50%', '75%'], // 饼图半径:第1个元素代表的是內圆的半径 第2个元素外圆的半径
          //roseType: 'radius', // 南丁格尔图 饼图每一个区域的半径不同
          center: ['53%', '55%'], // 饼图的位置 左右 上下
          //selectedMode:'single', // 选中效果 点击能够将选中的效果偏离 点击下一个回到原样
          selectedMode: 'multiple', // 选中效果 点击能够将选中的效果偏离 点击下一个不会回到原样
          selectedOffset: 30, // 选中效果 偏离的距离
        }
      ]
    }
    myCharts.setOption(option)
  }
}
</script>

<style>
#echart_pie {
  width: 850px;
  height: 400px;
}
</style>

c358c0c5942b4c4697e59d18678ef761.png

标签: vscode vue.js echarts

本文转载自: https://blog.csdn.net/qq_73845968/article/details/143432537
版权归原作者 爱喝咖啡的喵. 所有, 如有侵权,请联系我们删除。

“在 Visual Studio Code 中创建 Vue 工程使用 Echarts 代码实现可视化”的评论:

还没有评论