我第一次接触 ECharts 的时候,感觉像是在玩一个巨型的乐高玩具盒。里面什么颜色的积木都有,说明书薄薄几页,但拼出来的东西能让你惊掉下巴。很多新手(包括当年的我)拿着这个盒子,要么不知道从哪下手,要么拼出来一堆“怪物”——柱状图像杂草,折线图乱成一锅粥,饼图饼得让人认不出哪块是哪块。
别慌,这篇指南不念经,咱们像聊天一样,把 ECharts 这件利器拆开来揉碎了讲。我会带你从第一个红点开始,一路走到能做出那种“哇,这是人做的吗?”的炫酷图表。
别急,先搞定你的第一个“Hello World”
在写代码之前,你得有个环境。ECharts 很简单,不需要 npm install 一堆复杂依赖(虽然生产环境推荐这么做),哪怕你只是不懂前端,用个最简单的 HTML 文件也能跑起来。
想象一下,你有一个空的画布,ECharts 就是那支笔。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 第一步:引入 ECharts -->
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<title>我的第一个图表</title>
</head>
<body>
<!-- 第二步:准备一个有明确大小的容器 -->
<div id="main" style="width: 600px; height: 400px;"></div>
<script type="text/javascript">
// 第三步:初始化 echarts 实例
var myChart = echarts.init(document.getElementById('main'));
// 第四步:制定配置项
var option = {
title: { text: '我是新手的第一张图' },
tooltip: {},
xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] },
yAxis: {},
series: [{
name: '销量',
type: 'bar', // 柱状图
data: [5, 20, 36, 10, 10, 20]
}]
};
// 第五步:把配置交给 ECharts,让它去画
myChart.setOption(option);
</script>
</body>
</html>
看到 setOption 了吗?这是 ECharts 的“心脏起搏器”。你把 option 填好,它就把死数据变成了活的图。
这里有个新手必踩的坑: 容器必须有高度和宽度。如果你发现图是空的,或者报错说“dom is not defined”,99% 是因为你忘记给那个 <div> 设置 width 和 height,或者你在 DOM 还没渲染好之前就初始化了图表。记住,先有盒子,再初始化。
柱状图(Bar):别让它变成“森林火灾”
柱状图是最常用的图表,用来比大小。但很多新手做出来的柱状图,柱子密密麻麻挤在一起,或者颜色刺眼,让人看了头晕。
1. 基础优化:留出呼吸感
看下面这个例子,我们对比一下“默认版”和“优化版”。
默认版(容易出现的错误):
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110, 130]
}]
这种默认情况下,柱子会占满整个网格,没有间隙,颜色也是默认的那几种高饱和度蓝绿,看起来非常累。
优化版(加入细节):
series: [{
type: 'bar',
data: [120, 200, 150, 80, 70, 110, 130],
// 柱子宽度,不要让它太粗太细
barWidth: '40%',
// 柱子颜色,用柔和一点的
itemStyle: {
color: '#5470c6',
// 给柱子圆角,看起来更现代
borderRadius: [4, 4, 0, 0]
},
// 柱子上的数字标签
label: {
show: true,
position: 'top'
}
}]
还有,X 轴和 Y 轴的分割线(splitLine)不要全部显示,通常只保留 Y 轴的横向网格线就够了,而且颜色要淡,比如 lineStyle: { color: '#eee' }。
2. 分组与堆叠:讲清楚数据的层次
如果你的数据有“类目”和“子类目”,比如“各城市”下的“男/女”销量,一定要分清是分组柱状图还是堆叠柱状图。
- 分组:并排站立,适合对比同一维度下的差异。
- 堆叠:层层叠加,适合看总量以及各部分的贡献度。
// 堆叠柱状图的配置关键
series: [
{ name: '直接访问', type: 'bar', stack: 'total', data: [320, 302, 301, 334, 390] },
{ name: '邮件营销', type: 'bar', stack: 'total', data: [120, 132, 101, 134, 90] },
{ name: '联盟广告', type: 'bar', stack: 'total', data: [220, 182, 191, 234, 290] }
]
注意那个 stack: 'total',只要 name 相同的 series,就会堆叠在一起。这是新手最容易搞混的地方,明明数据对了,但图看起来像分组而不是堆叠,记得检查 stack 字段。
折线图(Line):平滑还是尖锐?
折线图用来展示趋势。很多新手画出来的折线图,拐角是直角的,看起来像楼梯,或者线条太粗太黑,视觉重量太大。
1. 平滑曲线 vs 折线
series: [{
type: 'line',
smooth: true, // 开启平滑曲线
// 或者 sharp: false (默认)
data: [10, 52, 200, 334, 390, 330, 220]
}]
如果你的数据是连续的时间序列(比如每分钟的气温),用平滑曲线更直观。如果是离散的状态(比如周一到周日的评级),保留尖锐的折角反而更准确。
2. 面积填充:增加视觉厚度
有时候单线条太单薄,我们可以给它加个阴影面积。
series: [{
type: 'line',
areaStyle: {}, // 加上这一行,就会有渐变填充
data: [10, 52, 200, 334, 390, 330, 220]
}]
为了让面积图好看,记得配合 xAxis.type: 'time' 或者保持 X 轴刻度均匀。另外,lineStyle 的宽度建议设为 2 或 3,默认的那条细线在高清屏上几乎看不见。
3. 多线干扰症
当折线图超过 3 条线时,新手常犯的错误是不加区分地用默认颜色,结果几根颜色相近的线缠在一起,根本分不清。
解决方案:
- 使用
tooltip: { trigger: 'axis' },让鼠标悬停时显示所有线在该点的数值。 - 手动指定颜色,确保颜色之间对比度够大。
- 如果线太多,考虑用“滑动条”(dataZoom)来控制查看范围,不要试图在一个视图里塞进 10 条线。
饼图(Pie):拒绝“看不清的馅饼”
饼图是重灾区。新手最容易犯的错误:把饼图做成“甜甜圈”却不让它空,或者标签指向线乱飞,或者数据太多饼图变成一盘散沙。
1. 饼图适合什么数据?
饼图只适合展示“部分占整体的比例”,而且数据项最好不超过 5-6 个。如果你有 10 个类目,每个比例都差不多,请改用条形图。条形图在比较大小上永远比饼图更直观,因为人类大脑比较长度比比较角度更准。
2. 标签外避位与引导线
series: [{
type: 'pie',
radius: ['40%', '70%'], // 环形图,比实心饼更高级,也更能看清中心
center: ['50%', '50%'],
data: [
{ value: 1048, name: '搜索引擎' },
{ value: 735, name: '直接访问' },
{ value: 580, name: '邮件营销' },
{ value: 484, name: '联盟广告' },
{ value: 300, name: '视频广告' }
],
// 关键配置:label 和 labelLine
label: {
show: true,
formatter: '{b}: {c} ({d}%)', // 显示名称:数值 (百分比)
// 让标签在外部,避免拥挤
outside: true
},
labelLine: {
show: true,
length: 10, // 引导线第一段长度
length2: 20 // 引导线第二段长度
},
// 高亮状态
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
重要技巧: 使用 radius 配置环形图(Donut Chart)。环形图中间可以放文字,展示核心指标(如“总访问量”),这样既美观又信息密度高。实心饼图中间那块空白太浪费了。
3. 颜色选择
不要让用户自己去猜颜色对应的含义。如果在饼图里用了非常相近的颜色(比如深蓝和深绿),在打印或色弱模式下会彻底失效。建议去 ECharts 配色盘 或者使用 Tableau 的经典配色方案,保证每个扇区颜色 distinct。
那些让图表“高级感”倍增的细节配置
很多时候,图表不好看不是因为数据有问题,而是因为“默认设置”太丑。以下是几个立竿见影的优化技巧。
1. 配色:克制是美
ECharts 默认的主题(Classic)颜色饱和度很高,适合数据大屏,但放在文档或网页正文里会显得很刺眼。
建议:
- 背景色:如果是深色大屏,背景用
#100C2A这种深蓝黑;如果是白底网页,保持white。 - 主色调:不要超过 3 种主色。可以用渐变色来增加质感。
这种从浅蓝到深蓝的垂直渐变,会让柱状图看起来有立体感。itemStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: '#83bff6' }, { offset: 0.5, color: '#188df0' }, { offset: 1, color: '#188df0' } ]) }
2. Tooltip(提示框):信息的第二现场
默认 tooltip 很简陋。你可以自定义它的样式,甚至让它显示 HTML。
tooltip: {
trigger: 'axis', // 轴触发,鼠标悬停显示整条轴线数据
backgroundColor: 'rgba(50,50,50,0.7)',
borderColor: '#777',
borderWidth: 1,
textStyle: {
color: '#fff'
},
// 自定义内容,比如加个图标
formatter: function (params) {
let str = `<div style="font-weight:bold">${params[0].name}</div>`;
params.forEach(item => {
str += `<div style="display:flex;align-items:center">
<span style="display:inline-block;width:10px;height:10px;background:${item.color};margin-right:5px;border-radius:50%"></span>
${item.seriesName}: ${item.value}
</div>`;
});
return str;
}
}
这样你的 tooltip 就不只是一行冷冰冰的文字,而是一个带颜色小圆点的小卡片。
3. 响应式:别让你的图表在手机上撑爆
很多开发者写完图表,在手机上一看,字小得看不见,或者图被截断。
ECharts 提供了 resize() 方法。你需要监听窗口大小变化,并重新计算图表。
// 初始化时
var myChart = echarts.init(document.getElementById('main'));
// 监听窗口变化
window.addEventListener('resize', function() {
myChart.resize();
});
这行代码必须加!否则你的图表在移动端就是一坨乱码。更高级的做法是使用 echarts.init 的 devicePixelRatio 选项,确保在 Retina 屏上清晰。
新手常见的“翻车”现场与避雷指南
我在带新人时,他们最常问的几个问题,我整理成了这个“避雷区”。
错误 1:数据格式搞错
ECharts 对数据格式很敏感。
- 柱状图/折线图:
xAxis.data是类目,series.data是数值。 - 饼图:
series.data是{name, value}对象数组。 - 散点图:
series.data是[x, y]坐标数组。
很多新手把饼图的数据写成 [10, 20, 30],结果图表显示不出来,或者报错。记住:饼图数据必须有 name。
错误 2:颜色覆盖顺序搞反
在 itemStyle 里设置颜色时,不要和 color 数组混淆。
// 错误写法:试图用 color 覆盖单个柱子
series: [{
color: ['red', 'green'], // 这个属性在 series 里不存在
data: [...]
}]
// 正确写法:使用 itemStyle 或 color 数组在 option 顶层
option = {
color: ['#ff7f0e', '#845ec1'], // 全局颜色盘
series: [{
itemStyle: { color: 'red' } // 单个系列或数据项的颜色
}]
}
错误 3:Y 轴不从 0 开始
这是数据可视化的大忌,除非你有非常特殊的理由(比如展示极微小的波动)。如果 Y 轴从 90 开始,而数据是 95 和 100,柱状图看起来前者是后者的两倍,但实际上只差 5%。这会误导读者。
建议: 始终检查 yAxis: { min: 0 }。ECharts 默认通常是从 0 开始,但如果你设置了 yAxis.min,一定要慎重。
错误 4:文字溢出或重叠
当 X 轴类目很多,且名称很长时(比如“2023年第四季度华东地区销售额”),文字会挤在一起。 解决方案:
- 倾斜 X 轴标签:
axisLabel: { rotate: 45 } - 换行显示:
axisLabel: { formatter: function(value) { return value.split('').join('\n'); } }(简单粗暴) - 使用
axisLabel.interval: 0确保显示所有标签,配合hideOverlap: true避免完全重叠。
实战演练:做一个“销售 Dashboard”卡片
光说不练假把式。我们来做一个稍微复杂一点的组合图表:上面是柱状图(销量),下面是折线图(增长率),共享 X 轴。这种“双Y轴”或“组合图”在实际工作中非常常见。
”`javascript var option = {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'cross' }
},
legend: { data: ['销量', '增长率'] },
grid: [
{ left: '10%', right: '10%', top: '15%', height: '50%' }, // 上方网格
{ left: '10%', right: '10%', top: '70%', height: '20%' } // 下方网格
],
xAxis: [
{ type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], gridIndex: 0 },
{ type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], gridIndex: 1 }
],
yAxis: [
{ type: 'value', name: '销量', gridIndex: 0, position: 'left' },
{ type: 'value', name: '增长率', gridIndex: 1, position: 'right' }
],
series: [
{
name: '销量',
type: 'bar',
xAxisIndex: 0,
yAxisIndex: 0,
data: [120, 200, 150, 80, 70, 110,
