echarts系列-----3 (自定义legend 控制多个legend)

本文介绍如何在ECharts中自定义图例控制多个图例的显示与隐藏,通过实例展示了如何利用Vue.js进行交互控制,包括图例的选择变化监听、数据动态更新等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇讲解自定义legend 控制多个legend实现方法,具体见代码,并标注注释(例子 文档事例都是有的,传送门?
在这里插入图片描述

<template>
  <div>
    <div class="list">
      总开关:
      <div class="item" v-for="(item,index) in arr" :key="index" :class="{'isSelected': item.isSelect}"
        @click="filter(item)">
        <div class="item-chunk" :style="{background:`${!item.isSelect?item.color:'#999'}`}"></div>
        <div class="item-title">{{item.title}}</div>
      </div>
    </div>
    <div id="main" style="width:1200px;height:600px;"></div>
  </div>
</template>

<script>
import echarts from "echarts";
export default {
  name: "echartsmorey",
  data() {
    return {
      list: [
        {
          x: "1号",
          y: 1,
          z: 99,
          k: 1,
          m: 4
        },
        {
          x: "2号",
          y: 2,
          z: 70,
          k: 11,
          m: 54
        },
        {
          x: "3号",
          y: 3,
          z: 1,
          k: 91,
          m: 44
        },
        {
          x: "4号",
          y: 4,
          z: 30,
          k: 41,
          m: 14
        },
        {
          x: "5号",
          y: 1,
          z: 20,
          k: 71,
          m: 34
        },
        {
          x: "6号",
          y: 0,
          z: 18,
          k: 1,
          m: 24
        },
        {
          x: "7号",
          y: 10,
          z: 12,
          k: 19,
          m: 14
        }
      ],
      dataX: [],
      dataY: [],
      legendData: ["A-B", "A-C", "F-A", "F-B"],
      arr: [
        {
          color: "#c23531",
          title: "A",
          isSelect: false
        },
        {
          color: "#2f4554",
          title: "F",
          isSelect: false
        }
      ]
    };
  },
  methods: {
    filter(code) {
      code.isSelect = !code.isSelect;
      // myChart 的参数
      var options = this.myChart.getOption();
      var selectLegend = options.legend[0];
      for (let key in this.legendData) {
        if (code.isSelect && this.legendData[key].indexOf(code.title) > -1) {
          selectLegend.selected[`${this.legendData[key]}`] = false;
        } else if (this.legendData[key].indexOf(code.title) > -1) {
          selectLegend.selected[`${this.legendData[key]}`] = true;
        }
      }
      this.myChart.setOption(options, true); // 重新渲染该图片
    },
    init(dataX, dataY) {
      this.myChart = echarts.init(document.getElementById("main"));
      let option = {
        color: ["#f87060", "#65bf8a", "#d4b3e4", "#fd9807"], // 自己定义颜色
        legend: {
          icon: "stack",
          data: this.legendData
        },
        tooltip: {
          trigger: "none",
          axisPointer: {
            type: "cross"
          }
        },
        // 工具栏
        toolbox: {
          x: 1100,
          y: 0,
          feature: {
            saveAsImage: {
              name: `test`
            }
          }
        },
        grid: {
          left: "5%", //组件距离容器左边的距离
          right: "20%",
          top: "15%"
        },
        // X轴 滑块 可缩放
        dataZoom: [
          {
            type: "slider",
            show: true,
            start: 0, // 开始百分数
            end: 100 // 结束百分数
          }
        ],
        xAxis: {
          type: "category",
          splitLine: {
            // X 轴分隔线样式
            show: true,
            lineStyle: {
              color: ["#f3f0f0"],
              width: 2,
              type: "solid"
            }
          },
          data: dataX
        },
        yAxis: [
          {
            name: "Y轴单位写的位置",
            type: "value",
            position: "left",
            splitNumber: 10, // Y 轴分隔格数
            splitLine: {
              // Y 轴分隔线样式
              show: true,
              lineStyle: {
                color: ["#f3f0f0"],
                width: 2,
                type: "solid"
              }
            }
          }
        ],
        series: dataY
      };

      this.myChart.on("legendselectchanged", obj => {
        // legend change events
        console.info(234, obj);
      });
      // 使用刚指定的配置项和数据显示图表。
      this.myChart.setOption(option);
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.dataX = this.list.map(item => item.x);
      // 第1个Y轴
      this.dataY.push({
        name: "A-B",
        type: "line", // 直线
        data: this.list.map(item => item.y)
      });
      // 第2个Y轴
      this.dataY.push({
        name: "A-C",
        type: "line",
        data: this.list.map(item => item.z)
      });
      // 第3个Y轴
      this.dataY.push({
        name: "F-A",
        type: "line",
        data: this.list.map(item => item.k)
      });
      // 第3个Y轴
      this.dataY.push({
        name: "F-B",
        type: "line",
        data: this.list.map(item => item.m)
      });

      this.init(this.dataX, this.dataY);
    });
  }
};
</script>

<style scoped lang="scss">
.list {
  display: flex;
  width: 320px;
  margin: 30px auto;
  font-size: 14px;
  .isSelected {
    color: #999;
  }
  .item {
    display: flex;
    margin: 0 10px;
    cursor: pointer;
  }
  .item-title {
    margin-left: 3px;
  }
  .item-chunk {
    height: 13px;
    width: 26px;
    margin-top: 3px;
  }
}
</style>
<think>好的,我现在需要帮助用户在ECharts中配置两个自定义图例。首先,用户的需求很明确,但作为新手,我需要仔细理解ECharts的图例配置方法,特别是如何添加多个图例。 根据用户提供的引用内容,引用[2]中提到了legend的配置项,比如data、icon、textStyle等。但通常,一个图表默认只有一个图例。用户想要两个,这可能需要将图例分成两个不同的部分,可能放置在不同的位置,比如上下或左右。 首先,我应该确认ECharts是否支持多个图例组件。查阅ECharts文档后发现,可以通过配置多个legend对象来实现,每个legend对象设置不同的data和位置。例如,第一个图例放在顶部,第二个放在底部,或者左侧和右侧。 接下来,每个图例需要指定对应的数据系列。例如,如果图表中有多个系列,可以将部分系列分配给第一个图例,另一部分分配给第二个图例。这需要在legend的data属性中指定每个图例包含的name,并且对应的系列也要设置name匹配。 然后,设置每个图例的位置(top、bottom、left、right)以及样式,如itemWidth、itemHeight、textStyle等,确保它们不重叠,并且样式符合用户需求。 此外,需要注意,每个图例的data数组中的name必须与series中相应系列的name一致,否则图例无法正确关联显示。同时,可能需要调整图例的布局,比如使用grid来调整图表主体区域,避免被图例覆盖。 可能的示例代码结构是,在option中定义两个legend对象,分别设置不同的data和位置,并在series中为每个系列指定对应的图例。例如: legend: [ { data: [&#39;图例1-1&#39;, &#39;图例1-2&#39;], top: &#39;10%&#39; }, { data: [&#39;图例2-1&#39;, &#39;图例2-2&#39;], bottom: &#39;10%&#39; } ], series: [ {name: &#39;图例1-1&#39;, ...}, {name: &#39;图例1-2&#39;, ...}, {name: &#39;图例2-1&#39;, ...}, {name: &#39;图例2-2&#39;, ...} ] 这样,两个图例会分别显示在顶部和底部。同时,每个图例的样式可以通过各自的配置项自定义,如icon、textStyle等,引用[2]中的内容提供了这些配置的说明。 还需要测试代码是否正确,确保图例显示正常,点击交互是否正常工作。如果用户需要更复杂的样式,比如不同颜色或图标,可以在每个legend的data项中单独设置icon和textStyle,如引用[2]中的示例。 最后,整合这些配置,提供一个完整的示例代码,并解释每个部分的作用,帮助用户理解如何修改和扩展。</think>### ECharts自定义图例配置方法 在ECharts中配置多个图例需通过设置多个`legend`对象,并指定不同的数据源和布局位置。以下是具体实现步骤及示例代码: #### 1. 基础配置逻辑 - **多图例支持**:ECharts允许通过数组形式定义多个图例组件,每个图例独立配置`data`属性和位置参数[^2]。 - **数据绑定**:每个图例的`data`字段需与`series`中对应系列的`name`字段匹配,实现交互联动。 - **样式分离**:可对每个图例单独设置图标类型、文字样式、布局位置等属性。 #### 2. 完整示例代码 ```javascript option = { // 配置第一个图例(顶部横向排列) legend: [{ data: [&#39;销量-类别A&#39;, &#39;销量-类别B&#39;], // 对应series前两个系列 top: 10, itemWidth: 20, // 图标宽度 itemHeight: 14, // 图标高度 textStyle: { color: &#39;#333&#39; }, // 文字颜色 icon: &#39;rect&#39; // 统一图标类型 }, // 配置第二个图例(底部自定义图标) { data: [{ name: &#39;增长率&#39;, icon: &#39;path://M0 0 L20 0 L10 20 Z&#39; // 自定义三角形图标 }, { name: &#39;预测值&#39;, icon: &#39;circle&#39;, textStyle: { color: &#39;#f00&#39; } // 单独设置文字颜色 }], bottom: 10, orient: &#39;vertical&#39;, // 垂直排列 itemGap: 20 // 图例项间距 }], xAxis: { data: [&#39;Q1&#39;, &#39;Q2&#39;, &#39;Q3&#39;, &#39;Q4&#39;] }, yAxis: {}, series: [ // 对应第一个图例的系列 { name: &#39;销量-类别A&#39;, type: &#39;bar&#39;, data: [320, 450, 280, 390] }, { name: &#39;销量-类别B&#39;, type: &#39;bar&#39;, data: [220, 380, 210, 330] }, // 对应第二个图例的系列 { name: &#39;增长率&#39;, type: &#39;line&#39;, data: [4.5, 6.2, 3.8, 5.1] }, { name: &#39;预测值&#39;, type: &#39;line&#39;, data: [380, 410, 360, 420] } ] }; ``` #### 3. 关键配置说明 | 配置项 | 说明 | |-----------------|----------------------------------------------------------------------| | `legend[0].data` | 指定顶部图例包含的系列名称,需与`series`中前两个`name`对应 | | `legend[1].data` | 使用对象格式定义图标和样式,`icon`支持SVG路径(`path://`)、内置形状等[^2] | | `orient` | 控制排列方向,`horizontal`(默认水平)/`vertical`(垂直) | | `itemGap` | 调整图例项间距,解决多图例拥挤问题 | #### 4. 扩展技巧 - **动态更新**:通过`setOption`方法可实时修改图例数据 - **交互控制**:设置`selectedMode: false`可禁用点击隐藏功能 - **响应式布局**:使用百分比定位(如`left: &#39;20%&#39;`)适配不同屏幕尺寸
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值