echarts自定义按钮触发图例选择

代码触发 ECharts 中组件的行为

有时候需要在程序里调用方法触发图表的行为,诸如显示 tooltip,选中图例。

在 ECharts 通过调用 myChart.dispatchAction({ type: '' }) 触发图表行为,统一管理了所有动作,

也可以方便地根据需要去记录用户的行为路径。

常用的动作和动作对应参数:


action.legend. legendSelect
Action 选中图例。
dispatchAction({    type: 'legendSelect',    // 图例名称
    name: string})
EVENT: legendselected

action.legend. legendUnSelect
Action 取消选中图例。
dispatchAction({    type: 'legendUnSelect',    // 图例名称
    name: string})
EVENT: legendunselected

action.legend. legendToggleSelect
Action切换图例的选中状态。
dispatchAction({    type: 'legendToggleSelect',    // 图例名称
    name: string})
EVENT: legendselectchanged

action.legend. legendAllSelect
Action 将图例全选。
dispatchAction({    type: 'legendAllSelect'})
EVENT: legendselectall

action.legend. legendInverseSelect
Action 将图例反选。
dispatchAction({    type: 'legendInverseSelect'})
EVENT: legendinverseselect

action.legend. legendScroll
Action 控制图例的滚动。当 legend.type 为 'scroll' 时有效。
dispatchAction({    type: 'legendScroll',
    scrollDataIndex: number,
    legendId: string})
EVENT: legendscroll



<template>
  <div>
    <div class="ScatterChart" :id="myCharts"></div>
  </div>
</template>

<script>
export default {
  name: "ScatterChart",
  props: {
    classDate: {
      type: Array,
      default: () => [],
    },
    legendData: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      myChart: null,
    };
  },

  mounted() {
    this.drawEcharts();
  },
  computed: {
    myCharts() {
      return "myCharts" + Math.random() * 100000;
    },
  },
  methods: {
    sel(name) {
      if (!!name) {
        this.myChart.dispatchAction({
          type: "legendInverseSelect",
        });
        // 单独调用时,注意当前是否已经被选中,否则会看不到效果以为无效
        this.myChart.dispatchAction({
          type: "legendSelect",
          name: name,
        });
      }else{
        this.myChart.dispatchAction({
          type: "legendAllSelect",
        });
      }
    },
    drawEcharts() {
      this.myChart = this.$echarts.init(document.getElementById(this.myCharts));
      var option;
      option = {
        xAxis: {
          type: "value",
          name: "题目", // x轴的名字,可以理解成单位
          nameTextStyle: {
            // x轴的名字的样式相关
            color: "#BFBFBF",
            nameLocation: "start",
          },
          splitLine: {
            //去除网格线
            show: false,
          },
          splitArea: { show: false }, //去除网格区域,否则会有一片区域
          axisLabel: {
            // 设置x轴的文字的样式
            textStyle: {
              show: true,
              color: "#BDBDBD",
              fontSize: "12",
            },
          },
          axisLine: {
            show: true, // 把x轴从实线变成虚线
            lineStyle: {
              // 设置x轴线条样式的颜色
              color: "#BDBDBD",
              width: 1,
              type: "solid",
            },
          },
          scale: true, // 设置数据自动缩放,要不然数据多的话就堆一块了
        },
        yAxis: {
          type: "value",
          // name: "y轴的单位(人数)",
          nameTextStyle: {
            color: "#BFBFBF",
            nameLocation: "end",
          },
          axisTick: {
            show: false, // 去掉y轴的凸出刻度
          },
          axisLine: {
            show: false, // 把y轴从实线变成虚线
          },
          splitLine: {
            //去除网格线
            show: true,
            lineStyle: {
              type: "dashed", //设置网格线类型 dotted:虚线   solid:实线
            },
          },
          splitArea: { show: false }, //去除网格区域
          axisLabel: {
            // 设置y轴的文字的样式
            textStyle: {
              show: true,
              color: "#BDBDBD",
              fontSize: "12",
            },
          },
          scale: true, // 设置数据自动缩放,要不然数据就堆一块了
          // show: false,
        },
        grid: {
          // 位置
          show: true,
          x: 36,
          y: 40,
          x2: 72,
          y2: 36,
          borderWidth: 0, // 去除图表的边框
        },
        tooltip: {
          formatter: function (obj) {
            let value = obj.value;
            return (
              '<div style="border-bottom: 1px solid #baf; font-size: 16px;padding-bottom: 7px;margin-bottom: 7px">' +
              obj.seriesName +
              "</div>" +
              "分数" +
              ":" +
              Number(value[1]).toFixed(2) +
              "分" +
              "<br>"
            );
          },
        },
        series: this.classDate,
        title: {
          // title为标题部分,有一级标题text,二级标题subtext。这里我们使用二级标题,再修改一下这个二级标题的位置即可出现我们想要的效果了,当然样式也可以通过title.subtextStyle去配置
          subtext: "分数",
          left: 0, // 距离左边位置
          top: -8, // 距离上面位置
          subtextStyle: {
            // 设置二级标题的样式
            color: "#BFBFBF",
          },
        },
        color: ["#4CD3D4", "#409EFF", "#facb31"], // 控制圆环图的颜色
        legend: {
          left: 100,
          itemGap: 20,
          itemWidth: 8,
          itemHeight: 8,
          data: this.legendData,
          selectedMode: false,// 关闭图例的点击事件
          textStyle: {
            fontSize: 12,
          },
        },
      };
      option && this.myChart.setOption(option);
      this.myChart.on("legendselectchanged", (e) => {
        console.log("e====>", e);
      });
      // 自适应
      window.addEventListener("resize", () => {
        this.myChart.resize();
      });
    },
  },
};
</script>

<style lang="scss" scoped>
.ScatterChart {
  height: 100%;
  width: 100%;
  min-width: 200px;
  min-height: 200px;
}
</style>