堆积图

描述:当前是关于Echarts图表中的 柱状图 示例。
 
            const barData = {
    xaxis: ["1月","2月","3月","4月","5月","6月","7月","8月"],
    series: [{
        name: "金额1",
        data: [90, 19,68, 98, 87, 20, 150, 62]
    },{
        name: "金额2",
        data: [90, 19,68, 98, 87, 20, 150, 62]
    },{
        name: "金额3",
        data: [90, 19,68, 98, 87, 20, 150, 62]
    }],
    legend: ["金额1","金额2","金额3",],
    unit: "个",
    namePadding: [0, 10, 50, 0],
    yName: "数",
    legendShow: true,
    legendX: "right",
    xAxisTickHidden: false,
    xLabelMargin: 25,
    colorArr: [
      {
        start: "#1B7AFF",
        end: "#51D7FF",
      },
      {
        start: "#01C12E",
        end: "#48FE73",
      },
      {
        start: "#FF6B1A",
        end: "#FF9179",
      },
    ],
    splitNumber: 3,
    dataZoom: {
      type: "slider",
      show: false,
      realtime: true,
      startValue: 0,
      endValue: 5,
      filterMode: "none",
    },
    len: 5,
    grid: {
      left: "122px",
      top: "156px",
      right: "5px",
      bottom: "65px",
      containLabel: false,
    },
}
  myChart.getZr().on("mousemove", (param) => {
    let pointInPixel = [param.offsetX, param.offsetY];
    if (myChart.containPixel("grid", pointInPixel)) {
      //若鼠标滑过区域位置在当前图表范围内 鼠标设置为小手
      myChart.getZr().setCursorStyle("pointer");
    } else {
      myChart.getZr().setCursorStyle("default");
    }
  });
  myChart.getZr().off("click");
  myChart.getZr().on("click", (params) => {
    this.$once("hook:beforeDestroy", () => {
      myChart.getZr().off("click");
    });
    const pointInPixel = [params.offsetX, params.offsetY];
    if (myChart.containPixel("grid", pointInPixel)) {
      let xIndex = myChart.convertFromPixel({ seriesIndex: 0 }, [
        params.offsetX,
        params.offsetY,
      ])[0]; //柱形的下标 ,此处取[1]
      xIndex = Math.abs(xIndex);
      this.$emit("clickBarIndex", xIndex);
    }
  });
  // document.oncontextmenu = () =>{ return false; }; 
  // myChart.getZr().off("contextmenu");
  // myChart.getZr().on("contextmenu", (params) => {
  //    const pointInPixel = [params.offsetX, params.offsetY];
  //   if (myChart.containPixel("grid", pointInPixel)) {
  //     let xIndex = myChart.convertFromPixel({ seriesIndex: 0 }, [
  //       params.offsetX,
  //       params.offsetY,
  //     ])[0]; //柱形的下标 ,此处取[1]
  //     xIndex = Math.abs(xIndex);
  //     this.$emit("contextMenuBarIndex", xIndex);
  //     }
  // });

  let normalColor = "#ECF8FF";
  let list = [];
  let seriesData = barData.series.map((item, index) => {
    list = [...list, ...item.data];
    return {
      name: item.name,
      type: "bar",
      barWidth: "64px",
      stack: "记录",
      itemStyle: {
        normal: {
          color: {
            type: "linear",
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              {
                offset: 0,
                color: barData.colorArr[index].start,
              },
              {
                offset: 1,
                color: barData.colorArr[index].end,
              },
            ],
            globalCoord: false,
          },
        },
      },
      label: {
        show: barData.label && index === 2 && true,
        position: "top",
        align: "center",
        // width: 72,
        height: 48,
        backgroundColor: "rgba(9,50,93,0.3)",
        borderColor: "rgba(9,50,93,0.5)",
        borderWidth: 3,
        formatter: (item) => {
          let value = barData.label && barData.label[item.dataIndex];
          return `{a|${value}%}`;
        },
        distance: 18,
        align: "center",
        rich: {
          a: {
            padding: [6, 8, 6, 8],
            fontFamily: "DINAlternate-Bold",
            fontSize: 42,
            color: "#3CF0FF",
            lineHeight: 52,
          },
        },
      },
      data: item.data,
    };
  });
  option = {
    backgroundColor: '#0A2E5D',
    legend: {
      show: barData.legendShow,
      x: barData.legendX,
      y: "top",
      icon: "rect",
      selectedMode: false,
      padding: [20, 0, 0, 0],
      itemGap: barData.itemGap || 32,
      itemWidth: 40,
      itemHeight: 28,
      textStyle: {
        height: 48,
        rich: {
          a: {
            color: normalColor,
            fontSize: 48,
            fontFamily: "PingFangSC-Regular",
          },
        },
      },
      formatter: (name) => {
        return "{a|" + name + " " + "}";
      },
      data: barData.legend,
    },
    cursor: "pointer",
    dataZoom: barData.dataZoom ? barData.dataZoom : [],
    grid: barData.grid,
    tooltip: {
      textStyle: {
        fontSize: 48,
      },
      trigger: "axis",
      formatter: function (params) {
        let str = "";
        for (let i = 0; i < params.length; i++) {
          if (
            (!!params[i].value || params[i].value === 0) &&
            params[i].seriesName !== ""
          ) {
            let unit = barData.unit;
            str += params[i].seriesName + ": " + params[i].value + unit + "<br/>";
          } else if (params[i].seriesName !== "") {
            str += params[i].seriesName + ": " + "无数据" + "<br/>";
          }
        }
        return str;
      },
    },
    xAxis: [
      {
        type: "category",
        data: barData.xaxis,
        axisPointer: {
          type: "shadow",
        },
        axisLabel: {
          interval: 0,
          margin: barData.xLabelMargin,
          textStyle: {
            fontFamily: "PingFangSC-Regular",
            color: normalColor,
            fontSize: 42,
            lineHeight: 52,
          },
          formatter: function (value) {
            let len = barData.series[0] ? barData.series[0].data.length : 0;
            let ret = ""; //拼接加\n返回的类目项
            let maxLength = 7;
            if (len < 5) {
              maxLength = 9;
            }
            let valLength = value.length; //X轴类目项的文字个数
            let rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
            if (rowN > 1) {
              //如果类目项的文字大于5,
              for (let i = 0; i < rowN; i++) {
                let temp = ""; //每次截取的字符串
                let start = i * maxLength; //开始截取的位置
                let end = start + maxLength; //结束截取的位置
                //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                temp = value.substring(start, end) + "\n";
                ret += temp; //凭借最终的字符串
              }
              return ret;
            } else {
              return value;
            }
          },
        },

        // axisLabel: {
        //   interval: 0,
        //   margin: barData.xLabelMargin,
        //   textStyle: {
        //     fontFamily: "PingFangSC-Regular",
        //     color: normalColor,
        //     fontSize: 36,
        //   },
        // },
        axisLine: {
          show: false,
        },
        axisTick: {
          show: true,
          length: 5,
          alignWithLabel: true,
          lineStyle: {
            width: 2,
            color: "#CEF8FF",
          },
        },
        splitLine: {
          show: false,
        },
      },
    ],
    yAxis: [
      {
        type: "value",
        name: barData.yName,
        splitNumber: barData.splitNumber,
        nameTextStyle: {
          fontFamily: "PingFangSC-Regular",
          color: normalColor,
          fontSize: 48,
          // align: "right",
          padding: barData.namePadding,
        },
        axisLabel: {
          formatter: "{value}",
          align: "right",
          textStyle: {
            fontFamily: "PingFangSC-Regular",
            color: normalColor,
            fontSize: 48,
          },
        },
        axisLine: {
          show: false,
        },
        axisTick: {
          show: true,
          length: 5,
          lineStyle: {
            width: 2,
            color: "#CEF8FF",
          },
        },
        splitLine: {
          show: false,
        },
      },
    ],
    series: seriesData,
  };
  myChart.setOption(option);
  if (barData.dataZoom && !barData.noScroll) {
    let startNumber = 0;
    let start = new Date();
    let duration = 2000;
    let dataLen = barData.xaxis.length;
    let animation = () => {
      let time = new Date();
      let timePassed = time - start;
      if (timePassed >= duration) {
        start = new Date();
        if (startNumber === dataLen - barData.len) {
          startNumber = 0;
        }
        myChart.dispatchAction({
          type: "dataZoom",
          startValue: startNumber,
          endValue: startNumber + barData.len,
        });
        startNumber++;
      }
      this.rafId = requestAnimationFrame(animation);
    };
    animation();
    // this.$once("hook:beforeDestroy", () => {
    //   cancelAnimationFrame(this.rafId);
    // });
    // dom.onmouseover = () => {
    //   cancelAnimationFrame(this.rafId);
    // };
    // dom.onmouseleave = () => {
    //   animation();
    // };
  }