文章目录
【简单】学会在vue2用vue-echarts实现各种图表
🏕️背景:
前段时间基于工作需要学习了
vue-echarts
,一开始各种论坛到处找,但发现令人满意的“流畅”实现教程很少,最终只能自己去看官方文档,一步步实现,终于在花费几个小时后实现人生中的第一个图表了,并且实现后非常很有成就感,能够应用这么炫酷的图表到页面中,真的太爽了,而且还可以自己挑选各种类型的图表,哈哈,所以今天来分享这丝滑的实现方式给各位(方法参考于官方文档-按需引入方式),保证够简单步骤够清晰,学会之后想用什么图表就用什么图表~
最终效果
⚡按照本文章的步骤,最终可实现官方的各种图表(非常简单暴力)。
实现步骤
✨️为了方便理解,我们采用一个干净的
vue2
项目来逐步实现👇。
0. 干净的页面
0️⃣首先,这是一个干净的vue2
页面:
<template>
<div id='test'>真的很干净</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
created() {},
mounted() {},
}
</script>
<style lang='less' scope>
</style>
1. 安装包
1️⃣然后我们安装所需要的包:npm i echarts vue-echarts @vue/composition-api -S
💡概念:
echarts
:前端最常用的图表库;vue-echarts
:基于echarts
的封装工具,方便开发者更轻松的在vue2
中使用echarts
;@vue/composition-api
:是vue
的官方插件,安装后我们就可以使用vue3
里面的Composition API
功能了。
🏷️说明:
使用
vue-echarts
就必须得安装echarts
,你可以理解为vue-echarts
是echarts
的一个工具,让我们在vue
中可以更加方便的使用echarts
;
@vue/composition-api
是vue-echarts
官方文档中要求使用的:“要在
Vue2(<2.7.0)
下使用vue-echarts
,需要确保@vue/composition-api
已经安装”因为官方示例代码中是需要用到这个插件的,所以我们就按照要求安装吧,这就是一个扩展使用
vue3
功能的插件而已,好理解。
2. 格式化页面
2️⃣接着开始格式化页面(核心步骤):
-
先引入必备的插件,并且我们预留一行(注释处),后面需要在这一行额外导入组件:
// 这一行后续还需要放置导入代码 import VChart, { THEME_KEY } from "vue-echarts"; import { ref } from "vue";
🏷️说明:
VChart
是图表的组件,后面以<v-chart>
的形式放置到结构上,而THEME_KEY
则是主题颜色,在下一步中用这个对象去配置主题颜色。完整代码
<template> <div id='test'>真的很干净</div> </template> <script> // 这一行后续还需要放置导入代码 import VChart, { THEME_KEY } from "vue-echarts"; import { ref } from "vue"; export default { data() { return {} }, methods: {}, created() {}, mounted() {}, } </script> <style lang='less' scope> </style>
-
然后配置
components
、provide
、setup(){}
(后两个是@vue/composition-api
带来的,属于Vue3
的新特性):export default { ... components:{ VChart, }, provide: { // 主题颜色(white/dark) [THEME_KEY]: "white", }, setup(){ const option = ref('此处放置option对象'); return { option }; }, ... }
🏷️说明:
components
注册VChart
组件;provide
对象中配置主题颜色,引入THEME_KEY
这个对象作为键名,然后就可以设置值了:white
(白色)和dark
(黑色);setup(){}
中用于配置option
配置对象,配置对象将决定图表长啥样,其中我用字符串预留了一处位置,即'此处放置option对象'
这个地方,后面将用于放置option
配置项。
完整代码
<template> <div id='test'>真的很干净</div> </template> <script> // 这一行后续还需要放置导入代码 import VChart, { THEME_KEY } from "vue-echarts"; import { ref } from "vue"; export default { data() { return {} }, components:{ VChart, }, provide: { // 主题颜色(white/dark) [THEME_KEY]: "white", }, setup(){ const option = ref(此处放置option对象); return { option }; }, methods: {}, created() {}, mounted() {}, } </script> <style lang='less' scope> </style>
-
放置组件,以及设置下元素样式:
<v-chart class="chart" :option="option" autoresize />
<style lang='less' scope> #test{ width: 100%; height: 100vh; } </style>
🏷️说明:
v-chart
是图表的组件元素、option
是它的数据配置对象、autoresize
是设定图表跟随页面尺寸自动缩放。完整代码
<template> <div id='test'> <v-chart class="chart" :option="option" autoresize /> </div> </template> <script> // 这一行后续还需要放置导入代码 import VChart, { THEME_KEY } from "vue-echarts"; import { ref } from "vue"; export default { data() { return {} }, components:{ VChart, }, provide: { // 主题颜色(white/dark) [THEME_KEY]: "white", }, setup(){ const option = ref('此处放置option对象'); return { option }; }, methods: {}, created() {}, mounted() {}, } </script> <style lang='less' scope> #test{ width: 100%; height: 100vh; } </style>
3. 挑选图表
3️⃣经过上面的关键步骤后,我们就初始化配置好了页面,当然现在页面还无法显示出图表,接下来我们就可以开始挑选图表了,进入echarts
的官网示例处:👉点我点我👈,然后我们就到了一个“熟悉”的页面(前面提到过),好的,然后我们挑选一个最简单的:
点击进来之后,我们可以看到官方居然为我们提供了这个图表的option
配置对象!所以我们先将这个配置对象复制,然后粘贴到我们前面准备的'此处放置option对象'
这个地方:
{
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line'
}
]
}
⚙️这些是配置项哦,现在先不管各项配置是干嘛的,复制就完啦(最后面再介绍是干嘛的:先实现,再理解)!
完整代码
<template>
<div id="test">
<v-chart class="chart" :option="option" autoresize />
</div>
</template>
<script>
// 这一行后续还需要放置导入代码
import VChart, { THEME_KEY } from "vue-echarts";
import { ref } from "vue";
export default {
data() {
return {};
},
components: {
VChart,
},
provide: {
// 主题颜色(white/dark)
[THEME_KEY]: "white",
},
setup() {
const option = ref({
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
yAxis: {
type: "value",
},
series: [
{
data: [150, 230, 224, 218, 135, 147, 260],
type: "line",
},
],
});
return { option };
},
methods: {},
created() {},
mounted() {},
};
</script>
<style lang='less' scope>
#test {
width: 100%;
height: 100vh;
}
</style>
4. 最终配置
4️⃣将option
配置对象复制进来之后,就差最后一步啦!此时我们进入vue-echarts
官网的导入代码生成器👉点我点我👈(这个东西能帮我们节省很多时间,根据option
对象智能生成需要导入的组件代码):
进来之后我们将刚才复制的option
配置对象粘贴到这个页面左侧的地方,然后就会发现右边出现了代码,于是我们再点击右边的Copy
按钮,就得到了相应的组件导入代码了~
然后接下来,就只真的差最后最后一步了!还记得之前我们预留了一行注释吗?没错,我们将导入的代码粘贴到那里,就okkkkkkkk啦!!!
🎉实现效果如图:
import { use } from 'echarts/core'
import { LineChart } from 'echarts/charts'
import { GridComponent } from 'echarts/components'
import { CanvasRenderer } from 'echarts/renderers'
use([GridComponent, LineChart, CanvasRenderer])
🔩这些是导入的图表组件,属于按需引入。
完整代码
<template>
<div id="test">
<v-chart class="chart" :option="option" autoresize />
</div>
</template>
<script>
import { use } from "echarts/core";
import { LineChart } from "echarts/charts";
import { GridComponent } from "echarts/components";
import { CanvasRenderer } from "echarts/renderers";
use([GridComponent, LineChart, CanvasRenderer]);
import VChart, { THEME_KEY } from "vue-echarts";
import { ref } from "vue";
export default {
data() {
return {};
},
components: {
VChart,
},
provide: {
// 主题颜色(white/dark)
[THEME_KEY]: "white",
},
setup() {
const option = ref({
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
yAxis: {
type: "value",
},
series: [
{
data: [150, 230, 224, 218, 135, 147, 260],
type: "line",
},
],
});
return { option };
},
methods: {},
created() {},
mounted() {},
};
</script>
<style lang='less' scope>
#test {
width: 100%;
height: 100vh;
}
</style>
5. OK
🆗至此,我们就成功实现人生中的第一个图表啦(对于我来说是这样的)~
学习更多
💪通过上面的步骤例子,我们学会了如何实现一个图表,感觉是不是很简单很暴力(得益于贴心的
echarts
和vue-echarts
),没错,我也是这么觉得的~不过呢,光这样子肯定还不够满足业务需求,所以下面我还会为各位介绍下关于echarts
和vue-echarts
的更多学习与扩展。
如何设定图表样式
🎨设定样式应该是最简单的事情了吧?其实我们只需要给<v-chart>
元素的父级元素写上样式就可以限制图表的大小了,并且还可以通过将THEME_KEY
修改为dark
将图表变成暗黑系主题哟(还可以到官网寻找更多主题哦):
<style lang='less' scope>
#test {
width: 400px;
height: 400px;
}
</style>
provide: {
// 主题颜色(white/dark)
[THEME_KEY]: "dark",
},
如何了解配置项
⚙️图表的配置项,其实都非常简单(3D
除外),为什么这么说呢?因为官方文档全都给你写得明明白白的!我们可以通过echarts
或vue-echarts
的官方文档来了解各个配置项(只有部分配置项需要参考vue-echarts
的文档,例如THEME_KEY
设置主题颜色,而大部分配置项仍是参考echarts
的),如下图:
可以看到,官方文档的配置项是相当的齐啊,可以说无论什么配置,只要你想知道,你就可以从官方文档中找到它的解释,因此我说配置项非常简单是合理的(3D
除外),官方文档链接放文章最底部了~
如何实现动态更新数据
📊前面我们的图表数据都是一开始写死的,而动态更新图表的数据,却是图表中最常见的需求了,所以下面,我们就来实现动态更新数据:
-
首先,图表的配置项通常是
option.series[0].data
这一个,如图: -
但是这个
option
是放在这个什么setup(){}
里面的,我不懂Vue3
该怎么做?哦,没关系,你只需要把它当成是Vue2
里面的data
就行了,因此,事情变得非常简单了,直接赋值就行了~这里我就用一个定时器来简单示例一下:mounted() { setTimeout(()=>{ this.option.series[0].data = [999,1,2,3,4,5,666] },2000) },
⏰️我们在
mounted
这个钩子加上一个定时器,2
秒后,将数据更改为[999,1,2,3,4,5,666]
,效果如下图: -
考虑到图表业务通常都是一开始没有数据,然后通过接口获取数据后,再渲染图表数据的,因此,这里我们还需要实现下这一种业务场景:
-
首先,一开始没有数据,也就意味着一开始图表数据为空,因此我们将配置项的数据全改为
null
:const option = ref({ xAxis: { type: "category", data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], }, yAxis: { type: "value", }, series: [ { data: [null, null, null, null, null, null, null], type: "line", }, ], });
👇然后效果如下图:
-
通过上图,我们可以看到数据一开始为空了,在
2
秒后才出现的数据,但是呢,这样的用户体验十分不好,一开始容易让用户以为是卡了,没有任何的提示,正常业务逻辑都是一开始图表加上提示,比如正在加载中
之类的提示,然后等数据出现了之后,图表才真正的显示出来,不过,这种常见的需求,echarts
官方早就替我们考虑到了,因此我们可以直接通过配置项来实现:-
定义变量,并给元素加上
loading
属性:data() { return { loadingIsShow:true, }; },
<v-chart class="chart" :option="option" autoresize :loading="loadingIsShow"/>
-
引入加载提示的配置项键名对象并配置:
import VChart, { THEME_KEY,LOADING_OPTIONS_KEY } from "vue-echarts";
provide: { // 主题颜色(white/dark) [THEME_KEY]: "dark", // 加载提示的配置项 [LOADING_OPTIONS_KEY]:{ text:'正在加载中' } },
-
在
2
秒后隐藏加载提示:mounted() { setTimeout(()=>{ this.option.series[0].data = [999,1,2,3,4,5,666] this.loadingIsShow = false },2000) },
👇最终效果如图:
-
-
-
👌这样就成功实现动态数据更新以及显示加载提示了~
如何使用其他图表
📈从一开始的例子中,我们实现了一个最简单的图表,而从echarts
官方的示例大全中,其实还有非常非常多各种各样的复杂图表,所以呢,我们想要什么图表就可以直接复制它的option
配置对象去配置,除了有一些非常复杂的3D
地图图表除外(可能需要花费一部分时间去了解复杂的配置项才可以实现),其实大部分图表呢,都是可以按照上面的配置步骤去实现的,这里我就从官方示例中挑选了几个比较炫酷的图表一起实现到了单个页面中,如下图:
⚠️注意:部分图表(就是那个
3D
地球)的配置项可能会有点复杂,导入代码生成器无法正确生成,需要自己去琢磨研究官方文档的配置项哦,这里就不详细介绍了~
🥳是不是很酷,快点自己去动手实现一下吧,然后就可以在小伙伴面前装逼炫耀了哈哈哈
还是放上完整代码吧,以供参考:
<template> <div id="test"> <v-chart class="chart" :option="option" /> <v-chart class="chart" :option="option2" /> <v-chart class="chart" :option="option3" /> <v-chart class="chart" :option="option4" /> </div> </template> <script> // 3D地球的 // ---------------------------- // 需要先npm i echarts-gl import { use } from "echarts"; import { GlobeComponent } from "echarts-gl/components"; use([GlobeComponent]); // AQI 分布 // ---------------------------- const dataBJ = [ [1, 55, 9, 56, 0.46, 18, 6, "良"], [2, 25, 11, 21, 0.65, 34, 9, "优"], [3, 56, 7, 63, 0.3, 14, 5, "良"], [4, 33, 7, 29, 0.33, 16, 6, "优"], [5, 42, 24, 44, 0.76, 40, 16, "优"], [6, 82, 58, 90, 1.77, 68, 33, "良"], [7, 74, 49, 77, 1.46, 48, 27, "良"], [8, 78, 55, 80, 1.29, 59, 29, "良"], [9, 267, 216, 280, 4.8, 108, 64, "重度污染"], [10, 185, 127, 216, 2.52, 61, 27, "中度污染"], [11, 39, 19, 38, 0.57, 31, 15, "优"], [12, 41, 11, 40, 0.43, 21, 7, "优"], [13, 64, 38, 74, 1.04, 46, 22, "良"], [14, 108, 79, 120, 1.7, 75, 41, "轻度污染"], [15, 108, 63, 116, 1.48, 44, 26, "轻度污染"], [16, 33, 6, 29, 0.34, 13, 5, "优"], [17, 94, 66, 110, 1.54, 62, 31, "良"], [18, 186, 142, 192, 3.88, 93, 79, "中度污染"], [19, 57, 31, 54, 0.96, 32, 14, "良"], [20, 22, 8, 17, 0.48, 23, 10, "优"], [21, 39, 15, 36, 0.61, 29, 13, "优"], [22, 94, 69, 114, 2.08, 73, 39, "良"], [23, 99, 73, 110, 2.43, 76, 48, "良"], [24, 31, 12, 30, 0.5, 32, 16, "优"], [25, 42, 27, 43, 1, 53, 22, "优"], [26, 154, 117, 157, 3.05, 92, 58, "中度污染"], [27, 234, 185, 230, 4.09, 123, 69, "重度污染"], [28, 160, 120, 186, 2.77, 91, 50, "中度污染"], [29, 134, 96, 165, 2.76, 83, 41, "轻度污染"], [30, 52, 24, 60, 1.03, 50, 21, "良"], [31, 46, 5, 49, 0.28, 10, 6, "优"], ]; var dataGZ = [ [1, 26, 37, 27, 1.163, 27, 13, "优"], [2, 85, 62, 71, 1.195, 60, 8, "良"], [3, 78, 38, 74, 1.363, 37, 7, "良"], [4, 21, 21, 36, 0.634, 40, 9, "优"], [5, 41, 42, 46, 0.915, 81, 13, "优"], [6, 56, 52, 69, 1.067, 92, 16, "良"], [7, 64, 30, 28, 0.924, 51, 2, "良"], [8, 55, 48, 74, 1.236, 75, 26, "良"], [9, 76, 85, 113, 1.237, 114, 27, "良"], [10, 91, 81, 104, 1.041, 56, 40, "良"], [11, 84, 39, 60, 0.964, 25, 11, "良"], [12, 64, 51, 101, 0.862, 58, 23, "良"], [13, 70, 69, 120, 1.198, 65, 36, "良"], [14, 77, 105, 178, 2.549, 64, 16, "良"], [15, 109, 68, 87, 0.996, 74, 29, "轻度污染"], [16, 73, 68, 97, 0.905, 51, 34, "良"], [17, 54, 27, 47, 0.592, 53, 12, "良"], [18, 51, 61, 97, 0.811, 65, 19, "良"], [19, 91, 71, 121, 1.374, 43, 18, "良"], [20, 73, 102, 182, 2.787, 44, 19, "良"], [21, 73, 50, 76, 0.717, 31, 20, "良"], [22, 84, 94, 140, 2.238, 68, 18, "良"], [23, 93, 77, 104, 1.165, 53, 7, "良"], [24, 99, 130, 227, 3.97, 55, 15, "良"], [25, 146, 84, 139, 1.094, 40, 17, "轻度污染"], [26, 113, 108, 137, 1.481, 48, 15, "轻度污染"], [27, 81, 48, 62, 1.619, 26, 3, "良"], [28, 56, 48, 68, 1.336, 37, 9, "良"], [29, 82, 92, 174, 3.29, 0, 13, "良"], [30, 106, 116, 188, 3.628, 101, 16, "轻度污染"], [31, 118, 50, 0, 1.383, 76, 11, "轻度污染"], ]; var dataSH = [ [1, 91, 45, 125, 0.82, 34, 23, "良"], [2, 65, 27, 78, 0.86, 45, 29, "良"], [3, 83, 60, 84, 1.09, 73, 27, "良"], [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [8, 89, 65, 78, 0.86, 51, 26, "良"], [9, 53, 33, 47, 0.64, 50, 17, "良"], [10, 80, 55, 80, 1.01, 75, 24, "良"], [11, 117, 81, 124, 1.03, 45, 24, "轻度污染"], [12, 99, 71, 142, 1.1, 62, 42, "良"], [13, 95, 69, 130, 1.28, 74, 50, "良"], [14, 116, 87, 131, 1.47, 84, 40, "轻度污染"], [15, 108, 80, 121, 1.3, 85, 37, "轻度污染"], [16, 134, 83, 167, 1.16, 57, 43, "轻度污染"], [17, 79, 43, 107, 1.05, 59, 37, "良"], [18, 71, 46, 89, 0.86, 64, 25, "良"], [19, 97, 71, 113, 1.17, 88, 31, "良"], [20, 84, 57, 91, 0.85, 55, 31, "良"], [21, 87, 63, 101, 0.9, 56, 41, "良"], [22, 104, 77, 119, 1.09, 73, 48, "轻度污染"], [23, 87, 62, 100, 1, 72, 28, "良"], [24, 168, 128, 172, 1.49, 97, 56, "中度污染"], [25, 65, 45, 51, 0.74, 39, 17, "良"], [26, 39, 24, 38, 0.61, 47, 17, "优"], [27, 39, 24, 39, 0.59, 50, 19, "优"], [28, 93, 68, 96, 1.05, 79, 29, "良"], [29, 188, 143, 197, 1.66, 99, 51, "中度污染"], [30, 174, 131, 174, 1.55, 108, 50, "中度污染"], [31, 187, 143, 201, 1.39, 89, 53, "中度污染"], ]; var schema = [ { name: "date", index: 0, text: "日期" }, { name: "AQIindex", index: 1, text: "AQI" }, { name: "PM25", index: 2, text: "PM2.5" }, { name: "PM10", index: 3, text: "PM10" }, { name: "CO", index: 4, text: " CO" }, { name: "NO2", index: 5, text: "NO2" }, { name: "SO2", index: 6, text: "SO2" }, { name: "等级", index: 7, text: "等级" }, ]; var lineStyle = { width: 1, opacity: 0.5, }; import { ParallelChart } from "echarts/charts"; import { LegendComponent, TooltipComponent, VisualMapComponent, ParallelComponent, } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; use([ LegendComponent, TooltipComponent, VisualMapComponent, ParallelComponent, ParallelChart, CanvasRenderer, ]); // 饼图 // ---------------------------- import { PieChart } from "echarts/charts"; use([PieChart]); // 柱状图 // ---------------------------- import { BarChart } from "echarts/charts"; import { GridComponent, MarkLineComponent } from "echarts/components"; use([GridComponent, MarkLineComponent, BarChart]); import VChart, { THEME_KEY } from "vue-echarts"; import { ref } from "vue"; export default { data() { return {}; }, components: { VChart, }, provide: { // 主题颜色(white/dark) [THEME_KEY]: "dark", }, setup() { const option = ref({ backgroundColor: "#000", globe: { baseTexture: require("@/assets/img/world.topo.bathy.200401.jpg"), heightTexture: require("@/assets/img/world.topo.bathy.200401.jpg"), displacementScale: 0.04, shading: "realistic", environment: require("@/assets/img/starfield.jpg"), realisticMaterial: { roughness: 0.9, }, postEffect: { enable: true, }, light: { main: { intensity: 5, shadow: true, }, ambientCubemap: { diffuseIntensity: 0.2, }, }, }, }); const option2 = ref({ backgroundColor: "#333", legend: { bottom: 30, data: ["Beijing", "Shanghai", "Guangzhou"], itemGap: 20, textStyle: { color: "#fff", fontSize: 14, }, }, tooltip: { padding: 10, backgroundColor: "#222", borderColor: "#777", borderWidth: 1, }, parallelAxis: [ { dim: 0, name: schema[0].text, inverse: true, max: 31, nameLocation: "start", }, { dim: 1, name: schema[1].text }, { dim: 2, name: schema[2].text }, { dim: 3, name: schema[3].text }, { dim: 4, name: schema[4].text }, { dim: 5, name: schema[5].text }, { dim: 6, name: schema[6].text }, { dim: 7, name: schema[7].text, type: "category", data: ["优", "良", "轻度污染", "中度污染", "重度污染", "严重污染"], }, ], visualMap: { show: true, min: 0, max: 150, dimension: 2, inRange: { color: ["#d94e5d", "#eac736", "#50a3ba"].reverse(), // colorAlpha: [0, 1] }, }, parallel: { left: "5%", right: "18%", bottom: 100, parallelAxisDefault: { type: "value", name: "AQI指数", nameLocation: "end", nameGap: 20, nameTextStyle: { color: "#fff", fontSize: 12, }, axisLine: { lineStyle: { color: "#aaa", }, }, axisTick: { lineStyle: { color: "#777", }, }, splitLine: { show: false, }, axisLabel: { color: "#fff", }, }, }, series: [ { name: "Beijing", type: "parallel", lineStyle: lineStyle, data: dataBJ, }, { name: "Shanghai", type: "parallel", lineStyle: lineStyle, data: dataSH, }, { name: "Guangzhou", type: "parallel", lineStyle: lineStyle, data: dataGZ, }, ], }); const option3 = ref({ title: { text: "Referer of a Website", subtext: "Fake Data", left: "center", }, tooltip: { trigger: "item", }, legend: { orient: "vertical", left: "left", }, series: [ { name: "Access From", type: "pie", radius: "50%", data: [ { value: 1048, name: "Search Engine" }, { value: 735, name: "Direct" }, { value: 580, name: "Email" }, { value: 484, name: "Union Ads" }, { value: 300, name: "Video Ads" }, ], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: "rgba(0, 0, 0, 0.5)", }, }, }, ], }); const option4 = ref({ tooltip: { trigger: "axis", axisPointer: { type: "shadow", }, }, legend: {}, grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true, }, xAxis: [ { type: "category", data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], }, ], yAxis: [ { type: "value", }, ], series: [ { name: "Direct", type: "bar", emphasis: { focus: "series", }, data: [320, 332, 301, 334, 390, 330, 320], }, { name: "Email", type: "bar", stack: "Ad", emphasis: { focus: "series", }, data: [120, 132, 101, 134, 90, 230, 210], }, { name: "Union Ads", type: "bar", stack: "Ad", emphasis: { focus: "series", }, data: [220, 182, 191, 234, 290, 330, 310], }, { name: "Video Ads", type: "bar", stack: "Ad", emphasis: { focus: "series", }, data: [150, 232, 201, 154, 190, 330, 410], }, { name: "Search Engine", type: "bar", data: [862, 1018, 964, 1026, 1679, 1600, 1570], emphasis: { focus: "series", }, markLine: { lineStyle: { type: "dashed", }, data: [[{ type: "min" }, { type: "max" }]], }, }, { name: "Baidu", type: "bar", barWidth: 5, stack: "Search Engine", emphasis: { focus: "series", }, data: [620, 732, 701, 734, 1090, 1130, 1120], }, { name: "Google", type: "bar", stack: "Search Engine", emphasis: { focus: "series", }, data: [120, 132, 101, 134, 290, 230, 220], }, { name: "Bing", type: "bar", stack: "Search Engine", emphasis: { focus: "series", }, data: [60, 72, 71, 74, 190, 130, 110], }, { name: "Others", type: "bar", stack: "Search Engine", emphasis: { focus: "series", }, data: [62, 82, 91, 84, 109, 110, 120], }, ], }); return { option, option2, option3, option4 }; }, methods: {}, created() {}, mounted() {}, }; </script> <style lang='less' scope> #test { display: flex; width: 100%; height: 100vh; flex-wrap: wrap; .chart { width: 50%; height: 50vh; } } </style>
文档链接
最后,放上
echarts
和vue-echarts
的官方中文文档链接:
echarts
:https://echarts.apache.org/zh/index.htmlvue-echarts
:https://github.com/ecomfe/vue-echarts/blob/main/README.zh-Hans.mdvue-echarts导入代码生成器
:https://vue-echarts.dev/#codegen
第一次写这么长的文章,按照自己喜欢的风格排版了,嘻嘻