尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ECharts中文手册实战:图表绘制、高频配置与大屏适配避坑指南

ECharts中文手册实战:图表绘制、高频配置与大屏适配避坑指南 先说点实在的。ECharts 的中文文档手册我翻过不下几十遍从早期 2.x 一路用到 5.x官方文档其实写得并不差配置项手册、示例库、API 都有但说实话它更像一本“词典”而不是“攻略”。你在文档里能查到tooltip.formatter怎么用但未必知道为什么折线图 x 轴刻度总是挤成一团也未必知道饼图 labelLine 末端那个小圆点该去哪里调更不用说大屏项目里pxtorem对 ECharts 完全失效这种玄学问题。这篇内容就是想把这些散落在热搜词里的高频痛点串起来分享一份真正基于实操的 ECharts 中文手册使用方法适合正在做数据可视化大屏、日常报表开发、或者刚被安排做“第 1 关柱状图绘制”课程作业的同学参考。1. 内容整体设计与思路拆解1.1 先搞清“手册”里到底有什么ECharts 官网的中文文档入口其实分成几块很多人一进去就蒙了只知道点“示例”然后复制代码等出问题再回来翻结果连入口都找不到。第一块是顶部导航栏的“文档”里面包含“快速上手”“术语速查”“配置项手册”“API”“FAQ”。其中真正核心的是“配置项手册”它按option的顶层字段title、tooltip、legend、xAxis、yAxis、series等分好了目录左侧有搜索框右上角可以直接搜配置项名称。这一块是日常开发频次最高的地方但它的缺点是每条配置只说“是什么”不说“为什么”更不说“和小伙伴搭配时的坑”。第二块是“示例”里面按柱状图、折线图、饼图、散点图、地图等类别分好每个示例右上角有“编辑实例”按钮可以直接改代码看效果。这块其实是效率最高的学习入口我到现在写新图表第一反应还是去示例里搜一个最接近的效果然后改成自己要的数据和样式而不从空配置开始写。第三块容易被忽略的是“社区”生态。ECharts 官方在 4.x 时代有专门的 gallery 社区后来迁移到官方示例库但外部社区仍然活跃比如 ppchart 这类收录了大量大屏模板和自定义图表方案的地方很多你在官方案例里找不到的造型在社区里往往有人已经写好了。搜索关键词“echarts社区”命中的人大概率是在找能抄的大屏模板。我的建议是模板可以抄但要先确认它的 ECharts 版本4.x 的模板放进 5.x 项目里有些配置项可能直接失效尤其是地图相关的geo坐标系和series-map改动不小。1.2 看懂 option 的“骨架”比背配置项更重要新手拿到一份配置最常问的是“这个配置写在哪里”其实所有 ECharts 图表都逃不开一套固定骨架option是一个嵌套对象最外层是全局组件如title、tooltip、legend、grid中间是坐标系xAxis、yAxis、geo里面是系列series一个数组可以放多个系列系列里又可以挂data、markPoint、markLine等标记数据。理解了这套骨架你查文档的效率能提升一个量级。比如你去查labelLine发现它属于series-pie.labelLine就不会在全局配置里翻半天。再比如热搜里的“echarts map里的 markPoint”markPoint动辄出现在柱状图、折线图、K线图里但在地图场景下它既可能挂在series-map.markPoint也可能挂在geo上配合series-scatter实现两个位置效果不同、配置方式也不同。这些细节不搞懂骨架很难排查。2. 高频图表配置拆解从“第1关”到实战2.1 第1关ECharts 中柱状图的绘制到底在考什么“第1关echarts中柱状图的绘制”这个热搜词一看就是课程作业场景。很多在线课程和实训平台会把“用 ECharts 画一个柱状图”作为数据可视化的第一关考察的不是你会不会背配置而是能不能独立完成“引入 ECharts、准备 DOM 容器、写 option、调用 setOption”这四步闭环。最基本的柱状图配置大概是这样的const chartDom document.getElementById(main); const myChart echarts.init(chartDom); const option { xAxis: { type: category, data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun] }, yAxis: { type: value }, series: [ { name: 销量, type: bar, data: [120, 200, 150, 80, 70, 110, 130] } ] }; myChart.setOption(option);这一关的考点往往在几个地方第一echarts.init的容器必须有宽度和高度否则图表渲染出来是 0 高度第二type: value的 y 轴和type: category的 x 轴别搞反否则数据对不上第三series是数组可以同时放多个柱状系列但每个系列的name要唯一否则legend会显示错乱。如果你已经过了入门想在这个基础上加“圆角柱状图”“堆叠柱状图”“柱状图最大最小值标记”路径也很简单去官网示例搜“bar”里面有大把现成例子。2.2 折线图 x 轴刻度挤在一起、对不齐、不显示怎么办热搜里“echarts折线图x轴刻度”是一个很大的分类我拆开来看实际遇到最多的问题有三个。第一个是时间型数据太多x 轴标签全挤成一片。解决方案不是调文字的旋转角度而是用xAxis.axisLabel.interval。当xAxis.type是category时interval可以写数字比如interval: 2表示隔两个刻度显示一个标签也可以写函数按数据长度动态计算保证最小间隔。更好的方案是让 x 轴变成连续型的时间轴也就是xAxis.type: time它会自动抽稀标签配合xAxis.axisLabel.hideOverlap: true效果很干净。第二个是刻度线和标签对不齐。这个要分清场景。如果type: category默认情况下柱子或者折线点会落在刻度线的位置也就是每个类目的正中间如果想左对齐或者右对齐可以用xAxis.boundaryGap和series的barCategoryGap、barGap来调。折线图领域里的“对齐”问题还有一个视觉上的错觉折线图第一个点和最后一个点离 y 轴太近看起来像被裁掉这时把boundaryGap设为truecategory 轴的默认行为或者xAxis.min/max留出边距即可。第三个是刻度线本身不显示。很多人会去查axisTick但真正原因是axisLine和splitLine的样式设置覆盖了默认值或者grid里把containLabel设成了false刻度线上的数字被挤出可视区域。这种情况下优先检查grid的left/right和containLabel。还有一个经常被忽略的点xAxis.axisLabel.formatter。你可以在里面写成{value}月这种模板字符串也可以写成函数对时间戳做格式化例如params dayjs(params).format(MM-DD)。数据可视化大屏里这种自定义格式几乎是必须的。2.3 饼图系列难点legend、labelLine 小圆点、tooltip 换行饼图看起来简单但往往是最容易让人挠头的一类图。先看“echarts 饼图 legend”。饼图的 legend 默认会显示所有数据项的name当你设置了多个系列或者多个饼图时legend 会自动分成多组。常见的问题是 legend 的排列方向、位置和样式调整。位置用legend.top/left/right/bottom方向用legend.orient图标用legend.icon可以是circle、rect、roundRect也可以是image://url。如果你的series.name和legend.data对不上legend 就会出现“名称是灰的但图例点亮”这类诡异现象——排查思路永远是先保证series.name与legend.data一致再谈样式。接着是“echarts 饼图 labelline 末尾小圆点偏移”。这个我印象很深某次做大屏产品非要饼图外面每个标签线末端带一个小圆点而且要求所有圆点离饼图边缘的距离一致。ECharts 默认的labelLine只有线段没有“末端圆点”。我当时试了两种方案第一种是把label.formatter写成一个带有图片背景的 HTML 模板但这样在小圆点的尺寸、位置和点击事件上都不好控制第二种是在series的labelLayout回调里手动计算位置然后配合graphic元素画圆点能精确控制但代码量大。后来发现更优雅的做法是利用饼图label的富文本能力在formatter模板里直接拼一个小圆点的富文本样式一句{name|●} {name}\n{percent|{d}%}就搞定了textStyle里用rich定义name和percent的样式。至于“偏移”一般不是配置项写错而是labelLine.length和labelLine.length2的数值与标签文字宽度不匹配导致的把length2适当调大标签离线段远一点视觉上就整齐了。最后是“echarts tooltip 自动换行”。tooltip 默认会把formatter返回的字符串原样渲染很多时候你写了\n页面上却显示成一个空格。这是因为它默认渲染在普通 div 里换行符不被解析为br/。解决方案有两种一是formatter里直接拼br/二是给 tooltip 设置extraCssText: max-width: 300px; white-space: normal;同时formatter返回普通文本让内容在超过最大宽度时自动换行。大屏上尤其推荐第二种因为数据项多的时候长文本硬换行比手动拼br/稳健。3. 地图、3D 与特色图表实战3.1 ECharts 中国地图从注册数据到标点“echarts中国地图”是常年热搜词因为 ECharts 从 5.0 开始不再内置地图 GeoJSON你需要自己注册地图数据。很多新手找遍官方文档发现没有china.json下载入口就直接去各种第三方站点拷数据拷完又发现坐标系对不上或者省份名称对不上。标准做法分三步。第一步准备中国地图的 GeoJSON 数据可以在一些公开的 GeoJSON 数据仓库里找注意版本和坐标系尽量用符合 GCJ-02 或 WGS-84 的数据项目中如果涉及地图底图要和你用到的底图服务保持一致。第二步用echarts.registerMap(china, geoJson)注册这里的china是一个自定义名称后续geo.map和series-map.map都用同一个名字。第三步写geo配置geo: { map: china, roam: true, zoom: 1.2, label: { show: true }, itemStyle: { areaColor: #323c48, borderColor: #111 } }这时会遇到一个经典问题geo和series-map同时存在地图区域颜色不生效或者鼠标悬浮无反应。原因是series-map自带map属性它会创建一个新的地图系列而geo是独立坐标系组件两者不能简单混用。想让数据驱动地图区域颜色变化应该用series-map同时把geo当成背景层如果只是想在固定地图上叠加标点可以直接用geo作为坐标系再配合类型为scatter或effectScatter的系列通过geoIndex: 0绑定。“echarts map 里的 markPoint”这个热搜多半是把 markPoint 挂在series-map上但始终不显示。根因是markPoint.data里的坐标写错了。地图场景里 markPoint 的coord是经纬度数组不是 x/y 像素坐标例如coord: [116.46, 39.92]表示北京。如果你用了geo坐标系建议直接在geo坐标系上加effectScatter系列用data里的value: [经度, 纬度, 数值]通配实现比markPoint灵活得多还能单独控制每个点的颜色和大小。3.2 让人又爱又恨的“echarts 3d pie”网上有不少“ECharts 3D 饼图”的美图和代码但严格来讲ECharts 官方核心库里并没有“3D 饼图”这个系列类型。这是 ECharts GL即echarts-gl扩展包里的pie3D本质上是基于 WebGL 的 3D 曲面不是真正意义上的 3D 渲染几何体。这也是为什么你直接用 ECharts 5 去跑网上的 3D 饼图代码大概率报错Component series.pie3D not exists。如果你要复刻先安装echarts-gl然后配置series: [ { type: pie3D, data: [ { name: A, value: 30 }, { name: B, value: 50 } ], pie3D: { // 不同版本参数位置有差异5.x echarts-gl 2.x 的写法如下 }, shading: lambert, bevelSize: 0.3, bevelThickness: 0.8, label: { show: true, formatter: {b}\n{c} } } ]说实话pie3D的配置在不同版本之间差异比较大有些参数挂在series[0]上有些需要包裹在pie3D对象里。最稳的方式是直接去 echarts-gl 的官方示例库找 3D 饼图的三维配置把它整体拷贝下来再替换数据。还有一点要提醒echarts-gl对大屏性能不太友好尤其是低端机器的 WebGL 兼容性。如果你只是为了“看着高级”可以考虑用 CSS 3D 或者伪 3D 的平面变形成本低很多。4. 大屏适配与多场景集成4.1 pxtorem 对 ECharts 没起到效果别改 CSS 了改这里“pxtorem 对 echarts 没起到效果 vue3”这个热搜真的是被问烂了的问题。现象是项目里用postcss-pxtorem做移动端或大屏适配所有 CSS 里的 px 都被自动换算成 rem但 ECharts 图表里的字体、图形大小完全没变。原因不是 ECharts 不支持 rem而是 ECharts 的绘图引擎是基于 Canvas 的它绘制时读取的是option里的数值这些数值是 JS 里的字面量根本不会经过 CSS 预处理器的转换。换句话说postcss-pxtorem处理的是样式表里的单位而 ECharts 的字体大小、柱状图宽度、tooltip 内边距全部是在 JS 代码里写死的例如textStyle: { fontSize: 14 }和barWidth: 20它们和 CSS 单位是两套体系。正确解法是写一个 rem 转换函数在生成option之前把设计稿尺寸下你看到的 px 数值按比例转换成 rem 或自适应后的像素值。举个例子如果你设计稿宽度是 1920项目里设置了 rootValue 为 192那么 1rem 在 1920 宽度下等于 10px这里具体数值根据你自己项目来定你就可以这样定义一个工具函数function px(value) { const designWidth 1920; const rootValue 192; const clientWidth document.documentElement.clientWidth || window.innerWidth; return (clientWidth * value) / rootValue; }然后fontSize: px(14)、barWidth: px(20)。这么做的问题是页面 resize 时原来的图表尺寸会跟着容器自适应但字体和图形内部比例不会重新计算所以你还需要在 resize 时重建或刷新 option。其实对于数据可视化大屏我更推荐直接用vw/vh做整体布局ECharts 容器用百分比或者 vw/vh然后在渲染前把 ECharts 实例所在的容器宽度读取出来按设计稿比例将容器内的px数值换算成真实的像素值。比如设计稿是 1920 宽当前容器是 960 宽那么所有option里的尺寸都乘 0.5。这样一套代码在不同分辨率的大屏上都能等比缩放。还有一种更省事的产品化方案外层容器做transform: scale()整体缩放缺点是交互坐标会有偏差tooltip 的跟随效果容易错位不建议核心图表使用。4.2 Vue3 大屏项目里的 ECharts 封装思路Vue3 生态下做数据可视化大屏热点问题其实是组件化封装与实例生命周期管理。直接在每个组件里echarts.init再setOption是可以跑起来但遇到组件销毁时报Cannot read properties of undefined (reading dispose)之类的错就很头疼。推荐的封装模式是写一个useECharts的 composable内部维护chart实例通过onMounted初始化通过watch监听 option 变化通过onBeforeUnmount释放实例。核心代码类似import * as echarts from echarts; import { onMounted, onBeforeUnmount, shallowRef, watch } from vue; export function useECharts(elRef, optionRef) { const chart shallowRef(null); onMounted(() { chart.value echarts.init(elRef.value); chart.value.setOption(optionRef.value); window.addEventListener(resize, handleResize); }); watch(optionRef, (val) { chart.value chart.value.setOption(val); }, { deep: true }); function handleResize() { chart.value chart.value.resize(); } onBeforeUnmount(() { window.removeEventListener(resize, handleResize); chart.value chart.value.dispose(); chart.value null; }); return { chart }; }这里有一个细节echarts.init的容器如果是display: none或者宽度为 0渲染出来的图表尺寸是 0。在大屏项目里如果页面有 Tab 切换切换到隐藏 Tab 时重新resize()或者直接销毁重来不要偷懒以为setOption会自动处理容器尺寸变化。4.3 原生 JS、jQuery、Ajax、ECharts 结合老项目改造的常见姿势搜“将原生js、jquery、ajax、echarts结合制作网页”的读者大概率是在做课程设计或者老后台系统改造。这种场景的核心诉求是把后端接口数据拉到前端渲染成图表而且页面可能还有大量旧代码不能因为一个图表就引入 React/Vue。我建议的组合是原生 HTML 页面用 CDN 方式引入 ECharts数据请求用 jQuery 的$.ajax老项目里最常见拿到数据后通过myChart.setOption({ ... })更新。“结合”最大的坑是异步时序。例如先请求省份列表再根据省份请求对应的图表数据两个请求之间有依赖时稍微不注意第二个回调里拿到的变量可能是 undefined。解决的思路是封装一个简单的请求函数或者直接用 async/await 配合$.ajax改造async function loadData() { const res await $.ajax({ url: /api/getData, type: GET }); const chartData res.data.map(item ({ name: item.name, value: item.value })); myChart.setOption({ series: [{ data: chartData }] }); }另外老项目里如果同时引用了多份 ECharts 文件比如页面 A 引了 4.x公共底部又引了 5.x极容易出现TypeError: Cannot read property init of undefined。排查方式是在控制台打印window.echarts.version如果版本不是预期值就说明文件被覆盖了。这种情况强烈建议去掉多个 script 引用全局只保留最新版一份。地下一个容易漏掉的点如果后端返回的时间字段是字符串2025-01-01 00:00:00直接交给 ECharts 的time轴有时会被解析成文本而不是时间导致排序错乱。保险做法是先new Date(value).getTime()转成时间戳再给到data。5. 常见问题与排查技巧实录5.1 高频问题速查表问题根本原因推荐方案echarts.init报Container is not defined/ 图不显示DOM 容器无宽高或未挂载确保容器有显式宽高或在 DOM 挂载后再init折线图 x 轴标签重叠类目过多且未开启抽稀/旋转axisLabel.intervalhideOverlap: true或改用 time 轴饼图标签线末端圆点错位labelLine.length2与标签宽度不匹配使用富文本里拼●符号调整length2tooltip 内容不换行\n在默认 div 里不被解析成换行formatter 拼br/或设置extraCssText的white-space: normal地图区域颜色不变geo 和 series-map 混用明确数据驱动区域用series-map背景层才用geomarkPoint 不显示coord 写成了像素坐标改成经纬度或用geo effectScatter代替pxtorem 后 ECharts 字体不变Canvas 绘制不经过 CSS 预处理在 JS 里做等比换算或用 vw/vh / scale 方案图表 resize 后错位容器尺寸变了但实例未更新调用chart.resize()注意防抖组件销毁报错实例未 dispose在onBeforeUnmount里dispose并置空ECharts 版本被覆盖页面多次引入不同版本全局固定一个 CDN 版本不混引这张表不是让你背的而是用来当排查清单。我自己写图表的习惯是遇到问题先把“现象描述 - 猜测原因 - 验证方式”写出来然后逐条对照。大多数按配置项硬查不到的坑靠这种清单反而能快速定位。5.2 一些值得养的调试图层技巧第一在拿到一份复杂大屏模板时不要直接一把梭改数据。先打开浏览器的开发者工具在控制台打印myChart.getOption()你会发现 ECharts 会把未配置的默认值全部补齐。这个方法特别适合用来反查“某个样式到底写在哪里生效的”。只要找到渲染后的实际配置就很容易顺藤摸瓜找到 origin 写的字段。第二善用myChart.on(mouseover, ...)来定位数据点。有次地图上某个省份的 tooltip 死活不出现排查半天发现是数据里省份名和 GeoJSON 注册名不一致比如数据叫“广东省”但 GeoJSON 里叫“广东”。这种问题肉眼很难发现但在mouseover事件里打印params.name一眼就能看出异常。记住一个原则ECharts 匹配地图数据是靠名称字符串的严格相等不允许近似匹配。第三把官方示例代码当成“最小复现单元”。当你怀疑某个配置项写法有问题时先去官方示例库新建一个空白示例只粘贴你怀疑的配置片段如果这个最小片段正常那问题大概率出在项目其他代码污染了 option例如未清空旧数据、多个 setOption 合并导致配置残留。ECharts 的setOption是合并式更新不是全量替换如果你传入的 series 里少了某个系列旧的系列会继续保留。想全量覆盖可以调用myChart.setOption(option, true)第二个参数notMerge设为true。第四tooltip 内容里如果要用 HTML 做自定义样式记得不要引入不可信的外部数据直接拼进 HTML防止脚本注入。后端传回来的字段名和数据内容都当作普通文本处理需要富文本时尽量用 ECharts 的rich体系不要裸拼script或style。6. 关于 ECharts 中文文档手册我的真实使用心得ECharts 的中文文档手册说到底是“查”的不是“读”的。任何一个人想通过从头到尾读文档来学会 ECharts效率一定很低因为它的配置项极多你不踩坑就不会知道哪些配置是“八字不合”的。反过来如果你带着具体问题去查每一段文档都能读出味道来。我在实际使用中的习惯是这样的遇到想实现的效果先在官方示例里搜关键词找到一个最接近的跑通之后再逐步改造成自己的数据和样式。改动过程中每遇到一个配置报错就去配置项手册里看这个字段的类型、默认值和适用范围。最后把配置整理回自己的组件模板里方便复用。这套流程看起来不够“硬核”但在交付压力和项目排期下它是效率最高的。最后分享一个小技巧保存一份自己维护的“常用配置 snippet”。比如 tooltip 的通用 formatter、轴标签的防重叠设置、多系列颜色列表、地图的 markPoint 模板这些都整理成代码片段。下次新开项目时复制进去5 分钟就能搭出一个基础图表。不要每次都从零开始搜索配置文档是公共的但你的 snippet 是私有的积累越多踩坑越少。
返回列表