嘿,朋友!很高兴你能点进这篇教程。我是 Agnes,一个在数据可视化这片海里扑腾了好几年的老手。我知道你现在的感受——看着那些炫酷的仪表盘,心里痒痒的,想自己动手做一个,但打开 ECharts 官方文档那密密麻麻的 API 列表,瞬间就头大了:“这图里到底有多少个配置项?xAxis、yAxis、series、tooltip 到底谁管谁?”
别慌。今天我不给你背文档,我把这几年踩过的坑、写过的代码、debug 到的深夜,全都揉碎了讲给你听。我们要做的,是从零开始,搭建一个既好看又实用的数据可视化仪表盘。不管你是前端小白,还是想快速补齐图表技能的后端同学,这篇指南都能让你看完就能上手。
我们将一起搞定三样东西:折线图(看趋势)、柱状图(比大小)、饼图(看占比)。最后,我会把那些让你抓狂的常见报错一个个揪出来,配上解决方案。
准备好了吗?让我们开始吧。
第一章:准备工作——把 ECharts 请进你的项目
首先,你得有个“画板”。在 ECharts 的世界里,这个画板就是一个普通的 div 容器。
1.1 引入 ECharts
你有几种方式可以把 ECharts 请进来。对于新手,我推荐最稳妥的两种方式:
方式一:CDN 引入(最简单,适合快速原型或学习)
在你的 HTML 文件 <head> 或 </body> 前加上这两行:
<!-- 第一步:引入 ECharts -->
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
注意:版本号建议指定具体版本(如 5.4.3),避免自动更新带来的兼容性问题。
方式二:npm 安装(适合正式项目)
如果你用的是 Vue、React 或原生 Node.js 项目:
npm install echarts --save
然后在你的 JS 文件中引入:
import * as echarts from 'echarts';
// 或者按需引入,减少包体积
import echarts from 'echarts/lib/echarts';
import 'echarts/lib/chart/line';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/pie';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
1.2 创建一个挂载点
光有库不行,你得有个地方让它画。在你的 HTML 里加一个 div,并给它指定一个明确的高度。这是新手最容易犯的错误——没有给容器设置高度,图表就画不出来了,因为 ECharts 默认无法继承父元素的高度。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一个 ECharts 仪表盘</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<style>
/* 关键:给容器设置高度和宽度 */
#main {
width: 100%;
height: 400px;
margin: 20px auto;
}
/* 让我们加点样式,让它看起来像个仪表盘的一部分 */
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f5f7fa;
}
.dashboard-container {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
padding: 20px;
}
.chart-card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
margin: 10px;
padding: 20px;
width: 45%;
min-width: 300px;
}
.chart-title {
font-size: 18px;
font-weight: bold;
color: #333;
margin-bottom: 15px;
border-left: 5px solid #5470c6;
padding-left: 10px;
}
</style>
</head>
<body>
<div class="dashboard-container">
<!-- 折线图容器 -->
<div class="chart-card">
<div class="chart-title">月度销售趋势 (折线图)</div>
<div id="lineChart" style="height: 300px;"></div>
</div>
<!-- 柱状图容器 -->
<div class="chart-card">
<div class="chart-title">各部门业绩对比 (柱状图)</div>
<div id="barChart" style="height: 300px;"></div>
</div>
<!-- 饼图容器 -->
<div class="chart-card" style="width: 100%;">
<div class="chart-title">用户来源分布 (饼图)</div>
<div id="pieChart" style="height: 300px;"></div>
</div>
</div>
<script>
// 我们的 JavaScript 代码将放在这里
</script>
</body>
</html>
看,结构已经搭好了。三个卡片,三个图表。接下来,我们要给它们注入灵魂。
第二章:折线图——讲述时间的故事
折线图是数据可视化中最基础也最重要的图表之一,它擅长展示数据随时间变化的趋势。
2.1 最小可用配置
我们先写一个最最简单的折线图,让你看到效果,然后再逐步添加细节。
// 获取 DOM 元素
var lineChartDom = document.getElementById('lineChart');
// 初始化 ECharts 实例
var myLineChart = echarts.init(lineChartDom);
// 配置项
var lineOption = {
// 标题组件
title: {
text: '近一周访问量',
left: 'center'
},
// 提示框组件(鼠标悬停时显示详细信息)
tooltip: {
trigger: 'axis'
},
// 图例组件
legend: {
data: ['页面浏览', '用户访问']
},
// 网格配置,控制直角坐标系内绘图网格的起始位置和大小
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true // 包含标签区域,防止标签被裁剪
},
// X 轴配置
xAxis: {
type: 'category', // 类别轴,通常用于时间或分类
boundaryGap: false, // 取消类目轴两端空白,让折线从 Y 轴起点开始
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
},
// Y 轴配置
yAxis: {
type: 'value', // 数值轴
axisLabel: {
formatter: '{value} 次' // 标签格式化,加上单位
}
},
// 系列列表,每个系列通过 type 决定自己的图表类型
series: [
{
name: '页面浏览',
type: 'line',
smooth: true, // 平滑曲线,默认为 false(折线)
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: '用户访问',
type: 'line',
smooth: true,
data: [220, 182, 191, 234, 290, 330, 310]
}
]
};
// 使用配置项显示图表
myLineChart.setOption(lineOption);
2.2 参数详解与美化
上面的代码能跑起来了,但还不够“仪表盘”。我们来加点料。
1. 视觉优化:渐变与面积填充
折线图如果只是线条,有点单调。我们可以给折线填充渐变色,让它看起来更立体。
series: [
{
name: '页面浏览',
type: 'line',
smooth: true,
// 面积图样式
areaStyle: {
opacity: 0.3 // 半透明填充
},
// 线条颜色
itemStyle: {
color: '#5470c6'
},
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: '用户访问',
type: 'line',
smooth: true,
areaStyle: {
opacity: 0.3
},
itemStyle: {
color: '#91cc75'
},
data: [220, 182, 191, 234, 290, 330, 310]
}
]
2. 数据标记:突出重点
如果你想在某个特定数据点上做标记,比如“最高销售额”或“异常值”,可以使用 markPoint。
series: [
{
name: '页面浏览',
type: 'line',
smooth: true,
// 数据标记
markPoint: {
data: [
{ type: 'max', name: '最大值' }, // 自动标记最大值
{ type: 'min', name: '最小值' } // 自动标记最小值
]
},
// 平均线
markLine: {
data: [
{ type: 'average', name: '平均值' }
]
},
areaStyle: { opacity: 0.3 },
itemStyle: { color: '#5470c6' },
data: [120, 132, 101, 134, 90, 230, 210]
}
]
markPoint 和 markLine 是 ECharts 中非常实用的功能,能瞬间提升图表的信息密度。
3. 响应式处理
作为仪表盘,图表应该能随窗口大小自动调整。别忘了在初始化后监听窗口变化。
// 监听窗口大小变化,自适应图表
window.addEventListener('resize', function() {
myLineChart.resize();
});
第三章:柱状图——直观的大小比较
柱状图适合对比不同类别之间的数据大小。比如,对比各个部门的业绩、不同产品的销量等。
3.1 基础柱状图
var barChartDom = document.getElementById('barChart');
var myBarChart = echarts.init(barChartDom);
var barOption = {
title: {
text: 'Q3 各部门销售额',
left: 'center'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow' // 鼠标悬停时显示阴影指示器
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: ['销售部', '市场部', '技术部', '运营部', '客服部'],
axisTick: {
alignWithLabel: true // 刻度与标签对齐
}
}
],
yAxis: [
{
type: 'value',
name: '销售额 (万元)',
axisLabel: {
formatter: '{value} 万'
}
}
],
series: [
{
name: '销售额',
type: 'bar',
barWidth: '60%', // 柱宽,默认是自动
data: [320, 302, 341, 374, 390],
// 柱状图的颜色
itemStyle: {
color: '#fac858'
},
// 柱状图上显示数值
label: {
show: true,
position: 'top' // 标签位置
}
}
]
};
myBarChart.setOption(barOption);
3.2 进阶技巧:堆叠柱状图与分组柱状图
有时候,我们不仅要看总量,还要看构成。比如,每个部门的销售额中,线上和线下的占比。这就需要用堆叠柱状图。
// 修改 series 部分
series: [
{
name: '线上销售',
type: 'bar',
stack: 'total', // 堆叠系列名称,相同名称的系列会堆叠
data: [120, 132, 101, 134, 90],
itemStyle: { color: '#5470c6' },
label: { show: false } // 堆叠图通常不在每个分段上显示数值,太乱
},
{
name: '线下销售',
type: 'bar',
stack: 'total',
data: [220, 182, 191, 234, 290],
itemStyle: { color: '#91cc75' },
label: { show: false }
}
]
如果你想对比多个维度,比如同时对比 A 城市和 B 城市的各部门销售额,那就需要分组柱状图。
// 使用多个 xAxis 和 series
xAxis: [
{
type: 'category',
data: ['销售部', '市场部', '技术部', '运营部', '客服部'],
axisTick: {
alignWithLabel: true
}
}
],
series: [
{
name: 'A 城市',
type: 'bar',
barGap: '0%', // 相邻柱之间的距离,0% 表示紧挨着
data: [320, 302, 341, 374, 390],
itemStyle: { color: '#5470c6' }
},
{
name: 'B 城市',
type: 'bar',
data: [120, 132, 101, 134, 90],
itemStyle: { color: '#fac858' }
}
]
3.3 水平柱状图
当类别名称比较长时,垂直柱状图会让 X 轴标签挤在一起,难以阅读。这时,交换 X 轴和 Y 轴的角色,使用水平柱状图会更清晰。
xAxis: {
type: 'value' // 注意:现在是数值轴
},
yAxis: {
type: 'category', // 现在是类别轴
data: ['销售部', '市场部', '技术部', '运营部', '客服部'],
axisTick: {
show: false // 隐藏刻度线,更简洁
}
},
series: [{
type: 'bar',
data: [320, 302, 341, 374, 390],
itemStyle: {
color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [ // 渐变效果
{ offset: 0, color: '#83bff6' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
])
},
label: {
show: true,
position: 'right' // 标签在柱子右侧
}
}]
渐变效果(LinearGradient)是让图表看起来更高级的秘诀。ECharts 支持线性渐变和径向渐变,可以玩出很多花样。
第四章:饼图——比例与占比
饼图擅长展示各部分占总体的比例。它适合回答“谁占比最大?”“某部分是多少?”这类问题。
4.1 基础饼图
”`javascript var pieChartDom = document.getElementById(‘pieChart’); var myPieChart = echarts.init(pieChartDom);
var pieOption = {
title: {
text: '用户来源分布',
subtext: '近一个月',
left: 'center'
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)' // 自定义提示框内容
// {a}: series 名称, {b}: 数据项名称, {c}: 数值, {d}: 百分比
},
legend: {
orient: 'vertical', // 图例垂直排列
left: 'left',
data: ['搜索引擎', '直接访问', '邮件营销', '联盟广告', '视频广告']
},
series: [
{
name: '用户来源',
