活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

如何用ECharts多条柱状图实现多维度数据对比展示

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-15 11:10:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ECharts是百度开源的一个基于JavaScript的数据可视化库,可以流畅地运行在PC和移动设备上,兼容当前绝大部分浏览器。它提供了直观、交互丰富、可高度个性化定制的数据可视化图表。在数据分析和展示中,多维度数据对比是非常常见的需求,通过多条柱状图可以直观地展示不同类别在多个维度上的差异,帮助用户快速理解数据背后的信息。

ECharts基础

安装和引入ECharts

通过npm安装:
  1. npm install echarts --save
复制代码

在HTML文件中引入:
  1. <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
复制代码

或者在JavaScript模块中引入:
  1. import * as echarts from 'echarts';
复制代码

基本使用步骤

使用ECharts的基本步骤如下:

1. 准备一个具备大小(宽高)的DOM容器
2. 初始化echarts实例
3. 指定图表的配置项和数据
4. 使用刚指定的配置项和数据显示图表

示例代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>ECharts 基础使用</title>
  6.     <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
  7. </head>
  8. <body>
  9.     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  10.     <div id="main" style="width: 600px;height:400px;"></div>
  11.     <script type="text/javascript">
  12.         // 基于准备好的dom,初始化echarts实例
  13.         var myChart = echarts.init(document.getElementById('main'));
  14.         // 指定图表的配置项和数据
  15.         var option = {
  16.             title: {
  17.                 text: 'ECharts 入门示例'
  18.             },
  19.             tooltip: {},
  20.             legend: {
  21.                 data:['销量']
  22.             },
  23.             xAxis: {
  24.                 data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
  25.             },
  26.             yAxis: {},
  27.             series: [{
  28.                 name: '销量',
  29.                 type: 'bar',
  30.                 data: [5, 20, 36, 10, 10, 20]
  31.             }]
  32.         };
  33.         // 使用刚指定的配置项和数据显示图表。
  34.         myChart.setOption(option);
  35.     </script>
  36. </body>
  37. </html>
复制代码

基础柱状图实现

单条柱状图

下面是一个简单的单条柱状图示例,展示了一周内每天的销售额:
  1. // 初始化echarts实例
  2. var myChart = echarts.init(document.getElementById('main'));
  3. // 指定图表的配置项和数据
  4. var option = {
  5.     title: {
  6.         text: '一周销售额'
  7.     },
  8.     tooltip: {
  9.         trigger: 'axis'
  10.     },
  11.     xAxis: {
  12.         type: 'category',
  13.         data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  14.     },
  15.     yAxis: {
  16.         type: 'value'
  17.     },
  18.     series: [{
  19.         name: '销售额',
  20.         type: 'bar',
  21.         data: [120, 200, 150, 80, 70, 110, 130],
  22.         // 可以设置柱状图的样式
  23.         itemStyle: {
  24.             color: '#5470C6'
  25.         }
  26.     }]
  27. };
  28. // 使用配置项显示图表
  29. myChart.setOption(option);
复制代码

柱状图样式设置

ECharts提供了丰富的样式设置选项,可以让柱状图更加美观和易读:
  1. var option = {
  2.     // ...其他配置
  3.     series: [{
  4.         name: '销售额',
  5.         type: 'bar',
  6.         data: [120, 200, 150, 80, 70, 110, 130],
  7.         // 柱条样式
  8.         itemStyle: {
  9.             // 颜色
  10.             color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  11.                 { offset: 0, color: '#83bff6' },
  12.                 { offset: 0.5, color: '#188df0' },
  13.                 { offset: 1, color: '#188df0' }
  14.             ]),
  15.             // 圆角
  16.             borderRadius: [5, 5, 0, 0]
  17.         },
  18.         // 高亮时的样式
  19.         emphasis: {
  20.             itemStyle: {
  21.                 color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  22.                     { offset: 0, color: '#2378f7' },
  23.                     { offset: 0.7, color: '#2378f7' },
  24.                     { offset: 1, color: '#83bff6' }
  25.                 ])
  26.             }
  27.         },
  28.         // 标签设置
  29.         label: {
  30.             show: true,
  31.             position: 'top',
  32.             formatter: '{c} 元'
  33.         }
  34.     }]
  35. };
复制代码

多条柱状图实现

多条柱状图是在同一个图表中展示多个数据系列,每个系列用不同颜色的柱形表示。这种图表非常适合用于比较不同类别在多个指标上的表现。

基本多条柱状图

下面是一个基本的多条柱状图示例,展示了两种产品在一周内的销售情况:
  1. var option = {
  2.     title: {
  3.         text: '产品销售对比'
  4.     },
  5.     tooltip: {
  6.         trigger: 'axis',
  7.         axisPointer: {
  8.             type: 'shadow'
  9.         }
  10.     },
  11.     legend: {
  12.         data: ['产品A', '产品B']
  13.     },
  14.     xAxis: {
  15.         type: 'category',
  16.         data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  17.     },
  18.     yAxis: {
  19.         type: 'value'
  20.     },
  21.     series: [
  22.         {
  23.             name: '产品A',
  24.             type: 'bar',
  25.             data: [120, 132, 101, 134, 90, 230, 210]
  26.         },
  27.         {
  28.             name: '产品B',
  29.             type: 'bar',
  30.             data: [220, 182, 191, 234, 290, 330, 310]
  31.         }
  32.     ]
  33. };
复制代码

堆叠柱状图

堆叠柱状图是将多个数据系列的值堆叠在一起显示,可以展示各部分占总体的比例关系:
  1. var option = {
  2.     title: {
  3.         text: '产品销售堆叠图'
  4.     },
  5.     tooltip: {
  6.         trigger: 'axis',
  7.         axisPointer: {
  8.             type: 'shadow'
  9.         }
  10.     },
  11.     legend: {
  12.         data: ['产品A', '产品B']
  13.     },
  14.     xAxis: {
  15.         type: 'category',
  16.         data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  17.     },
  18.     yAxis: {
  19.         type: 'value'
  20.     },
  21.     series: [
  22.         {
  23.             name: '产品A',
  24.             type: 'bar',
  25.             stack: '总量',  // 设置堆叠
  26.             data: [120, 132, 101, 134, 90, 230, 210]
  27.         },
  28.         {
  29.             name: '产品B',
  30.             type: 'bar',
  31.             stack: '总量',  // 设置堆叠
  32.             data: [220, 182, 191, 234, 290, 330, 310]
  33.         }
  34.     ]
  35. };
复制代码

百分比堆叠柱状图

百分比堆叠柱状图是堆叠柱状图的一种变体,每个类别的总高度都是100%,显示各部分所占的百分比:
  1. var option = {
  2.     title: {
  3.         text: '产品销售占比'
  4.     },
  5.     tooltip: {
  6.         trigger: 'axis',
  7.         axisPointer: {
  8.             type: 'shadow'
  9.         },
  10.         formatter: function(params) {
  11.             var tar = params[0];
  12.             return tar.name + '<br/>' + tar.seriesName + ' : ' + tar.value + '<br/>' +
  13.                    '占比 : ' + (tar.value * 100 / (params[0].value + params[1].value)).toFixed(2) + '%';
  14.         }
  15.     },
  16.     legend: {
  17.         data: ['产品A', '产品B']
  18.     },
  19.     xAxis: {
  20.         type: 'category',
  21.         data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  22.     },
  23.     yAxis: {
  24.         type: 'value',
  25.         axisLabel: {
  26.             formatter: '{value} %'
  27.         }
  28.     },
  29.     series: [
  30.         {
  31.             name: '产品A',
  32.             type: 'bar',
  33.             stack: '总量',
  34.             data: [120, 132, 101, 134, 90, 230, 210]
  35.         },
  36.         {
  37.             name: '产品B',
  38.             type: 'bar',
  39.             stack: '总量',
  40.             data: [220, 182, 191, 234, 290, 330, 310]
  41.         }
  42.     ]
  43. };
复制代码

多维度数据对比

多维度数据对比是指在一个图表中同时展示多个维度的数据,帮助用户从不同角度分析数据。通过多条柱状图,我们可以实现多维度数据对比。

多维度数据对比的基本实现

下面是一个展示不同地区在不同年份的GDP数据的多维度对比示例:
  1. var option = {
  2.     title: {
  3.         text: '多地区GDP对比'
  4.     },
  5.     tooltip: {
  6.         trigger: 'axis',
  7.         axisPointer: {
  8.             type: 'shadow'
  9.         }
  10.     },
  11.     legend: {
  12.         data: ['2018', '2019', '2020', '2021', '2022']
  13.     },
  14.     grid: {
  15.         left: '3%',
  16.         right: '4%',
  17.         bottom: '3%',
  18.         containLabel: true
  19.     },
  20.     xAxis: {
  21.         type: 'category',
  22.         data: ['北京', '上海', '广州', '深圳', '杭州']
  23.     },
  24.     yAxis: {
  25.         type: 'value',
  26.         name: 'GDP(亿元)',
  27.         axisLabel: {
  28.             formatter: '{value}'
  29.         }
  30.     },
  31.     series: [
  32.         {
  33.             name: '2018',
  34.             type: 'bar',
  35.             data: [30320, 32679, 22859, 24221, 13509]
  36.         },
  37.         {
  38.             name: '2019',
  39.             type: 'bar',
  40.             data: [35445, 38155, 23628, 26927, 15373]
  41.         },
  42.         {
  43.             name: '2020',
  44.             type: 'bar',
  45.             data: [36103, 38701, 25019, 27670, 16106]
  46.         },
  47.         {
  48.             name: '2021',
  49.             type: 'bar',
  50.             data: [40269, 43214, 28231, 30664, 18109]
  51.         },
  52.         {
  53.             name: '2022',
  54.             type: 'bar',
  55.             data: [41610, 44652, 28839, 32387, 18753]
  56.         }
  57.     ]
  58. };
复制代码

添加平均值参考线

为了更好地进行多维度数据对比,我们可以添加平均值参考线,帮助用户快速识别哪些数据高于或低于平均水平:
  1. var option = {
  2.     // ...其他配置
  3.     series: [
  4.         // ...之前的系列数据
  5.         {
  6.             name: '平均值',
  7.             type: 'line',
  8.             markLine: {
  9.                 silent: true,
  10.                 lineStyle: {
  11.                     color: '#333'
  12.                 },
  13.                 data: [
  14.                     {
  15.                         type: 'average',
  16.                         name: '平均值'
  17.                     }
  18.                 ]
  19.             }
  20.         }
  21.     ]
  22. };
复制代码

添加数据标签

在柱状图上添加数据标签,可以让用户直接看到具体的数值,提高数据的可读性:
  1. var option = {
  2.     // ...其他配置
  3.     series: [
  4.         {
  5.             name: '2018',
  6.             type: 'bar',
  7.             data: [30320, 32679, 22859, 24221, 13509],
  8.             label: {
  9.                 show: true,
  10.                 position: 'top',
  11.                 formatter: '{c}'
  12.             }
  13.         },
  14.         // ...其他系列
  15.     ]
  16. };
复制代码

自定义颜色方案

为了更好地区分不同维度的数据,我们可以为每个系列设置不同的颜色:
  1. var option = {
  2.     // ...其他配置
  3.     color: ['#5470C6', '#91CC75', '#FAC858', '#EE6666', '#73C0DE'],
  4.     series: [
  5.         // ...系列数据
  6.     ]
  7. };
复制代码

高级特性

ECharts提供了许多高级特性,可以增强多条柱状图的交互性和表现力。

数据缩放

当数据量较大时,可以使用数据缩放功能,让用户能够查看局部细节:
  1. var option = {
  2.     // ...其他配置
  3.     dataZoom: [
  4.         {
  5.             type: 'inside',
  6.             start: 0,
  7.             end: 100
  8.         },
  9.         {
  10.             start: 0,
  11.             end: 100
  12.         }
  13.     ],
  14.     // ...其他配置
  15. };
复制代码

工具箱

添加工具箱可以让用户对图表进行更多操作,如数据视图、保存为图片等:
  1. var option = {
  2.     // ...其他配置
  3.     toolbox: {
  4.         feature: {
  5.             dataView: {show: true, readOnly: false},
  6.             magicType: {show: true, type: ['line', 'bar']},
  7.             restore: {show: true},
  8.             saveAsImage: {show: true}
  9.         }
  10.     },
  11.     // ...其他配置
  12. };
复制代码

动态排序

通过设置动态排序,可以让柱状图按照数值大小进行排序,更加直观地展示数据差异:
  1. var option = {
  2.     // ...其他配置
  3.     series: [
  4.         {
  5.             name: '2018',
  6.             type: 'bar',
  7.             data: [30320, 32679, 22859, 24221, 13509],
  8.             // 开启排序
  9.             realtimeSort: true,
  10.             // 排序方向
  11.             sort: 'descending',
  12.         },
  13.         // ...其他系列
  14.     ],
  15.     // ...其他配置
  16. };
复制代码

事件处理

ECharts支持丰富的事件处理,可以让图表更加交互:
  1. // 初始化图表
  2. var myChart = echarts.init(document.getElementById('main'));
  3. // 设置配置项
  4. myChart.setOption(option);
  5. // 添加点击事件
  6. myChart.on('click', function(params) {
  7.     console.log(params.name, params.value);
  8.     alert('您点击了 ' + params.name + ',数值为 ' + params.value);
  9. });
复制代码

实际案例

下面是一个完整的多维度数据对比实例,展示了不同电商平台在不同季度的销售额、用户数和订单量的对比:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>电商平台多维度数据对比</title>
  6.     <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
  7.     <style>
  8.         .chart-container {
  9.             width: 100%;
  10.             height: 500px;
  11.             margin: 20px auto;
  12.         }
  13.         .controls {
  14.             text-align: center;
  15.             margin: 20px 0;
  16.         }
  17.         button {
  18.             padding: 8px 15px;
  19.             margin: 0 5px;
  20.             cursor: pointer;
  21.         }
  22.     </style>
  23. </head>
  24. <body>
  25.     <div class="controls">
  26.         <button onclick="switchDataType('sales')">销售额</button>
  27.         <button onclick="switchDataType('users')">用户数</button>
  28.         <button onclick="switchDataType('orders')">订单量</button>
  29.     </div>
  30.     <div id="main" class="chart-container"></div>
  31.     <script type="text/javascript">
  32.         // 初始化echarts实例
  33.         var myChart = echarts.init(document.getElementById('main'));
  34.         // 数据
  35.         var data = {
  36.             sales: {
  37.                 title: '电商平台季度销售额对比(亿元)',
  38.                 series: [
  39.                     {
  40.                         name: '平台A',
  41.                         type: 'bar',
  42.                         data: [120, 132, 101, 134]
  43.                     },
  44.                     {
  45.                         name: '平台B',
  46.                         type: 'bar',
  47.                         data: [220, 182, 191, 234]
  48.                     },
  49.                     {
  50.                         name: '平台C',
  51.                         type: 'bar',
  52.                         data: [150, 232, 201, 154]
  53.                     },
  54.                     {
  55.                         name: '平台D',
  56.                         type: 'bar',
  57.                         data: [320, 332, 301, 334]
  58.                     }
  59.                 ]
  60.             },
  61.             users: {
  62.                 title: '电商平台季度用户数对比(万人)',
  63.                 series: [
  64.                     {
  65.                         name: '平台A',
  66.                         type: 'bar',
  67.                         data: [1200, 1320, 1010, 1340]
  68.                     },
  69.                     {
  70.                         name: '平台B',
  71.                         type: 'bar',
  72.                         data: [2200, 1820, 1910, 2340]
  73.                     },
  74.                     {
  75.                         name: '平台C',
  76.                         type: 'bar',
  77.                         data: [1500, 2320, 2010, 1540]
  78.                     },
  79.                     {
  80.                         name: '平台D',
  81.                         type: 'bar',
  82.                         data: [3200, 3320, 3010, 3340]
  83.                     }
  84.                 ]
  85.             },
  86.             orders: {
  87.                 title: '电商平台季度订单量对比(万单)',
  88.                 series: [
  89.                     {
  90.                         name: '平台A',
  91.                         type: 'bar',
  92.                         data: [500, 600, 450, 550]
  93.                     },
  94.                     {
  95.                         name: '平台B',
  96.                         type: 'bar',
  97.                         data: [800, 750, 780, 850]
  98.                     },
  99.                     {
  100.                         name: '平台C',
  101.                         type: 'bar',
  102.                         data: [600, 720, 650, 580]
  103.                     },
  104.                     {
  105.                         name: '平台D',
  106.                         type: 'bar',
  107.                         data: [1200, 1300, 1150, 1250]
  108.                     }
  109.                 ]
  110.             }
  111.         };
  112.         // 当前显示的数据类型
  113.         var currentDataType = 'sales';
  114.         // 切换数据类型
  115.         function switchDataType(type) {
  116.             currentDataType = type;
  117.             updateChart();
  118.         }
  119.         // 更新图表
  120.         function updateChart() {
  121.             var option = {
  122.                 title: {
  123.                     text: data[currentDataType].title,
  124.                     subtext: '数据仅供参考'
  125.                 },
  126.                 tooltip: {
  127.                     trigger: 'axis',
  128.                     axisPointer: {
  129.                         type: 'shadow'
  130.                     }
  131.                 },
  132.                 legend: {
  133.                     data: ['平台A', '平台B', '平台C', '平台D']
  134.                 },
  135.                 grid: {
  136.                     left: '3%',
  137.                     right: '4%',
  138.                     bottom: '3%',
  139.                     containLabel: true
  140.                 },
  141.                 xAxis: {
  142.                     type: 'category',
  143.                     data: ['Q1', 'Q2', 'Q3', 'Q4']
  144.                 },
  145.                 yAxis: {
  146.                     type: 'value'
  147.                 },
  148.                 dataZoom: [
  149.                     {
  150.                         type: 'inside',
  151.                         start: 0,
  152.                         end: 100
  153.                     },
  154.                     {
  155.                         start: 0,
  156.                         end: 100
  157.                     }
  158.                 ],
  159.                 toolbox: {
  160.                     feature: {
  161.                         dataView: {show: true, readOnly: false},
  162.                         magicType: {show: true, type: ['line', 'bar']},
  163.                         restore: {show: true},
  164.                         saveAsImage: {show: true}
  165.                     }
  166.                 },
  167.                 series: data[currentDataType].series
  168.             };
  169.             
  170.             myChart.setOption(option);
  171.         }
  172.         // 初始化图表
  173.         updateChart();
  174.         // 响应窗口大小变化
  175.         window.addEventListener('resize', function() {
  176.             myChart.resize();
  177.         });
  178.     </script>
  179. </body>
  180. </html>
复制代码

总结与最佳实践

通过本文的介绍,我们了解了如何使用ECharts实现多条柱状图进行多维度数据对比展示。以下是一些总结和最佳实践:

1. 选择合适的图表类型:根据数据特点选择普通柱状图、堆叠柱状图或百分比堆叠柱状图。
2. 合理设置颜色:使用不同的颜色区分不同维度的数据,确保颜色对比度足够,便于区分。
3. 添加必要的交互:通过图例、工具箱、数据缩放等增强图表的交互性。
4. 优化数据展示:添加数据标签、参考线等辅助元素,提高数据的可读性。
5. 考虑响应式设计:确保图表能够适应不同屏幕尺寸。
6. 处理大数据量:当数据量较大时,考虑使用数据缩放或分页展示。
7. 添加事件处理:通过事件处理增强图表的交互性,提供更好的用户体验。

ECharts作为一个功能强大的数据可视化库,提供了丰富的配置选项和API,能够满足各种数据可视化需求。通过合理利用这些功能,我们可以创建出既美观又实用的多维度数据对比图表,帮助用户更好地理解和分析数据。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则