溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用ECharts怎么實(shí)現(xiàn)一個狀態(tài)區(qū)間圖

發(fā)布時間:2021-03-26 15:19:02 來源:億速云 閱讀:427 作者:Leah 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)利用ECharts怎么實(shí)現(xiàn)一個狀態(tài)區(qū)間圖,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

需求背景

假如有如下圖所示的圖表需要顯示多個網(wǎng)口在一段時間內(nèi)的多個狀態(tài):y軸用于展示各網(wǎng)口,x軸用于展示時間(分鐘),使用條形圖的不同顏色來表示不同時間區(qū)間段的狀態(tài),使用深藍(lán)、淺藍(lán)、橙色、紅色分別代表正常、繁忙、故障、離線四種狀態(tài)。以WAN0為例,圖中則表示了0~10分鐘為正常,10~25分鐘為繁忙,25~45分鐘為故障,45~60分鐘為離線。

利用ECharts怎么實(shí)現(xiàn)一個狀態(tài)區(qū)間圖

根據(jù)此圖,很容易想到可以用條形圖試試。但后來發(fā)現(xiàn),如果用堆疊條形圖,則每種狀態(tài)在每一個網(wǎng)口對應(yīng)的圖形中只能出現(xiàn)一次,這不能實(shí)現(xiàn)需求。于是繼續(xù)查閱echart官網(wǎng)示例,終于在自定義類型圖表中找到了一個相似的示例,地址

通過研究示例代碼并進(jìn)行一番改造,終于實(shí)現(xiàn)了上述需求。

在實(shí)現(xiàn)的過程中遇到了一個小問題,那就是使用自定義圖表實(shí)現(xiàn)chart之后,圖例不好處理。通過查看條形圖的示例,找到了一種顯示圖例的方法,那就是使用空的條形圖來顯示圖例,因?yàn)樵?strong>series里面配置了條形圖并配置name后,echart會自動根據(jù)name的值去legend的配置中匹配對應(yīng)的圖例名字并顯示。

完整代碼如下,保存于本地之后再自己去echart官網(wǎng)下載庫文件(完整版)之后即可運(yùn)行:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>

  <div id="chart-box" ></div>

  <script src="./echarts.min.js"></script>
  <script>
    // 初始化echart
    var chart = echarts.init(document.getElementById('chart-box'));

    // 各狀態(tài)的顏色
    var colors = ['#2f4554', '#61a0a8', '#d48265', '#c23531'];

    // 四種狀態(tài)
    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, // 圖例設(shè)為不可點(diǎn)擊
        textStyle: {
          color: '#000'
        }
      },
      grid: {
        left: '3%',
        right: '3%',
        top: '1%',
        bottom: '10%',
        containLabel: true
      },
      xAxis: {
        min: 0 // x軸零刻度對應(yīng)的實(shí)際值
      },
      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字段里數(shù)據(jù)項(xiàng):

{
  itemStyle: { normal: { color: colors[0] } },
  name: '正常',
  value: [0, 0, 10]
}
  • itemStyle: 所渲染的矩形的樣式

  • name: 該矩形的狀態(tài)名

  • value: 第0項(xiàng)代表類別標(biāo)識,例如0就代表WAN0的,1就是WAN1的;第1和第2項(xiàng)代表該矩形區(qū)域?qū)?yīng)的x坐標(biāo)范圍開始于0,結(jié)束于1。

關(guān)于利用ECharts怎么實(shí)現(xiàn)一個狀態(tài)區(qū)間圖就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI