echarts 实现分组和显示总数

本文介绍了如何在ECharts图表中使用分组功能,通过实例展示了如何设置坐标轴刻度标签的分组,并提供了代码实现,帮助读者更直观地观察数据.

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

echart 除了能显示坐标轴外,还可以对坐标轴进行分组,可以更直观的观察数
据,本博文记录一下关于分组的探索,先展示一下效果图:

在这里插入图片描述

// 直接复制到echarts官方示例中查看效果
let xAxisData = [];
let data1 = [];
let data2 = [];
let data3 = [];
let data4 = [];
let dataTotal = [];
for (let i = 0; i < 10; i++) {
  xAxisData.push('Class' + i);
  data1.push(+(Math.random() * 2).toFixed(2));
  data2.push(+(Math.random() * 5).toFixed(2));
  data3.push(+(Math.random() + 0.3).toFixed(2));
  data4.push(+Math.random().toFixed(2));
  dataTotal.push((data1[i] + data2[i] + data3[i] + data4[i]).toFixed(2));
}
var emphasisStyle = {
  itemStyle: {
    shadowBlur: 10,
    shadowColor: 'rgba(0,0,0,0.3)'
  }
};
option = {
  legend: {
    data: ['bar', 'bar2', 'bar3', 'bar4'],
    left: '10%'
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'shadow'
    }
  },
  xAxis: [
    {
      data: xAxisData,
      name: 'X Axis'
    },
    {
      // 将组设置在底部,默认顶部
      position: 'bottom',
      // 偏移距离
      offset: 50,
      axisLine: {
        // 是否显示坐标轴轴线
        show: false
      },
      axisTick: {
        // 刻度线长度
        length: 50,
        inside: true,
        interval: (index, value) => {
          // 坐标轴刻度的显示间隔
          return index === 0 || index === 4 || index === 9;
        }
      },
      axisLabel: {
        textStyle: {
          fontSize: 12
        },
        // 刻度标签是否朝内,默认朝外
        inside: true,
        // 坐标轴刻度标签的显示间隔,强制显示所有标签
        interval: 0,
        // 刻度标签的内容格式器
        formatter: (val, index) => {
          if (val === 'Class1') {
            // 可以使用刻度数值,只能在某个刻度下面
            // 如果有偏移,请使用空格,也可以使用rich
            // return '                 group1';
            return '{centerStyle|group1}';
          } else if (index === 6) {
            // 可以使用索引
            return 'group2';
          } else if (index === 9) {
            return 'group3';
          }
        },
        rich: {
          centerStyle: {
            padding: [0, 0, 0, 60]
          }
        }
      },
      // 与x轴保持一致
      data: xAxisData
    }
  ],
  yAxis: {},
  series: [
    {
      // 象形柱图
      type: 'pictorialBar',
      name: 'Total',
      // 以最大值为基准,做一个直径为1的圆点
      symbolSize: [1, 1],
      symbolPosition: 'end',
      //   设置为透明色
      color: 'transparent',
      z: 2,
      label: {
        normal: {
          // 显示label,即总数
          show: true,
          position: 'top'
        }
      },
      data: dataTotal
    },
    {
      name: 'bar',
      type: 'bar',
      stack: 'one',
      emphasis: emphasisStyle,
      data: data1
    },
    {
      name: 'bar2',
      type: 'bar',
      stack: 'one',
      emphasis: emphasisStyle,
      data: data2
    },
    {
      name: 'bar3',
      type: 'bar',
      stack: 'one',
      emphasis: emphasisStyle,
      data: data3
    },
    {
      name: 'bar4',
      type: 'bar',
      stack: 'one',
      emphasis: emphasisStyle,
      data: data4
    }
  ]
};
myChart.on('brushSelected', function(params) {
  var brushed = [];
  var brushComponent = params.batch[0];
  for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
    var rawIndices = brushComponent.selected[sIdx].dataIndex;
    brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));
  }
  myChart.setOption({
    title: {
      backgroundColor: '#333',
      text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),
      bottom: 0,
      right: '10%',
      width: 100,
      textStyle: {
        fontSize: 12,
        color: '#fff'
      }
    }
  });
});
### 实现柱状堆叠图并显示每组柱子的总数 为了在 Ant Design Charts 中创建一个带有总数显示的柱状堆叠图,可以通过自定义 `series` `tooltip` 来实现这一功能。具体来说,在设置图表的数据源时,需要计算每一类别下的总计数值,并通过配置项来控制这些值的展示方式。 以下是具体的实现方法: #### 数据处理与准备 首先,确保输入数据已经按照所需的分组进行了整理,并且对于每一个分组都有对应的总量信息。如果原始数据不包含这个字段,则可以在前端进行预处理。 ```javascript const rawData = [ { type: '东三', value: 10 }, { type: '西五', value: 20 }, { type: '东八', value: 30 }, { type: '东十二', value: 89 } ]; // 计算各类型的总 let sumMap = {}; rawData.forEach((item) => { const key = item.type; if (!sumMap[key]) { sumMap[key] = 0; } sumMap[key] += Number(item.value); }); // 将总量添加到原数组中作为新的一项 const processedData = []; Object.keys(sumMap).forEach(key => { processedData.push({ ...{ type: key, value: sumMap[key], category: 'Total' } }); }); ``` #### 图表配置 接下来,利用 ECharts 或者 G2Plot 的 API 配置图表样式以及交互行为。这里假设使用的是基于 AntV/G2Plot 库构建的应用程序。 ```javascript import React from 'react'; import { Chart, Interval } from '@antv/g2plot'; function StackedBarChart() { // 构建图表实例 const chartRef = useRef(null); useEffect(() => { const chartInstance = new Chart({ container: document.getElementById('container'), autoFit: true, height: 500, padding: [20, 40], data: [...processedData, ...rawData].sort((a,b)=>(a.type>b.type?1:-1)), // 合并后的数据集按类型排序 xField: 'type', yField: 'value', seriesField: 'category', isStack: true, meta: { value: { formatter: (val) => `${val}` }, // 设置Y轴刻度格式化器 }, tooltip: { showMarkers: false, shared: true, customContent: function (_, items) { let totalValue = 0; items.forEach(({ data }) => { if(data.category === 'Total'){ totalValue = data.value; } }); return `<div style="padding: 10px;"> ${items.map(({ name, value }) => `<p><span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${name==='Total'? '#FF7F50':'#ADD8E6'};"></span>${name}: ${value}</p>` ).join('')} <strong>Total: ${totalValue}</strong> </div>`; }, }, label: { position: 'top', content: ({ data }) => { return data.category === 'Total' ? '' : null; // 不在柱体上方重复显示非'Total'条目的标签 }, }, }); chartRef.current = chartInstance; return () => { chartInstance.destroy(); }; }, []); return ( <div id="container"></div> ); } export default StackedBarChart; ``` 上述代码片段展示了如何在一个React组件内初始化G2Plot图表对象,并设置了必要的属性使得能够正确渲染带总数提示的堆叠柱状图[^1][^2][^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小•愿望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值