使用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 建立对象的方法
Apr 21 Javascript
Mootools 1.2教程 排序类和方法简介
Sep 15 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
Extjs单独定义各组件的实例代码
Jun 25 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
Jul 15 Javascript
简单谈谈json跨域
Mar 13 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 Javascript
JavaScript遍历数组的方法代码实例
Jan 14 Javascript
vue实现简单瀑布流布局
May 28 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
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
业务代表的岗位职责
2013/11/16 职场文书
乡下人家教学反思
2014/02/01 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
老公婚前保证书
2015/02/28 职场文书
管理失职检讨书范文
2015/05/05 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
会计专业自荐信范文
2019/05/22 职场文书
浅谈MySQL之select优化方案
2021/08/07 MySQL
Python list列表删除元素的4种方法
2021/11/01 Python