Echarts-实现柱状图单系列图例

背景

最近在实现一个柱状图图表展示的需求,需要实现一个设备状态的展示,要求每个柱子颜色不一样,并且有像多系列柱状图的图例效果,就像下面这样:

查了下Echarts的官方示例,发现实现了图例的都是多系列的,比如这种每个X轴子项有两个或两个以上的多系统柱状图:

实践

于是只能看看官方文档的api,第一个首先要实现修改柱子的颜色,这个比较简单,只需修改图表的option属性里的series里的itemStyle即可

css 复制代码
option = {
  xAxis: {
    type: 'category',
    data: ['Vue', 'React', 'Angular']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [
        120,
        {
          value: 200,
          itemStyle: {
            color: '#a90000'
          }
        },
        150,
      ],
      type: 'bar'
    }
  ]
};

接下来只要给它加上legend属性(用于设置图例)就可以了是吗?让我们来试试

option 复制代码
  xAxis: {
    type: 'category',
    data: ['Vue', 'React', 'Angular']
  },
  yAxis: {
    type: 'value'
  },
  legend: {
    // 可以留空,自动从 series.name 获取
  },
  series: [
    {
      name: '图例', // 必须加 name
      data: [120, { value: 200, itemStyle: { color: '#a90000' } }, 150],
      type: 'bar'
    }
  ]
};

照着上面这个代码设置legend,你会发现series里的name只有一个,但是x轴有三项,数量对不上,并且点击图例后是三个子项一起消失和出现。原因就是legend是和series里每一个子项一一对应的,但是我们只有一个系列,所以就会出现这种一齐消失出现的情况了。

解决方法

看到这里,是不是已经有了一点点思绪了。没错!就是要通过障眼法设置多个系列,将在每个X轴子项上的原本的多个系列展示成只显示一个,只需将其他系列的值设置为0,留下当前系列的值,由于原本是三个系列占一个X轴子项的宽度,现在只在一个X轴子项上显示一个,所以需要再调整一下其宽度即可~

下面是完整代码展示
xml 复制代码
<template>
  <div class="home-index">
    <div class="echarts_Statistics">
      <div ref="chartRef"></div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { onMounted, reactive, ref, nextTick } from "vue";
import * as echarts from "echarts";

const chartRef = ref<any>(null);
const chart = ref<any>(null)
const series = ref<any>([])
const option = reactive({
  title:{
    text:"统计",
    left:'70'
  },
  legend: {
    data: [
      {
        name: 'Vue',
        icon: 'rect'
      },
      {
        name: 'React',
        icon: 'rect'
      },
      {
        name: 'Angular',
        icon: 'rect'
      }
    ],
  },
  xAxis: {
    type: "category",
    data: ["Vue", "React", "Angular"],
  },
  yAxis: {
    type: "value",
  },
  series,
});

const getData = async () => {
  try {
    const res = await new Promise<any>((resolve) => {
      setTimeout(() => {
        resolve({
          'Vue':1,
          'React':2,
          'Angular':3
        });
      }, 0);
    });
    // 图例实现核心:
    series.value = [
      {
          name: 'Vue',
          type: 'bar',
          data: [res['Vue'], 0, 0],
          itemStyle: {
              color: '#00A900' // 蓝色
          },
          barWidth: '60%', // 确保柱子宽度正常
          barGap: '-100%' // 核心:让所有系列在同一类目下完全重叠
      },
      {
          name: 'React',
          type: 'bar',
          data: [0,res['React'], 0],
          itemStyle: {
              color: 'rgba(230,162,60)'
          },
          barWidth: '60%', 
          barGap: '-100%' 
      },
      {
          name: 'Angular',
          type: 'bar',
          data: [0,0,res['Angular']],
          itemStyle: {
              color: 'rgba(255,0,0)'
          },
          barWidth: '60%',
          barGap: '-100%'
      }
    ]
    chart.value.setOption(option);
  }
  catch (error) {
    console.log(error)
  }
}

onMounted(() => {
  chart.value = echarts.init(chartRef.value);
  // 这里需要首先setOption,保证坐标轴等基础配置能够正确显示
  chart.value.setOption(option)
  getData();
});
</script>
<style scoped lang="scss">
.home-index {
  height: 100%;
  width: 100%;
  padding: 20px 20px 10px 20px;
  border-radius: 6px;
  .echarts_Statistics {
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    div {
      width: 45%;
      height: 300px;
    }
  }
}
</style>
相关推荐
paopaokaka_luck1 天前
婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
vue.js·spring boot·后端·websocket·算法·echarts
码上佳人1 天前
Echarts如何生成没有上下两端线的箱线图
前端·echarts
wow_DG5 天前
【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题
前端·javascript·vue.js·echarts
朝阳396 天前
echarts【实战】饼状图点击高亮,其他区域变暗
echarts
HashTang7 天前
2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
echarts·地图·geojson·全国geojson·经纬度·街道geojson·街道边界数据·矢量边界·乡镇geojson·乡镇边界数据·行政边界
全宝9 天前
🗾3分钟学会Echart地图下钻
前端·echarts
paopaokaka_luck11 天前
基于SpringBoot+Vue的汽车租赁系统(协同过滤算法、腾讯地图API、支付宝沙盒支付、WebsSocket实时聊天、ECharts图形化分析)
vue.js·spring boot·后端·websocket·算法·汽车·echarts
隐含11 天前
基于echarts的水球的样式。
前端·javascript·echarts
lianlian0112 天前
vue3+echarts 多Y轴折线图,通过图例legend动态控制对应Y轴所有数据显示隐藏
echarts