Echarts 绘制甘地图(非重叠方式)

如果仅仅是为了将图画出来的话,其实可以使用一种条形图覆盖的方式来绘制

比如:总共的时间段为 0h ~ 24h,实际数据的时间段为 4h ~ 8h。

                那么就可以绘制一条有颜色的时间段(0h ~ 8h),然后再绘制一条无颜色的时间段(0h ~ 4h),将无颜色时间段覆盖在有颜色时间段上,完成甘地图的绘制。

讲真,这方法有点傻傻的,使用起来灵活度也较低,下面就介绍一种使用自定义图表类型来绘制(custom)甘地图的方法:

参考官网的示例:

代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="./echarts_4.7.0.js"></script>
  <style>
    .classroomStyle {
      width: 1000px;
      height: 600px
    }
  </style>
</head>
<body>
<div id="classroomId" class="classroomStyle"></div>

<script type="text/javascript">
  window.onload = function() {
    let myChart = echarts.init(document.getElementById('classroomId'), "light");
    let option;

    let data = []; // 容纳数据的容器变量
    let dataCount = 5;  // 每一条【记录】的【数据数量】
    let startTime = 0; // 开始的坐标
    let categories = ['教室1', '教室2']; // 记录列表

    /**
     * 根据纪录列表的数量 & 每一条记录的数据数量,生成随机数据
     */
    categories.forEach(function (category, index) {
      let colorFlag = true;
      let baseTime = startTime;
      let otherMessage;
      let dataName;
      for (let i = 0; i < dataCount; i++) {
        let duration = 2;
        let colorSet;

        /**
         * 标志位为 true ,那么就说明这段有记录, 要设定如下内容
         1. 图形颜色(非透明)
         2. name: 该条数据的名称
         3. 和绘制无关的其它数据信息
         */
        if(colorFlag){
          colorFlag = false;
          dataName = "该段有记录",
            colorSet = "#dc77dc";     // 图形颜色
          otherMessage = [1, 2, 3, 4, 5]; // 和绘制无关的其它数据信息

          /**
           * 标志位为 false , 那么说明这段无记录,要设定如下内容
           * 1. 图形颜色(透明)("rgb(0,0,0,0)")
           * 2. name: "None"
           */
        } else {
          colorFlag = true;
          dataName = "该段无记录",
            colorSet = "rgb(0,0,0,0)";  // 图形颜色: 透明
        }
        // 插入数据
        data.push(
          {
            name: dataName,
            value: [
              index,                  // 编号
              baseTime,               // 开始时间
              baseTime += duration,   // 终了时间
              duration,               // 经过时间
              otherMessage,           // (...) 格式为json 的所有其他信息
              colorFlag
            ],
            itemStyle: {                // 图形样式(也可以在 series 中设定)
              normal: {
                color: colorSet
              }
            }
          }
        );
      }
    });

    // option 定义
    option = {
      tooltip: {
        formatter: function (params) {
          if(!params.value[5]){
            return params.marker + params.name + ': ' + params.value[3] + ' h' + params.value[4][2]; // 鼠标划过时显示的信息
          } else {
            return null;
          }
        }
      },
      title: {
        text: 'Profile',
        left: 'center'
      },
      /**
       * 图形的滑块设定(放大、缩小)
       */
      dataZoom: [{
        type: 'slider',
        filterMode: 'weakFilter',
        showDataShadow: false,
        top: 400,
        labelFormatter: ''
      }, {
        type: 'inside',
        filterMode: 'weakFilter'
      }],
      grid: {
        height: 300
      },
      /**
       * X 轴相关信息
       */
      xAxis: {
        min: startTime,
        scale: true,
        axisLabel: {
          formatter: function (val) {
            return Math.max(0, val - startTime) + ' 时';
          }
        }
      },
      /**
       * Y 轴相关信息
       */
      yAxis: {
        data: categories
      },
      /**
       * 图样绘制
       */
      series: [{
        type: 'custom', // 图的种类: custom 为自定义图形
        /**
         * 绘制甘地图
         *  这里由于是要绘制矩形,因此需要有四个值:
         *    index : data 的编号
         *    start : x 轴起点
         *    end  : x 轴终点
         *    height: 矩形高度
         */
        // data中的每个数据项都会调用 renderItem 函数
        renderItem: function(params, api) {
          let categoryIndex = api.value(0);
          let start = api.coord([api.value(1), categoryIndex]);
          let end = api.coord([api.value(2), categoryIndex]);
          let height = api.size([0, 1])[1] * 0.6;

          // 返回
          return {
            type: 'rect',
            transition: ['shape'],
            // 根据data 之中的参数绘制形状 : shape
            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()
          };
        },
        itemStyle: {
          opacity: 0.8
        },
        encode: {
          x: [1, 2],
          y: 0
        },
        data: data
      }]
    };
    myChart.setOption(option);
  }
</script>
</body>
</html>

完成效果:

P.S:实际需求就是要每段时间段都是2小时的,如果有别的需求也可以调整传入的data的value。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
张掖,甘肃省省辖市。以“张国臂掖,以通西域”而得名,位于中国甘肃省西北部,河西走廊中段。古称“甘州”,即甘肃省名“甘”字由来地,素有“桑麻之地”、“渔米之乡”之美称。盛产小麦、玉米、水稻、豆类、油料、瓜果、蔬菜,工业有煤炭、机械、纺织、酿造等10余个部门。土特产品有元葱、苹果梨、乌江米、红枣、发菜、丝路春酒等。 张掖市面积40874平方千米,人口131万。辖甘州区、临泽县、高台县、山丹县、民乐县、肃南裕固族自治县六个县区。2011年末全市常住人口120.46万人,其中城镇人口43.34万人,占常住人口的35.98%。有汉、回、藏、裕固等38个民族,其中裕固族是中国唯一集中居住在张掖的一个少数民族。 张掖市是国家1985年颁布的第二批全国历史文化名城之一。是古丝绸之路重镇,是新亚欧大陆桥的要道,是全国历史文化名城和中国优秀旅游城市,全国第二大内陆河黑河贯穿全境,是甘肃省商品粮基地,自古有“金张掖、银武威”之美誉。张掖拥有亚洲最大的军马场,国务院批准建设的国家级湿地保护区,以及被美国《国家地理》杂志评为“世界十大神奇地理奇观”的张掖国家地质公园。 张掖有着悠久的历史、灿烂的文化、优美的自然风光和独特的人文景观,自古就有“塞上江南”和“金张掖”之美誉,古人有诗曰“不望祁连山顶雪,错把张掖当江南”。市内有大佛寺、木塔寺、土塔寺、西来寺、马蹄寺、镇远楼、山西会馆、民勤会馆、黑水国遗址等名胜古迹。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值