[本文出自天外归云的博客园]

需求

1. Vue中使用ECharts画散点图

2. 在图中加入加均值线

3. 在图中标注出阴影区域

实现

实现这个需求,要明确两点:

1. 知道如何在vue中使用echarts

2. 要知道如何在echarts散点图中画均值线和阴影区域

在下面的代码option对象的series属性中用到了markLine和markArea,标注最值用到了markPoint。

所以去官方文档搜索标线、标点、标图的关键字要搜mark。

如何在vue中使用echarts见文末。

需要注意的是vue的渲染时序,不要在页面没有渲染完就开始画图,那会找不到你定位id的元素。

如何解决找不到元素的问题呢?网上说是在mounted函数中调用nextTick,这种方法可以试试,我是没成功。所以我自己发明的解法如下:

以下的方法要放到vue文件的watch中,目的是监控showInfo和findAll两个变量的值的变化,一旦变量值变化则执行调用:

showInfo: function() {
// 元素显示了开始画线,待优化,可以细分到不用showInfo控制,用每个chart的v-if分别进行控制,因为有时候可能没有图表数据
if (this.showInfo === true) {
this.findAll = false
this.timer = setInterval(() => {
this.findElements()
}, 1000)
}
},
findAll: function() {
if (this.findAll === true) {
console.log('Timer stop.')
clearInterval(this.timer)
}
}

其中用到的变量都要在data函数中声明赋适当的初始值:

1. this.showInfo控制页面元素的v-if显示开关,而showInfo变量的初始值一般为false,在mounted函数中我们可以把它的值设置为true,等页面加载完后打开显示开关

2. this.timer是定时器,这里用到setInterval函数做一个定时的查询,用来定时查找页面上用来画echarts的div是否已经出现在页面,都找到了就停止定时查找

3. this.findAll是一个signal,一旦为true说明所有元素都已找到,立即清空定时器this.timer,不再定时查询

以下代码放到vue文件的methods中,是watch变量所用到的一些辅助函数:

findElements() {
if (this.findEleById('test_id_1')) {
this.if_find_test_img_1_id = true
}
if (this.findEleById('test_id_2')) {
this.if_find_test_img_2_id = true
}
if (this.findEleById('test_id_3')) {
this.if_find_test_img_3_id = true
}
if (this.if_find_test_img_1_id && this.if_find_test_img_2_id && this.if_find_test_img_3_id) {
this.findAll = true
}
},
findEleById(ele_id) {
var ele = document.getElementById(ele_id)
if (ele !== null) {
console.log('发现id为' + ele_id + '的元素')
return true
}
return false
}

ECharts设置相关的核心代码如下:

<template>
<el-row>
<el-col :span="24">
<div id="chartDivId" :style="{width: '100%', height: '500px'}"></div>
</el-col>
</el-row>
</template>
<script>
export default{
data() {
return {
imgData : {
'columns': ['c1','c2','c3'],
'rows': [
{
'c1': 'v1',
'c2': 'v2',
'c3': 'v3'
},
],
'mean': 2,
'y_top': 3,
'y_bottom': 1
},
methods: {
// 画图函数,传入散点图所在div的id和图表数据
drawImgChart(chartDivId, imgData) {
// 基于准备好的dom,初始化echarts实例
const myChart = this.$echarts.init(document.getElementById(chartDivId))// 绘制图表
var option = {
tooltip: {
trigger: 'axis',
showDelay: 0,
axisPointer: {
show: true,
type: 'cross',
lineStyle: {
type: 'dashed',
width: 1
}
}
},
visualMap: {
min: 0,
max: imgData.mean, // 渐变色最深色对应的y轴坐标
dimension: 1,
precision: 3,
orient: 'vertical',
right: 10,
top: 'center',
text: ['HIGH', 'LOW'],
calculable: true,
inRange: {
color: ['#f2c31a', '#24b7f2']
}
},
xAxis: [
{
type: 'category',
show: false,
scale: true,
splitLine: {
show: true
},
data: imgData.columns, // x轴的数据
axisLabel: {
interval: 0,
rotate: 70
}
}
],
yAxis: [
{
type: 'value',
scale: true,
splitLine: {
show: true
},
axisLabel: {
formatter: '{value} s' // y轴数据的格式 xx s
}
}
],
series: [
{
type: 'scatter',
symbolSize: 5,
data: imgData.rows,
// 设置最大值点和最小值点
markPoint: {
data: [
{ type: 'max', name: '最大值' },
{ type: 'min', name: '最小值' }
]
},
// 设置平均值线
markLine: {
lineStyle: {
normal: {
type: 'solid'
}
},
data: [
{
name: '平均值线',
yAxis: imgData.mean // 数值类型,对应y轴坐标
}
]
},
// 设置阴影区域
markArea: {
silent: true,
itemStyle: {
normal: {
color: '#E8E8E8',
borderWidth: 1,
borderType: 'dashed'
}
},
data: [[{
name: '正常值范围区间',
yAxis: imgData.y_top // 阴影区域上边界
}, {
yAxis: imgData.y_bottom // 阴影区域下边界
}]]
}
}
]
}
myChart.setOption(option)
}
}
}
}
}

谈谈封装

有时候封装的不好不如不封装,封装对外的接口如果不是大家需要的功能,反而相当于给被封装的对象关上了一道门,拒人于封装之外。

比如eleme和baidu维护的两版针对vue使用的vchart,我觉得现在的封装程度就是能用一些echart的基本功能,很多细节都没有封装好。

所以,即使vue不推荐直接操作dom元素,但是这次要在散点图中画线我还是选择用原装的echarts。

更多资料

1. ECharts官网在线调试散点图

2. Vue项目中如何使用ECharts

Vue中使用ECharts画散点图加均值线与阴影区域的更多相关文章

  1. 在vue中使用Echarts画曲线图(异步加载数据)

    现实的工作中, 数据不可能写死的,所有的数据都应该通过发送请求进行获取. 所以本项目的需求是请求服务器获得二维数组,并生成曲线图.曲线图的横纵坐标均从获得的数据中取得. Echarts官方文档: ht ...

  2. vue中使用echarts画饼状图

    echarts的中文文档地址:https://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20EC ...

  3. 在vue中调用echarts中的地图散点图~

    首先!当然是在vue中引入echarts! 命令行  npm install echarts --save 在main.js文件中里引入        import echarts from 'ech ...

  4. vue+vuex+axios+echarts画一个动态更新的中国地图

    一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...

  5. 在vue中使用echarts图表

    在vue中使用echarts图表   转载请注明出处:https://www.cnblogs.com/wenjunwei/p/9815290.html 安装vue依赖 使用npm npm instal ...

  6. 记录下vue 中引用echarts 出现 "TypeError: Cannot read property 'getAttribute' of undefined"问题

    今天做项目,用echarts展示数据 ,自己测试 先测试 了下.写的代码html: <div ref="myChart" style="height:300px;w ...

  7. VUE中集成echarts时 getAttribute of null错误

    错误 错误场景一: 错误提示: 在运行Vue项目时出现了上述错误,出现该错误的原因是Echarts的图形容器还未生成就对其进行了初始化所造成的,代码如下: // 基于准备好的dom,初始化echart ...

  8. vue中使用echarts(vue+vue-cli+axios+jsonp+echarts)

    一.安装echarts: cnpm i echarts -D 二.在vue-cli的main.js文件中引用echarts: import charts from 'echarts' Vue.prot ...

  9. vue中使用echarts的两种方法

    在vue中使用echarts有两种方法一.第一种方法1.通过npm获取echarts npm install echarts --save 2.在vue项目中引入echarts 在 main.js 中 ...

随机推荐

  1. Linux 程序设计1:深入浅出 Linux 共享内存

    笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...

  2. Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么

    Android7.0 PopupWindow的兼容问题   Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...

  3. 不一样的go语言-gopher

    前言   gopher原意地鼠,在golang 的世界里解释为地道的go程序员.在其他语言的世界里也有PHPer,Pythonic的说法,反而Java是个例外.虽然也有Javaer之类的说法,但似乎并 ...

  4. 【python学习-6】异常处理

    最近在网上看到了一种学习方法名叫费曼学习法,说的是学习一个东西的时候,要尝试着给别人讲出来,就是一种备课式的学习. 第一步,选择一个你想要理解的概念, 然后拿出一张白纸, 把这个概念写在白纸的最上边. ...

  5. idea颜色主题

    作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com IDEA 主题样式 === 这个垂直线的 颜 ...

  6. BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)

    题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...

  7. W3School 学习笔记

    网站构建初级教程 1.每个网站开发人员都有必要了解以下几方面的知识: 万维网如何工作 HTML 语言 如何使用层叠样式表 (CSS) JavaScript 编程 XML 标准 服务器脚本技术 使用 S ...

  8. AppleScript脚本学习记录《二》

    关于AppleScript 说到AppleScript,可能涉及到三个含义: 1.AppleScript语言:就是苹果脚本的语言,用来编写运行于Mac系统的脚本. 2.AppleScript脚本:就是 ...

  9. 2018 OO第一次总结(作业1-3)

    第一次作业1.程序分析 (1)OO度量 (2)类图: (3)分析与评价: 这次作业由于作业整体设计难度不大,因此按照去年暑假上的OO先导课老师讲的设计方法很容易实现一个还不错的面向对象式程序,类与类之 ...

  10. 集合(5)—Map之HashMap()

    定义 .Map接口提供了一中种映射关系,其中的元素是以键值对(key- value)的形式存储 ,能够实现根据键(key)快速查找值(value) .键(key)和值(value)可以是任意类型的变量 ...