尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

ECharts柱状图从入门到精通:单柱、多柱与堆叠图实战指南

ECharts柱状图从入门到精通:单柱、多柱与堆叠图实战指南 1. 从零开始为什么ECharts柱状图是数据可视化的首选如果你正在处理数据想把一堆枯燥的数字变成一眼就能看懂的图表那么ECharts的柱状图绝对是你绕不开的工具。我见过太多人从Excel的图表功能到一些在线图表生成器最后兜兜转转还是回到了ECharts。原因很简单它足够强大也足够灵活。无论是简单的单柱状图还是复杂的多系列、堆叠柱状图ECharts都能用几行配置就搞定而且效果专业交互流畅。最近在社区里关于ECharts柱状图的热门问题层出不穷。比如有人问“鼠标点那儿在哪儿显示柱状图”这其实是在探讨ECharts强大的事件交互能力有人搜“echarts如何制作柱状立体图之菱形顶盖”这涉及到3D柱状图的自定义形状还有“echarts的柱状图如何有border-radius效果”这是对现代UI审美的追求。这些热词恰恰说明了开发者们已经不满足于“画出来”而是追求“画得好看、用得顺手”。ECharts恰好能满足这种从功能到体验的进阶需求。这篇文章我将以一个多年使用者的视角带你彻底搞懂ECharts中最基础也最核心的柱状图家族单柱状图、多柱状图和堆叠柱状图。我不会只给你一堆配置项列表而是会结合真实的开发场景告诉你为什么这么配置每种图表适合什么数据以及在实现那些“热门效果”时有哪些你绝对不想错过的技巧和容易踩的坑。无论你是刚入门的前端新手还是想优化现有图表的老手这篇内容都能让你直接“抄作业”并理解背后的逻辑。2. 环境搭建与第一个单柱状图理解核心配置骨架在深入各种柱状图之前我们必须先有一个能跑起来的环境。很多教程会直接让你引入一个CDN链接这没错但对于一个准备认真使用的项目我建议你通过npm安装这样能更好地管理版本和依赖。npm install echarts --save安装完成后在你的JavaScript模块中引入并使用// 引入ECharts import * as echarts from echarts; // 基于准备好的dom初始化echarts实例 const chartDom document.getElementById(main); const myChart echarts.init(chartDom); // 指定图表的配置项和数据 const option { // 标题组件 title: { text: 我的第一个柱状图 }, // 提示框组件 tooltip: {}, // 图例组件 legend: { data: [销量] }, // X轴 xAxis: { data: [衬衫, 羊毛衫, 雪纺衫, 裤子, 高跟鞋, 袜子] }, // Y轴 yAxis: {}, // 系列列表。这是核心每个系列通过type决定图表类型 series: [ { name: 销量, type: bar, // 类型为柱状图 data: [5, 20, 36, 10, 10, 20] } ] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option);这就是一个最基础的单柱状图。我们来拆解一下这个配置骨架理解每个部分的作用title: 图表的标题用于说明图表主题。tooltip: 提示框当鼠标悬停在柱子上时会显示该数据点的详细信息。这是实现“鼠标点那儿在哪儿显示”效果的基础组件。legend: 图例。在单系列图表中它可能看起来多余但在多系列图表中至关重要用于区分不同的数据系列。xAxis/yAxis: X轴和Y轴。xAxis.data定义了类目数据通常是非数值的如产品名称而yAxis通常不指定数据因为它会根据series.data自动计算数值范围。这是柱状图与折线图、散点图在配置上的一个关键区别。series: 这是心脏。它是一个数组意味着一个图表可以包含多个系列比如同时显示“销量”和“库存”。每个系列对象必须指定type这里是bar和data。注意很多新手会混淆xAxis.data和series.data。记住一个简单的对应关系xAxis.data数组中的第 i 项对应series.data数组中的第 i 项。它们通过索引位置一一绑定。现在你的第一个柱状图应该已经显示出来了。但你可能觉得它有点“素”。接下来我们就来为它添加一些热门效果。2.1 实现圆角与立体感美化你的柱子社区里很多人搜索“border-radius效果”和“立体图”这说明基础的直角柱子已经不能满足设计需求了。在ECharts 5版本中实现圆角非常简单只需在series.itemStyle中设置borderRadius即可。series: [ { name: 销量, type: bar, data: [5, 20, 36, 10, 10, 20], itemStyle: { borderRadius: [5, 5, 0, 0] // 顺序为左上、右上、右下、左下 // 如果只写一个值如 borderRadius: 5则四个角相同。 } } ]对于“立体柱状图”或“菱形顶盖”这通常指的是3D柱状图type: bar3D它需要引入echarts-gl扩展库。但更常见且性能更好的“伪立体”效果可以通过渐变color和阴影shadowBlur,shadowColor来模拟让平面柱子看起来有厚度和光泽。series: [ { name: 销量, type: bar, data: [5, 20, 36, 10, 10, 20], itemStyle: { borderRadius: 5, color: new echarts.graphic.LinearGradient( // 线性渐变 0, 0, 0, 1, // 渐变方向从上到下 [ { offset: 0, color: #83bff6 }, // 顶部颜色 { offset: 0.5, color: #188df0 }, // 中间颜色 { offset: 1, color: #188df0 } // 底部颜色 ] ), shadowColor: rgba(0, 0, 0, 0.3), // 阴影颜色 shadowBlur: 10, // 阴影模糊大小 shadowOffsetY: 3 // 阴影垂直偏移 }, emphasis: { // 鼠标悬停时的样式 itemStyle: { shadowColor: rgba(0, 0, 0, 0.7), shadowBlur: 15 } } } ]通过这样的配置你的柱子立刻就从平淡的色块变成了有质感、有交互反馈的UI组件。emphasis配置项用于定义鼠标悬停或高亮时的样式这是提升用户体验的关键细节。3. 进阶到多柱状图并排展示与对比的艺术当你的数据维度增加比如不仅想展示“销量”还想同时展示“成本”和“利润”时单柱状图就不够用了。这时就需要多柱状图也叫分组柱状图。它的核心逻辑是在series数组中配置多个type: bar的系列。const option { title: { text: 多系列柱状图示例 }, tooltip: { trigger: axis, // 触发类型改为‘axis’坐标轴触发 axisPointer: { type: shadow } // 坐标轴指示器配置为阴影 }, legend: { data: [销量, 成本, 利润] }, xAxis: { type: category, data: [一月, 二月, 三月, 四月, 五月, 六月] }, yAxis: { type: value }, series: [ { name: 销量, type: bar, data: [150, 230, 224, 218, 135, 147] }, { name: 成本, type: bar, data: [80, 120, 110, 100, 70, 85] }, { name: 利润, type: bar, data: [70, 110, 114, 118, 65, 62] } ] };把这段配置应用到你的图表中你会看到每个月都有三根柱子并排显示。这里有几个关键点tooltip.trigger: ‘axis’ 这是多系列图表的标准配置。设置为‘axis’后当鼠标移动到某个类目如“一月”上时会同时显示该类别下所有系列销量、成本、利润的数据方便对比。如果保持默认的‘item’则只会显示鼠标所指的那一根柱子的数据。series数组的顺序 图表中柱子的渲染顺序与series数组的顺序一致。后渲染的系列会覆盖在先渲染的系列之上在并排模式下表现为更靠右。你可以通过调整顺序来控制视觉优先级。自动分组与间距 ECharts会自动为同一类目下的多个柱子进行分组并计算它们之间的间距barGap和组与组之间的间距barCategoryGap。你可以通过series[i].barGap和series[i].barCategoryGap进行精细控制。3.1 处理“每项有多组散点图”的混合场景在热词中有“apache echarts 5.5.1 x轴每项有多组散点图”这样的搜索。这其实描述了一种更复杂的场景在同一个坐标系同一个X轴类目下既要显示柱状图又要显示散点图。这在ECharts中非常容易实现因为series数组可以混合不同的类型。假设我们想在刚才的多柱状图上为每个月的“利润”添加一个目标值散点series: [ { name: 销量, type: bar, data: [150, 230, 224, 218, 135, 147] }, { name: 成本, type: bar, data: [80, 120, 110, 100, 70, 85] }, { name: 利润, type: bar, data: [70, 110, 114, 118, 65, 62] }, { name: 利润目标, type: scatter, // 类型为散点图 data: [75, 115, 120, 125, 70, 70], itemStyle: { color: #ff0000 // 红色散点 }, symbolSize: 10 // 散点大小 } ]这样图表中就会同时存在柱子和散点。tooltip会智能地同时展示它们的信息。这种混合图表的能力是ECharts强大灵活性的一个体现可以用于标注平均值、阈值线、特殊数据点等。4. 深入堆叠柱状图揭示部分与整体的关系多柱状图擅长对比不同系列在同一类目下的数值。但有时候我们更关心每个类目下各组成部分的构成以及总量的对比。这时堆叠柱状图Stacked Bar Chart就派上用场了。它的核心配置是一个属性stack。stack属性用于将多个系列“堆叠”在同一根柱子上。拥有相同stack值的系列会被堆叠在一起。让我们改造一下之前的例子假设“成本”和“利润”堆叠起来构成“总收入”const option { title: { text: 堆叠柱状图示例 }, tooltip: { trigger: axis, axisPointer: { type: shadow } }, legend: { data: [成本, 利润, 总收入] }, // 总收入是虚拟系列用于显示总量 xAxis: { type: category, data: [一月, 二月, 三月, 四月, 五月, 六月] }, yAxis: { type: value }, series: [ { name: 成本, type: bar, stack: total, // 指定堆叠组为 ‘total’ data: [80, 120, 110, 100, 70, 85], itemStyle: { color: #5470c6 } }, { name: 利润, type: bar, stack: total, // 指定相同的堆叠组 ‘total’ data: [70, 110, 114, 118, 65, 62], itemStyle: { color: #91cc75 } } ] };现在图表中的柱子不再是并排的三根而是每个月只有一根“总”柱子它由下层的“成本”蓝色和上层的“利润”绿色两部分堆叠而成。鼠标悬停时tooltip会清晰地显示每一部分的值以及它们的和。4.1 显示堆叠柱子的总和标签一个常见的需求是在堆叠柱子的顶部显示该柱子的总和。ECharts提供了label配置项可以将其放置在柱子外部‘top’。series: [ { name: 成本, type: bar, stack: total, data: [80, 120, 110, 100, 70, 85], label: { show: false // 成本部分不显示标签 } }, { name: 利润, type: bar, stack: total, data: [70, 110, 114, 118, 65, 62], label: { show: true, position: top, // 标签显示在柱子顶部 formatter: function(params) { // params.value 是本系列的值 // 要计算总和需要访问另一个系列的数据这里用简单示例 // 实际项目中总和数据可能需要预先计算或从其他途径获取 let total params.value costData[params.dataIndex]; // 假设costData是成本数组 return total; } } } ]更优雅的做法是添加一个“虚拟”的、透明的系列专门用于显示总和标签并将其堆叠在最上面series: [ { name: 成本, type: bar, stack: total, data: [80, 120, 110, 100, 70, 85] }, { name: 利润, type: bar, stack: total, data: [70, 110, 114, 118, 65, 62] }, { name: 总收入, type: bar, stack: total, data: [150, 230, 224, 218, 135, 147], // 这里是预先计算好的总和数组 itemStyle: { opacity: 0 // 完全透明不显示柱子 }, label: { show: true, position: top, formatter: {c} // ‘{c}’ 会直接使用 series.data 中的值 } } ]这种方法清晰地将数据成本、利润和展示总和标签分离是更推荐的做法。5. 高级交互与性能优化让图表“活”起来基础图表画出来后真正的挑战在于如何让它更好地与用户互动以及在大数据量下保持流畅。这也是热词中“鼠标点那儿在哪儿显示”、“点击legend”等问题的深层诉求。5.1 精准的Tooltip与数据区域缩放“鼠标点那儿在哪儿显示”除了基础的tooltip触发还可以结合axisPointer实现更丰富的效果。例如在折线图或时间序列柱状图中我们可能希望有一个跟随鼠标的竖线十字准星并实时显示该位置所有系列的值。tooltip: { trigger: axis, axisPointer: { type: line, // 改为直线型跟随鼠标 label: { backgroundColor: #6a7985 // 坐标轴指示器文本标签的背景色 } } },对于数据量特别大的柱状图比如展示一年365天的数据所有柱子挤在一起会无法阅读。这时就需要dataZoom数据区域缩放组件。const option { // ... 其他配置 dataZoom: [ { type: slider, // 滑动条型 xAxisIndex: 0, // 控制第一个xAxis start: 0, // 默认起始位置 0% end: 20 // 默认结束位置 20%即只显示前20%的数据 }, { type: inside, // 内置型支持鼠标滚轮缩放 xAxisIndex: 0 } ] };这样图表下方会出现一个滑动条用户可以拖动来查看不同时间范围的数据同时支持鼠标滚轮在图表区域内直接缩放体验非常好。5.2 动态图表与Legend交互“点击legend柄图中间总数跟着变化”这个热词描述了一个经典交互点击图例legend来显示或隐藏某个数据系列。在ECharts中这是默认行为当你点击图例上的系列名称时对应的系列就会在图表上显示或隐藏。图表会立即重绘并且所有依赖于此系列的计算如堆叠柱的总和、坐标轴范围都会自动更新。如果你想自定义这个行为可以监听legendselectchanged事件myChart.on(legendselectchanged, function (params) { console.log(params.selected); // 输出当前所有图例的选中状态 // 可以在这里执行自定义逻辑比如更新其他关联组件 });5.3 大数据量下的性能考量当柱状图的数据点超过几千甚至上万时渲染性能会成为瓶颈。ECharts提供了几种优化方案使用large模式对于纯数值柱状图xAxis为‘value’类型可以开启large模式它使用一种更高效的渲染算法。series: [{ type: bar, large: true, largeThreshold: 2000, // 数据量大于2000时启用 data: hugeDataArray }]数据采样在后端或数据处理阶段对超大数据集进行降采样如取平均值、最大值只传递有代表性的数据给前端渲染。虚拟滚动类似于前端表格的虚拟滚动只渲染可视区域内的柱子。这需要更复杂的自定义实现通常结合dataZoom和动态数据加载来完成。6. 常见问题排查与实战技巧在实际项目中你几乎一定会遇到一些让人头疼的问题。这里我总结几个高频的“坑”和解决方案。6.1 柱子不显示或显示异常检查DOM容器尺寸这是最常见的问题。ECharts实例化的DOM容器必须有明确的宽度和高度不能是0。确保在CSS中设置了width: 100%; height: 400px;之类的样式或者通过JS动态设置chartDom.style.width ‘800px’。检查数据格式series.data必须是数字数组。如果数据中包含null,undefined,NaN或字符串可能导致柱子无法渲染。在传入数据前做好清洗和转换。检查控制台错误打开浏览器的开发者工具查看Console面板是否有ECharts报错信息如“Invalid data”。6.2 坐标轴标签重叠或显示不全当X轴类目很多时文字标签会挤在一起。解决方法旋转标签xAxis.axisLabel.rotate: 45。间隔显示xAxis.axisLabel.interval: 2每隔2个显示一个。换行通过formatter函数将长标签截断或换行。使用时间轴如果是时间数据将xAxis.type设为‘time’ECharts会自动优化刻度。6.3 自定义Tooltip内容默认的tooltip格式可能不符合业务需求。你可以使用tooltip.formatter函数进行完全自定义。tooltip: { trigger: axis, formatter: function (params) { // params 是一个数组包含当前坐标点所有系列的信息 let result 日期${params[0].axisValue}br/; params.forEach(function (item) { // item.seriesName 系列名 // item.value 数值 // item.color 系列颜色 result span styledisplay:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${item.color}/span; result ${item.seriesName}: ${item.value}br/; }); return result; } }6.4 在特殊环境下的使用如Uni-app小程序热词中提到了“uniapp小程序怎么使用echarts”。在Uni-app等小程序平台由于没有传统的DOM不能直接使用Web版本的ECharts。你需要使用官方或社区提供的适配版本如echarts-for-weixin微信小程序或lime-echarts跨端方案。这些版本将ECharts的渲染逻辑适配到小程序的Canvas组件上API与Web版基本一致但初始化方式略有不同需要遵循相应插件的文档。7. 从柱状图出发探索ECharts的生态与边界掌握了柱状图你就掌握了ECharts配置系统的精髓。它的配置项是树状结构具有高度的一致性。你会发现折线图type: ‘line’、饼图type: ‘pie’、散点图type: ‘scatter’的核心配置series结构与柱状图惊人地相似主要区别在于type和一些特有的属性如饼图的radius。热词中提到的“echarts 3d饼图”、“echarts gl官网”、“echarts地图”等指向了ECharts更广阔的生态ECharts GL 一个用于3D图表、地理可视化GIS和WebGL渲染的扩展库。如果你想做真正的3D柱状图、3D地图飞线图就需要引入它。地图 ECharts内置了丰富的地理坐标系支持可以轻松绘制中国及世界地图并实现数据下钻、区域染色、散点标注等效果。热词中的“echarts深圳地图数据铺底”就是典型的地图应用场景。社区案例与在线构建器 ECharts官网提供了海量的“示例”和“在线构建工具”对应热词“echarts 在线构建”当你不知道某个效果如何实现时去示例库搜索是最快的方式。你可以直接修改示例代码实时看到效果然后应用到自己的项目中。最后关于“从柱状图提取数据的软件”这通常指的是图表识别或数据抓取工具与ECharts本身关系不大。ECharts的核心是生成图表而不是从图表中提取数据。数据的处理和分析应该在生成图表之前完成。画好一个柱状图远不止是调用一个API。它涉及到数据理解、视觉编码、交互设计和性能优化的方方面面。从最基础的series: [{type: ‘bar’}]开始逐步添加stack、itemStyle、dataZoom、自定义formatter你会逐渐体会到ECharts“配置即代码”哲学的强大与优雅。希望这篇结合了基础、进阶和实战经验的内容能成为你数据可视化之路上一份可靠的参考。当你下次再遇到“如何让柱子有圆角”或者“怎么实现堆叠”这类问题时能够自信地打开编辑器写出既正确又漂亮的配置。
返回列表