前言:本文档主要讲解 echarts 在 vue3 中的用法,及其 echarts 的一些配置参数含义及用法。示例参考 echarts 示例
一:快速开始
1. 安装 echarts
npm install echarts # or pnpm add echarts # or yarn add echarts
2. 使用 echarts
<script setup lang="ts"> import { onMounted } from "vue"; import * as echarts from "echarts"; const initEchart = () => { // 基于准备好的dom,初始化echarts实例 const myChart = echarts.init(document.getElementById("demo")); // 绘制图表 myChart.setOption({ title: { text: "ECharts 入门示例", }, tooltip: {}, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], }, ], }); }; onMounted(() => { initEchart(); }); </script> <template> <div id="demo" style="width: 600px; height: 400px">demoEchats</div> </template>
二:基础概念
1. 图表容器及大小
1.1 设置 dom 节点宽高
推荐通过 css 设置该节点的宽高,该节点的大小默认就是图表的大小,调用 echarts.init 时必须保证容器已经有宽高了。
<div id="demo" style="width: 600px; height: 400px"></div>
1.2 指定图表大小
如果容器未设置宽高,或你希望图表大小不等于容器大小,可以在初始化图表时设置大小。
// 基于准备好的dom,初始化echarts实例 const myChart = echarts.init(document.getElementById("demo"), null, { width: 600, height: 400, });
1.3 响应容器大小
有时候我们希望图表可以随容器大小的变化而变化,可以通过监听页面的 resize 事件获取浏览器大小改变的事件,然后调用 echartsInstance.resize 改变图表的大小。
<script setup lang="ts"> import { onMounted, ref } from "vue"; import * as echarts from "echarts"; let myChart = null; const initEchart = () => { // 绘制图表 myChart.setOption({ title: { text: "ECharts 入门示例", }, tooltip: {}, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], }, ], }); }; onMounted(() => { // 基于准备好的dom,初始化echarts实例 myChart = echarts.init(document.getElementById("demo")); window.addEventListener("resize", function () { myChart.resize(); }); initEchart(); }); </script> <template> <div id="demo" style="width: 100%; height: 400px">demoEchats</div> </template>
1.4 重置图表大小
通过给 resize 传入参数,重置图表大小。
myChart.resize({ width: 800, height: 400, });
1.5 容器节点的销毁和重建
假设页面有多个标签页,每个标签页都有图表,当切换标签页时,当前标签页的 DOM 节点被移除,再切回来时,就会发现图表"不见了"。这是因为图表的容器节点被移除导致,就算之后节点重新添加,图表所在节点也不存在了,处理方法是,在容器节点被销毁之后,调用 echartsInstance.dispose 销毁实例,在容器节点被重新添加后再次调用 echarts.init 初始化。
tips:在容器节点被销毁时,总是应调用 echartsInstance.dispose 以销毁实例释放资源,避免内存泄漏。
<script setup lang="ts"> import { onMounted, ref, onUnmounted } from "vue"; import * as echarts from "echarts"; let myChart = null; const initEchart = () => { // 绘制图表 myChart.setOption({ title: { text: "ECharts 入门示例", }, tooltip: {}, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], }, ], }); }; const resize = () => { myChart.resize(); }; onMounted(() => { myChart = echarts.init(document.getElementById("demo")); initEchart(); window.addEventListener("resize", resize); }); onUnmounted(() => { myChart.setOption({ echartsInstance: { dispose: false, }, }); window.removeEventListener("resize", resize); }); </script> <template> <div id="demo" style="width: 100%; height: 400px">demoEchats</div> </template>
2. 样式
可以通过颜色主题、调色盘、直接样式设置、视觉映射改变图形元素或文字的颜色、明暗、大小等。
2.1 颜色主题
echarts 内置了 'dark' 主题,其他主题需自己下载。
var chart = echarts.init(dom, "dark");
2.2 调色盘
调色盘,可以在 option 中设置。它给定了一组颜色,图形、系列会自动依次从其中选择颜色。可以设置全局的调色盘,也可以设置系列自己专属的调色盘。
var option = { // 全局调色盘。 color: [ "#c23531", "#2f4554", "#61a0a8", "#d48265", "#91c7ae", "#749f83", "#ca8622", "#bda29a", "#6e7074", "#546570", "#c4ccd3", ], series: [ { type: "bar", // 此系列自己的调色盘。 color: [ "#dd6b66", "#759aa0", "#e69d87", "#8dc1a9", "#ea7e53", "#eedd78", "#73a373", "#73b9bc", "#7289ab", "#91ca8c", "#f49f42", ], // ... }, { type: "pie", // 此系列自己的调色盘。 color: [ "#37A2DA", "#32C5E9", "#67E0E3", "#9FE6B8", "#FFDB5C", "#ff9f7f", "#fb7293", "#E062AE", "#E690D1", "#e7bcf3", "#9d96f5", "#8378EA", "#96BFFF", ], // ... }, ], };
2.3 直接样式设置
这是比较常见的设置方式,在 option 中的很多地方可以设置 itemStyle、lineStyle、areaStyle、label 等等。这些的地方可以直接设置图形元素的颜色、线宽、点的大小、标签的文字、标签的样式等等。后续配置项有详解,在这就不多叙述了。
2.4 高亮样式 emphasis
鼠标悬浮图形元素一般会出现高亮的样式,默认情况下,高亮样式是根据普通样式自动生成的,也可以通过 emphasis 自定义高亮。
myChart.setOption({ title: { text: "ECharts 入门示例", }, tooltip: {}, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], emphasis: { itemStyle: { // 高亮时点的颜色。 color: "blue", }, label: { show: true, // 高亮时标签的文字。 formatter: "This is a emphasis label.", }, }, }, ], });
3. 数据集
常用 series.data 设置系列所需展示数据,但官网推荐使用数据集(dataset)来专门管理数据,因为这样数据可以被多个组件复用。
3.1 在系列中设置数据
var option = { xAxis: { type: "category", data: ["Matcha Latte", "Milk Tea", "Cheese Cocoa", "Walnut Brownie"], }, yAxis: {}, series: [ { type: "bar", name: "2015", data: [89.3, 92.1, 94.4, 85.4], }, { type: "bar", name: "2016", data: [95.8, 89.4, 91.2, 76.9], }, { type: "bar", name: "2017", data: [97.7, 83.1, 92.5, 78.1], }, ], };
3.2 在数据集中设置数据
var option = { legend: {}, tooltip: {}, dataset: { // 提供一份数据。 source: [ ["product", "2015", "2016", "2017"], ["Matcha Latte", 43.3, 85.8, 93.7], ["Milk Tea", 83.1, 73.4, 55.1], ["Cheese Cocoa", 86.4, 65.2, 82.5], ["Walnut Brownie", 72.4, 53.9, 39.1], ], }, // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。 xAxis: { type: "category" }, // 声明一个 Y 轴,数值轴。 yAxis: {}, // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。 series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }], };
或者也可以使用常见的"对象数组"的格式
var option = { legend: {}, tooltip: {}, dataset: { // 用 dimensions 指定了维度的顺序。直角坐标系中,如果 X 轴 type 为 category, // 默认把第一个维度映射到 X 轴上,后面维度映射到 Y 轴上。 // 如果不指定 dimensions,也可以通过指定 series.encode // 完成映射,参见后文。 dimensions: ["product", "2015", "2016", "2017"], source: [ { product: "Matcha Latte", 2015: 43.3, 2016: 85.8, 2017: 93.7 }, { product: "Milk Tea", 2015: 83.1, 2016: 73.4, 2017: 55.1 }, { product: "Cheese Cocoa", 2015: 86.4, 2016: 65.2, 2017: 82.5 }, { product: "Walnut Brownie", 2015: 72.4, 2016: 53.9, 2017: 39.1 }, ], }, xAxis: { type: "category" }, yAxis: {}, series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }], };
3.3 数据集(dataset)到图形 (series) 的映射
指定数据集的列(column)或行(row)映射为系列(series)。通过 series.seriesLayoutBy 属性来配置。默认是按照列(column)来映射。
指定维度映射的规则:通过 series.encode 属性,以及 visualMap 组件来配置。默认情况下维度会自动对应到 dataset.source 中的第一列,之后三个柱图系列的数据一一对应到 dataset.source 中后面每一列。
3.4 数据集(dataset)的行列映射为系列(series)
有了数据表后,用户可以通过 series.seriesLayoutBy 配置项,改变图表对于行列的理解。series.seriesLayoutBy 可取值:
'column': 默认值。系列被安放到 dataset 的列上面。
'row': 系列被安放到 dataset 的行上面。
var option = { legend: {}, tooltip: {}, dataset: { source: [ ["product", "2012", "2013", "2014", "2015"], ["Matcha Latte", 41.1, 30.4, 65.1, 53.3], ["Milk Tea", 86.5, 92.1, 85.7, 83.1], ["Cheese Cocoa", 24.1, 67.2, 79.5, 86.4], ], }, xAxis: [ { type: "category", gridIndex: 0 }, { type: "category", gridIndex: 1 }, ], yAxis: [{ gridIndex: 0 }, { gridIndex: 1 }], grid: [{ bottom: "55%" }, { top: "55%" }], series: [ // 这几个系列会出现在第一个直角坐标系中,每个系列对应到 dataset 的每一行。 { type: "bar", seriesLayoutBy: "row" }, { type: "bar", seriesLayoutBy: "row" }, { type: "bar", seriesLayoutBy: "row" }, // 这几个系列会出现在第二个直角坐标系中,每个系列对应到 dataset 的每一列。 { type: "bar", xAxisIndex: 1, yAxisIndex: 1 }, { type: "bar", xAxisIndex: 1, yAxisIndex: 1 }, { type: "bar", xAxisIndex: 1, yAxisIndex: 1 }, { type: "bar", xAxisIndex: 1, yAxisIndex: 1 }, ], };
3.5 维度(dimension)
当把系列(series)对应到 “列” 时,列就称为“维度(dimension)”,行称为数据项(item)。当把系列(series)对应到 “行” 时,行就是“维度(dimension)”,列就是数据项(item)。
维度名(dimension name)可以在定义在 dataset 的第一行(列)。从第二行(列)开始,才是正式的数据。dataset.source 中第一行(列)到底包含不包含维度名,ECharts 默认会自动探测。也可以通过 dataset.sourceHeader 设置,为 true 显示声明第一行(列)就是维度,为 false 表明第一行(列)开始就直接是数据。
3.6 数据到图形的映射(series.encode)
可以使用 series.encode 来做映射。
var option = { dataset: { source: [ ["score", "amount", "product"], [89.3, 58212, "Matcha Latte"], [57.1, 78254, "Milk Tea"], [74.4, 41032, "Cheese Cocoa"], [50.1, 12755, "Cheese Brownie"], [89.7, 20145, "Matcha Cocoa"], [68.1, 79146, "Tea"], [19.6, 91852, "Orange Juice"], [10.6, 101852, "Lemon Juice"], [32.7, 20112, "Walnut Brownie"], ], }, xAxis: {}, yAxis: { type: "category" }, series: [ { type: "bar", encode: { // 将 "amount" 列映射到 X 轴。 x: "amount", // 将 "product" 列映射到 Y 轴。 y: "product", }, }, ], };
series.encode 声明结构如下。冒号左边可以是坐标系、标签等特定名称,如 'x', 'y', 'tooltip' 等,冒号右边是数据中的维度名(string 格式)或者维度的序号(number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)。
// 在任何坐标系和系列中,都支持: encode: { // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示 tooltip: ['product', 'score'] // 使用 “维度 1” 和 “维度 3” 的维度名连起来作为系列名。(有时候名字比较长,这可以避免在 series.name 重复输入这些名字) seriesName: [1, 3], // 表示使用 “维度2” 中的值作为 id。这在使用 setOption 动态更新数据时有用处,可以使新老数据用 id 对应起来,从而能够产生合适的数据更新动画。 itemId: 2, // 指定数据项的名称使用 “维度3” 在饼图等图表中有用,可以使这个名字显示在图例(legend)中。 itemName: 3 } // 直角坐标系(grid/cartesian)特有的属性: encode: { // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴: x: [1, 5, 'score'], // 把“维度0”映射到 Y 轴。 y: 0 } // 单轴(singleAxis)特有的属性: encode: { single: 3 } // 极坐标系(polar)特有的属性: encode: { radius: 3, angle: 2 } // 地理坐标系(geo)特有的属性: encode: { lng: 3, lat: 2 } // 对于一些没有坐标系的图表,例如饼图、漏斗图等,可以是: encode: { value: 3 }
3.6.1 默认的 series.encode
在坐标系中(如直角坐标系、极坐标系等):
| 有类目轴(axis.type 为 'category'),则将第一列(行)映射到这个轴上,后续每一列(行)对应一个系列。
| 如果没有类目轴,假如坐标系有两个轴(例如直角坐标系的 X Y 轴),则每两列对应一个系列,这两列分别映射到这两个轴上。
如果没有坐标系(如饼图):
| 取第一列(行)为名字,第二列(行)为数值(如果只有一列,则取第一列为数值)。
3.6.2 常见的 series.encode 设置方式
// 把第三列设置为 X 轴,第五列设置为 Y 轴 var option = { series: { // 注意维度序号(dimensionIndex)从 0 开始计数,第三列是 dimensions[2]。 encode: { x: 2, y: 4 }, // ... }, }; // 第三行设置为 X 轴,第五行设置为 Y 轴 var option = { series: { encode: { x: 2, y: 4 }, seriesLayoutBy: 'row' // ... } }; // 把第二列设置为标签 var option = { series: { label: { // `'{@score}'` 表示 “名为 score” 的维度里的值。 // `'{@[4]}'` 表示引用序号为 4 的维度里的值。 formatter: 'aaa{@product}bbb{@score}ccc{@[4]}ddd'; } } }; // 让第 2 列和第 3 列显示在提示框(tooltip) var option = { series: { encode: { tooltip: [1, 2] // ... } // ... } }; // 给维度取名 var option = { dataset: { dimensions: ['score', 'amount'], source: [ [89.3, 3371], [92.1, 8123], [94.4, 1954], [85.4, 829] ] } }; // 把第三列映射为气泡图的点的大小 var option = { dataset: { source: [ [12, 323, 11.2], [23, 167, 8.3], [81, 284, 12], [91, 413, 4.1], [13, 287, 13.5] ] }, visualMap: { show: false, dimension: 2, // 指向第三列(列序号从 0 开始记,所以设置为 2)。 min: 2, // 需要给出数值范围,最小数值。 max: 15, // 需要给出数值范围,最大数值。 inRange: { // 气泡尺寸:5 像素到 60 像素。 symbolSize: [5, 60] } }, xAxis: {}, yAxis: {}, series: { type: 'scatter' } };
3.7 数据的各种格式
除了二维数组还可以是 key-value 格式
dataset: [ { // 按行的 key-value 形式(对象数组),这是个比较常见的格式。 source: [ { product: "Matcha Latte", count: 823, score: 95.8 }, { product: "Milk Tea", count: 235, score: 81.4 }, { product: "Cheese Cocoa", count: 1042, score: 91.2 }, { product: "Walnut Brownie", count: 988, score: 76.9 }, ], }, { // 按列的 key-value 形式。 source: { product: ["Matcha Latte", "Milk Tea", "Cheese Cocoa", "Walnut Brownie"], count: [823, 235, 1042, 988], score: [95.8, 81.4, 91.2, 76.9], }, }, ];
3.8 多个 dataset 以及如何引用他们
可以同时定义多个 dataset。系列可以通过 series.datasetIndex 来指定引用哪个 dataset。
var option = { dataset: [ { // 序号为 0 的 dataset。 source: [], }, { // 序号为 1 的 dataset。 source: [], }, { // 序号为 2 的 dataset。 source: [], }, ], series: [ { // 使用序号为 2 的 dataset。 datasetIndex: 2, }, { // 使用序号为 1 的 dataset。 datasetIndex: 1, }, ], };
echarts 基础入门(下)https://developer.aliyun.com/article/1513297?spm=a2c6h.13148508.setting.33.f8774f0euyBLtl