**
在信息爆炸的现代网页开发中,数据可视化早已不是 "锦上添花",而是让复杂数据 "说话" 的核心手段。ECharts 这款基于 JavaScript 的开源图表库,就像一把精准的 "数据翻译官",能帮开发者把枯燥的数字变成直观的图表。本文就来深扒 ECharts 的使用技巧,教你高效实现复杂图表,附带着实打实的代码示例,让你一看就懂、一学就会。
1. 初识 ECharts:不止是 "画图表的工具"
ECharts 由百度团队开源,如今已是数据可视化领域的 "明星选手"。它最亮眼的地方,在于 "全能" 与 "灵活"------ 既支持折线图、柱状图、饼图等基础图表,也能搞定热力图、雷达图、地图等复杂可视化形式,甚至能通过自定义组件实现个性化图表。
更重要的是,它天生适配响应式设计,不管是 PC 端大屏还是手机小屏,图表都能自动调整布局;交互上也很贴心,鼠标悬停显示详情、点击切换数据、缩放查看细节等基础交互不用额外写代码,拿来就能用。
2. 上手准备:3 步搞定环境搭建
想用 ECharts,先把 "地基" 打牢 ------ 引入库文件、准备容器,两步就够。
2.1 引入 ECharts 库
最简单的方式是用 CDN,直接在 HTML 里加一行脚本:
xml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ECharts实战</title>
<!-- 引入ECharts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.3.3/echarts.min.js"></script>
</head>
<body>
<!-- 图表容器:必须指定宽高 -->
<div id="chart" style="width: 600px; height: 400px;"></div>
<!-- 自定义脚本 -->
<script src="app.js"></script>
</body>
</html>
也可以去ECharts 官网下载源码,本地引入 ------ 两种方式效果一样,按项目需求选就行。
2.2 核心原则:给图表 "留位置"
注意上面代码里的div#chart:ECharts 需要一个有明确宽高的 DOM 元素当容器,不然图表可能 "隐身"。如果要做响应式,用百分比设宽高(比如width: 100%; height: 400px),图表会跟着容器尺寸自动调整。
3. 从 "hello world" 到基础图表:5 分钟入门
别被 "复杂图表" 吓住,ECharts 的基础用法其实很简单。拿最常用的折线图举例,只需 3 步:初始化实例、写配置项、渲染图表。
3.1 第一个折线图:代码拆解
在app.js里写如下代码:
javascript
// 等DOM加载完再初始化,避免找不到容器
document.addEventListener('DOMContentLoaded', function () {
// 1. 初始化图表实例:绑定容器
var chart = echarts.init(document.getElementById('chart'));
// 2. 写配置项:图表的"说明书"
var option = {
title: {
text: '月度销售量折线图' // 图表标题
},
tooltip: {}, // 鼠标悬停显示详情(默认样式就够用)
legend: {
data: ['销售量'] // 图例:对应series里的name
},
xAxis: { // X轴:类目轴(比如月份、名称)
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月']
},
yAxis: { // Y轴:数值轴(比如数量、金额)
type: 'value'
},
series: [ // 数据系列:图表的"肉"
{
name: '销售量', // 和legend的data对应
type: 'line', // 图表类型:折线图
data: [5, 20, 36, 10, 10, 20] // 具体数据
}
]
};
// 3. 渲染图表:把配置"喂"给实例
chart.setOption(option);
});
运行后会看到一个带标题、图例和交互提示的折线图 ------ 这就是 ECharts 的核心逻辑:用 option 配置项描述图表, setOption 渲染。
3.2 配置项小技巧:别死记硬背
option里的属性看似多,其实有规律:
- 「全局设置」:title(标题)、tooltip(提示框)、legend(图例)等,控制图表整体样式;
- 「坐标轴」:xAxis和yAxis,折线图、柱状图这类 "有轴图表" 必须有;
- 「数据系列」:series是重点,type字段决定图表类型(line折线、bar柱状、pie饼图等),data放具体数值。
需要啥功能,直接查ECharts 配置项手册,不用硬背。
4. 复杂图表实战:3 个高频场景详解
基础图表不够用?ECharts 的 "高级功能" 才是真本事。下面 3 个场景是实际开发中最常遇到的,吃透了能解决 80% 的需求。
4.1 混合图表:一个图里放多种类型数据
有时候需要对比 "销售量"(柱状)和 "目标完成率"(折线),这时 "混合图表" 就派上用场了 ------ 在series里放多个不同type的数据系列就行:
css
document.addEventListener('DOMContentLoaded', function () {
var chart = echarts.init(document.getElementById('chart'));
var option = {
title: {
text: '销售与目标对比图'
},
tooltip: {
trigger: 'axis' // 按轴触发:鼠标放X轴上,同列数据都显示
},
legend: {
data: ['销售量', '目标量'] // 两个系列对应两个图例
},
xAxis: [
{
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月']
}
],
yAxis: [
{ // 第一个Y轴:对应销售量(柱状)
type: 'value',
name: '销售量',
axisLabel: { formatter: '{value} 件' } // 加单位
},
{ // 第二个Y轴:对应目标量(折线),避免数值范围差异大
type: 'value',
name: '目标量',
position: 'right', // 放右边
axisLabel: { formatter: '{value} 件' }
}
],
series: [
{
name: '销售量',
type: 'bar', // 柱状图
data: [5, 20, 36, 10, 10, 20]
},
{
name: '目标量',
type: 'line', // 折线图
yAxisIndex: 1, // 绑定到第二个Y轴
data: [10, 15, 30, 25, 20, 30]
}
]
};
chart.setOption(option);
});
关键是用yAxisIndex指定系列对应哪个 Y 轴 ------ 如果两个数据数值范围差太多(比如一个是 "件",一个是 "万件"),分开坐标轴更清晰。
4.2 地图可视化:把数据 "画" 在地图上
做区域销售分布、用户地域统计时,地图可视化比表格直观 10 倍。ECharts 内置了中国地图和各省地图,直接用type: 'map'调用:
yaml
document.addEventListener('DOMContentLoaded', function () {
var chart = echarts.init(document.getElementById('chart'));
var option = {
title: {
text: '全国销售分布',
left: 'center' // 标题居中
},
tooltip: {
formatter: '{b}: {c} 单' // 自定义提示内容:省份名+数据
},
// 视觉映射:用颜色深浅表示数据大小
visualMap: {
min: 0,
max: 1000,
text: ['高', '低'],
calculable: true, // 可拖动调整范围
inRange: {
color: ['#e6f7ff', '#1890ff'] // 从浅蓝到深蓝
}
},
series: [
{
name: '订单量',
type: 'map',
mapType: 'china', // 地图类型:中国
roam: true, // 允许缩放、平移
label: {
show: true // 显示省份名称
},
data: [ // 数据格式:{name: 省份名, value: 数据}
{name: '北京', value: 500},
{name: '上海', value: 800},
{name: '广东', value: 1000},
{name: '江苏', value: 750},
{name: '浙江', value: 600}
]
}
]
};
chart.setOption(option);
});
如果需要市级地图,得额外引入对应地图的 JSON 数据(ECharts 官网有下载),但省级及以上直接用内置的mapType就够了。
4.3 图表联动:点一个图,另一个图跟着变
做 "总览 + 详情" 页面时,常需要 "点主图的 A 产品,详情图显示 A 的细分数据"。ECharts 的事件监听能轻松实现:
css
document.addEventListener('DOMContentLoaded', function () {
// 初始化两个图表:主图和详情图
var mainChart = echarts.init(document.getElementById('main-chart'));
var detailChart = echarts.init(document.getElementById('detail-chart'));
// 主图配置:展示各产品总销量(柱状)
var mainOption = {
title: { text: '产品总销量' },
xAxis: { type: 'category', data: ['A', 'B', 'C', 'D', 'E'] },
yAxis: { type: 'value' },
series: [{ type: 'bar', data: [100, 200, 150, 300, 250] }]
};
// 详情图配置:默认空,等主图点击后填充
var detailOption = {
title: { text: '产品细分销量' },
xAxis: { type: 'category', data: [] },
yAxis: { type: 'value' },
series: [{ type: 'line', data: [] }]
};
mainChart.setOption(mainOption);
detailChart.setOption(detailOption);
// 监听主图的点击事件
mainChart.on('click', function (params) {
// params里有点击的数据:比如name是'A'
// 模拟调接口拿细分数据(实际项目里换axios请求)
var detailData = {
'A': { categories: ['1月', '2月', '3月'], values: [30, 40, 30] },
'B': { categories: ['1月', '2月', '3月'], values: [50, 70, 80] },
'C': { categories: ['1月', '2月', '3月'], values: [40, 50, 60] },
'D': { categories: ['1月', '2月', '3月'], values: [80, 100, 120] },
'E': { categories: ['1月', '2月', '3月'], values: [60, 90, 100] }
}[params.name];
// 更新详情图数据
detailChart.setOption({
xAxis: { data: detailData.categories },
series: [{ data: detailData.values }]
});
});
});
核心是on('click', callback)监听事件,params参数里包含点击位置的信息(名称、数值等),拿到后更新另一个图表的option就行。
5. 自定义图表:让你的图表 "独一无二"
ECharts 默认样式不够用?从颜色到组件,都能按需求改。
5.1 改样式:从标题到数据项全自定义
小到标题颜色,大到柱状图的形状,都能在option里直接改:
css
var option = {
title: {
text: '自定义样式示例',
textStyle: {
color: '#ff7d00', // 标题颜色
fontSize: 22,
fontWeight: 'bold'
},
left: 'center' // 标题居中
},
xAxis: {
type: 'category',
data: ['A', 'B', 'C', 'D'],
axisLabel: {
color: '#666', // X轴文字颜色
rotate: 30 // 文字旋转30度,避免重叠
}
},
yAxis: { type: 'value' },
series: [{
type: 'bar',
data: [12, 34, 23, 45],
itemStyle: {
// 柱状图颜色:渐变
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#4c84ff' },
{ offset: 1, color: '#86b6ff' }
])
},
// 柱子圆角
itemStyle: { borderRadius: [4, 4, 0, 0] }
}]
};
重点看itemStyle:控制数据项的样式(柱状图的颜色、圆角,折线图的线条颜色等),甚至能写渐变、阴影,比 CSS 改样式还灵活。
5.2 自定义组件:实现 ECharts 没有的功能
如果 ECharts 内置组件不够用(比如加个 "数据筛选按钮"),可以用extendComponentModel和extendComponentView自定义组件。
举个简单例子:加一个 "只看 top3" 的筛选组件:
ini
// 1. 扩展组件模型:定义组件的配置和数据
echarts.extendComponentModel({
type: 'filterButton',
defaultOption: {
text: '只看top3',
position: 'right'
}
});
// 2. 扩展组件视图:定义组件怎么渲染、怎么交互
echarts.extendComponentView({
type: 'filterButton',
render: function (model, api) {
// 生成按钮DOM
var button = document.createElement('button');
button.innerText = model.get('text');
button.style.position = 'absolute';
button.style.right = '20px';
button.style.top = '20px';
button.style.padding = '4px 8px';
// 按钮点击事件:筛选数据
button.onclick = function () {
var chart = api.getChart();
var option = chart.getOption();
// 取数据前3名
var top3Data = option.series[0].data
.map((val, idx) => ({ val, idx }))
.sort((a, b) => b.val - a.val)
.slice(0, 3);
// 更新图表
chart.setOption({
series: [{ data: top3Data.map(item => item.val) }],
xAxis: { data: top3Data.map(item => option.xAxis[0].data[item.idx]) }
});
};
// 把按钮加到图表容器里
api.getDom().appendChild(button);
}
});
// 使用自定义组件
var chart = echarts.init(document.getElementById('chart'));
var option = {
title: { text: '带筛选按钮的图表' },
xAxis: { type: 'category', data: ['</doubaocanvas>