使用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 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
js网页侧边随页面滚动广告效果实现
Apr 14 Javascript
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
jQuery.fn和jQuery.prototype区别介绍
Oct 05 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
javascript编写实用的省市选择器
Feb 12 Javascript
JS随机打乱数组的方法小结
Jun 22 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
Aug 20 Javascript
vue实现鼠标移过出现下拉二级菜单功能
Dec 12 Javascript
JavaScript隐式类型转换代码实例
May 29 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
实用函数3
2007/11/08 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python入门教程之if语句的用法
2015/05/14 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
如何提高python 中for循环的效率
2020/04/15 Python
python退出循环的方法
2020/06/18 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
大学毕业生通用求职信
2013/09/28 职场文书
阳光体育活动方案
2014/02/16 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
python爬取某网站原图作为壁纸
2021/06/02 Python
Mysql 如何查询时间段交集
2021/06/08 MySQL
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server