使用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 写类方式之四
Jul 05 Javascript
Bootstrap 布局组件(全)
Jul 18 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
简单实现jquery焦点图
Dec 12 Javascript
js实现点击按钮弹出上传文件的窗口
Dec 23 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
Vue form 表单提交+ajax异步请求+分页效果
Apr 22 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
JavaScript实现横版菜单栏
Mar 17 Javascript
基于VSCode调试网页JavaScript代码过程详解
Jul 20 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 基于文件头的文件类型验证类函数
2012/05/01 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
使用python解析xml成对应的html示例分享
2014/04/02 Python
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
python实现聚类算法原理
2018/02/12 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
营销与策划专业毕业生求职信
2013/11/01 职场文书
会计顶岗实习心得
2014/01/25 职场文书
专家推荐信模板
2014/05/09 职场文书
历史学专业求职信
2014/06/19 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
班级联欢会主持词
2015/07/03 职场文书