使用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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
javascript EXCEL 操作类代码
Jul 30 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
Javascript动态创建div的方法
Feb 09 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
Aug 20 Javascript
jQuery 限制输入字符串长度
Jun 20 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
Postman无法正常返回结果问题解决
Aug 28 Javascript
js+canvas实现画板功能
Sep 13 Javascript
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
人族 TERRAN 概述
2020/03/14 星际争霸
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Python对列表的操作知识点详解
2019/08/20 Python
wxPython实现画图板
2020/08/27 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
护理学专业推荐信
2013/12/03 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
实习单位鉴定意见
2015/06/04 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书