使用ECharts实现状态区间图


Posted in Javascript onOctober 25, 2018

需求背景

假如有如下图所示的图表需要显示多个网口在一段时间内的多个状态:y轴用于展示各网口,x轴用于展示时间(分钟),使用条形图的不同颜色来表示不同时间区间段的状态,使用深蓝、浅蓝、橙色、红色分别代表正常、繁忙、故障、离线四种状态。以WAN0为例,图中则表示了0~10分钟为正常,10~25分钟为繁忙,25~45分钟为故障,45~60分钟为离线

使用ECharts实现状态区间图

根据此图,很容易想到可以用条形图试试。但后来发现,如果用堆叠条形图,则每种状态在每一个网口对应的图形中只能出现一次,这不能实现需求。于是继续查阅echart官网示例,终于在自定义类型图表中找到了一个相似的示例,地址

通过研究示例代码并进行一番改造,终于实现了上述需求。

在实现的过程中遇到了一个小问题,那就是使用自定义图表实现chart之后,图例不好处理。通过查看条形图的示例,找到了一种显示图例的方法,那就是使用空的条形图来显示图例,因为在series里面配置了条形图并配置name后,echart会自动根据name的值去legend的配置中匹配对应的图例名字并显示。

完整代码如下,保存于本地之后再自己去echart官网下载库文件(完整版)之后即可运行:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>

  <div id="chart-box" style="width:400px;height:300px;border:1px solid black;"></div>

  <script src="./echarts.min.js"></script>
  <script>
    // 初始化echart
    var chart = echarts.init(document.getElementById('chart-box'));

    // 各状态的颜色
    var colors = ['#2f4554', '#61a0a8', '#d48265', '#c23531'];

    // 四种状态
    var state = ['正常', '繁忙', '故障', '离线'];

    // echart配置
    var opt = {
      color: colors,
      tooltip: {
        formatter: function (params) {
          return params.name + ':' + params.value[1] + '~' + params.value[2];
        }
      },
      legend: {
        data: state,
        bottom: '1%',
        selectedMode: false, // 图例设为不可点击
        textStyle: {
          color: '#000'
        }
      },
      grid: {
        left: '3%',
        right: '3%',
        top: '1%',
        bottom: '10%',
        containLabel: true
      },
      xAxis: {
        min: 0 // x轴零刻度对应的实际值
      },
      yAxis: {
        data: ['WAN0', 'WAN1']
      },
      series: [
        // 用空bar来显示四个图例
        {name: state[0], type: 'bar', data: []},
        {name: state[1], type: 'bar', data: []},
        {name: state[2], type: 'bar', data: []},
        {name: state[3], type: 'bar', data: []},
        {
          type: 'custom',
          renderItem: function (params, api) {
            var categoryIndex = api.value(0);
            var start = api.coord([api.value(1), categoryIndex]);
            var end = api.coord([api.value(2), categoryIndex]);
            var height = 24;

            return {
              type: 'rect',
              shape: echarts.graphic.clipRectByRect({
                x: start[0],
                y: start[1] - height / 2,
                width: end[0] - start[0],
                height: height
              }, {
                x: params.coordSys.x,
                y: params.coordSys.y,
                width: params.coordSys.width,
                height: params.coordSys.height
              }),
              style: api.style()
            };
          },
          encode: {
            x: [1, 2],
            y: 0
          },
          data: [
            {
              itemStyle: { normal: { color: colors[0] } },
              name: '正常',
              value: [0, 0, 10]
            },
            {
              itemStyle: { normal: { color: colors[1] } },
              name: '繁忙',
              value: [0, 10, 25]
            },
            {
              itemStyle: { normal: { color: colors[2] } },
              name: '故障',
              value: [0, 25, 45]
            },
            {
              itemStyle: { normal: { color: colors[3] } },
              name: '离线',
              value: [0, 45, 60]
            },
            {
              itemStyle: { normal: { color: colors[0] } },
              name: '正常',
              value: [1, 0, 15]
            },
            {
              itemStyle: { normal: { color: colors[1] } },
              name: '繁忙',
              value: [1, 15, 20]
            },
            {
              itemStyle: { normal: { color: colors[2] } },
              name: '故障',
              value: [1, 20, 35]
            },
            {
              itemStyle: { normal: { color: colors[3] } },
              name: '离线',
              value: [1, 35, 40]
            },
            {
              itemStyle: { normal: { color: colors[0] } },
              name: '正常',
              value: [1, 40, 45]
            },
            {
              itemStyle: { normal: { color: colors[3] } },
              name: '离线',
              value: [1, 45, 60]
            }
          ]
        }
      ]
    };
    chart.setOption(opt);
  </script>
</body>
</html>

对于自定义图表的data字段里数据项:

{
  itemStyle: { normal: { color: colors[0] } },
  name: '正常',
  value: [0, 0, 10]
}
  • itemStyle: 所渲染的矩形的样式
  • name: 该矩形的状态名
  • value: 第0项代表类别标识,例如0就代表WAN0的,1就是WAN1的;第1和第2项代表该矩形区域对应的x坐标范围开始于0,结束于1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript中暂停功能的实现代码
Mar 04 Javascript
借用Google的Javascript API Loader来加速你的网站
Jan 28 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
简化版手机端照片预览组件
Apr 13 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
Jul 05 Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 Javascript
Bootstrap table的使用方法
Nov 02 Javascript
使用 vue-i18n 切换中英文效果
May 23 Javascript
JQuery 实现文件下载的常用方法分析
Oct 29 jQuery
jquery使用FormData实现异步上传文件
Oct 25 #jQuery
详解js访问对象的属性和方法
Oct 25 #Javascript
深入浅析js原型链和vue构造函数
Oct 25 #Javascript
AngularJS 多指令Scope问题的解决
Oct 25 #Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 #jQuery
webpack打包非模块化js的方法
Oct 24 #Javascript
如何实现一个webpack模块解析器
Oct 24 #Javascript
You might like
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
php组合排序简单实现方法
2016/10/15 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python编写Windows Service服务程序
2018/01/04 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
Python2与Python3的区别点整理
2019/12/12 Python
python -v 报错问题的解决方法
2020/09/15 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
大学生两会学习心得体会
2014/03/10 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
2015年项目工作总结
2015/04/29 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
通知怎么写?
2019/04/17 职场文书