Echarts图表教程文档从入门到精通详解零基础快速上手掌握数据可视化核心技巧与实战案例
什么是ECharts以及为什么选择它
ECharts 是一个由百度开源,现由 Apache 基金会维护的强大 JavaScript 可视化库。它能够帮助开发者轻松地通过 Canvas 或 SVG 绘制交互性强、功能丰富的数据可视化图表。对于零基础的开发者来说,ECharts 最大的优势在于其“配置即所得”的理念——你只需要编写简单的 JSON 配置项,就能生成复杂的图表,而无需深入底层的绘图原理。
ECharts 的核心优势
- 丰富的图表类型:涵盖了折线图、柱状图、饼图、散点图、雷达图、K线图、热力图、地图等几乎所有常见的图表类型。
- 极低的上手门槛:官方文档详尽,示例丰富,只需引入 JS 文件即可开始开发。
- 强大的交互能力:支持数据区域缩放(dataZoom)、图例切换、值域漫游(visualMap)等高级交互。
- 跨平台兼容:基于 Canvas 渲染,兼容绝大多数现代浏览器,也能在移动端流畅运行。
环境搭建与基础入门
在开始编写代码之前,我们需要先将 ECharts 引入到项目中。这里有两种最常用的方式:通过 CDN 引入和通过 npm 安装。
1. 引入 ECharts
方式一:使用 CDN(推荐初学者)
这是最快的方式,直接在 HTML 文件中添加 script 标签即可。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>第一个 ECharts 图表</title> <!-- 引入 ECharts 文件 --> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script> </head> <body> <!-- 准备一个具备大小(宽高)的 DOM 容器 --> <div id="main" style="width: 600px;height:400px;"></div> <script type="text/javascript"> // 后续代码将写在这里 </script> </body> </html> 方式二:使用 npm(推荐 Vue/React 项目)
如果你正在使用 Vue、React 或 Angular 等现代前端框架,建议使用 npm 安装。
npm install echarts --save 在组件中引入:
import * as echarts from 'echarts'; 2. 初始化与绘制第一个图表
绘制一个 ECharts 图表通常遵循以下三个核心步骤:
- 获取 DOM 容器:找到页面上的
div元素。 - 初始化实例:通过
echarts.init()初始化一个图表实例。 - 设置配置项:编写
option对象并使用setOption设置给实例。
完整代码示例:绘制一个简单的柱状图
请将以下代码放入你的 HTML 文件中,即可看到效果。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts 基础柱状图</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script> </head> <body> <!-- 1. 准备容器 --> <div id="main" style="width: 800px;height:400px;"></div> <script type="text/javascript"> // 2. 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 3. 指定图表的配置项和数据 var option = { // 标题组件,包含主标题和副标题 title: { text: '简单柱状图', // 主标题 subtext: '零基础入门示例' // 副标题 }, // 提示框组件,用于显示数据详情 tooltip: {}, // 图例组件,展示了系列名称 legend: { data:['销量'] }, // X轴配置 xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, // Y轴配置,默认为数值轴 yAxis: {}, // 系列列表,每个系列通过 type 决定图表类型 series: [{ name: '销量', // 系列名称,与 legend 对应 type: 'bar', // 图表类型:bar 为柱状图 data: [5, 20, 36, 10, 10, 20] // 数据 }] }; // 4. 使用刚指定的配置项和数据显示图表 myChart.setOption(option); </script> </body> </html> ECharts 核心概念详解:解剖 Option 配置项
ECharts 的灵魂在于 option 对象。它是一个普通的 JavaScript 对象,描述了图表的所有外观和行为。理解 option 的结构是精通 ECharts 的关键。
1. 标题与提示框 (Title & Tooltip)
- Title: 位于画布顶部,用于展示图表的主题。
text: 主标题文本。subtext: 副标题文本。left: 标题位置(’auto’, ‘left’, ‘center’, ‘right’)。
- Tooltip: 鼠标悬浮在图表元素上时弹出的浮窗。
trigger: 触发类型。常用'item'(数据项图形触发,如饼图)或'axis'(坐标轴触发,如折线图)。formatter: 自定义提示框内容的格式化函数。
代码示例:自定义 Tooltip
option = { tooltip: { trigger: 'axis', // 使用回调函数自定义显示内容 formatter: function (params) { // params 是一个数组,包含当前触点的所有数据 let result = params[0].name + '<br/>'; params.forEach(item => { result += `${item.marker} ${item.seriesName}: ${item.value} 件<br/>`; }); return result; } }, // ... 其他配置 }; 2. 坐标轴 (Grid, xAxis, yAxis)
大多数图表都依赖于坐标系。
- Grid: 直角坐标系的绘图网格,定义了图表在容器中的位置(上下左右边距)。
- xAxis / yAxis: 定义坐标轴的类型、刻度、标签样式。
代码示例:双 Y 轴配置
option = { // 图例 legend: { data: ['蒸发量', '降水量'] }, // X轴 xAxis: { type: 'category', data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] }, // Y轴可以是数组,支持多个Y轴 yAxis: [ { type: 'value', name: '蒸发量', position: 'left', // 位于左侧 axisLabel: { formatter: '{value} ml' } }, { type: 'value', name: '降水量', position: 'right', // 位于右侧 axisLabel: { formatter: '{value} ml' } } ], series: [ { name: '蒸发量', type: 'bar', // 柱状图 yAxisIndex: 0, // 对应第一个Y轴 data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] }, { name: '降水量', type: 'line', // 折线图 yAxisIndex: 1, // 对应第二个Y轴 data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] } ] }; 3. 系列 (Series)
这是图表的数据部分,决定了图表的类型(type)和具体数值(data)。
type:'line'(折线),'bar'(柱状),'pie'(饼图),'scatter'(散点),'map'(地图) 等。data: 具体的数据数组。label: 图形上的文本标签,用于说明数据。
进阶技巧:让图表“活”起来
掌握了基础配置后,我们需要学习一些进阶技巧,使图表更具表现力和交互性。
1. 动态数据与异步加载
在实际项目中,数据通常来自后端 API。我们需要在获取数据后更新图表。
场景:模拟从服务器获取数据并更新图表。
// 1. 初始化空图表 var myChart = echarts.init(document.getElementById('main')); var option = { title: { text: '动态数据演示' }, xAxis: { data: [] }, yAxis: {}, series: [{ type: 'bar', data: [] }] }; myChart.setOption(option); // 2. 模拟异步请求 (setTimeout) setTimeout(function () { // 假设这是从后端拿到的数据 const backendData = { categories: ['A产品', 'B产品', 'C产品', 'D产品'], values: [120, 200, 150, 80] }; // 3. 更新图表配置 // ECharts 的 setOption 是合并操作,只更新变化的部分 myChart.setOption({ xAxis: { data: backendData.categories }, series: [{ data: backendData.values }] }); }, 2000); // 2秒后更新 2. 响应式图表(自适应容器大小)
当浏览器窗口大小改变时,图表往往不会自动调整大小。我们需要监听 resize 事件。
// 将初始化代码封装成函数 function initChart() { var myChart = echarts.init(document.getElementById('main')); // ... 设置 option ... return myChart; } var chartInstance = initChart(); // 监听窗口变化,调用 echarts 实例的 resize 方法 window.addEventListener('resize', function() { chartInstance.resize(); }); 3. 数据区域缩放 (DataZoom)
当数据量非常大(例如一年的每日数据)时,X轴会显得非常拥挤。dataZoom 组件可以实现数据的拖拽和缩放。
option = { title: { text: '大数据量缩放示例' }, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: Array.from({length: 100}, (_, i) => `Day ${i+1}`) // 生成100个数据点 }, yAxis: {}, // dataZoom 配置 dataZoom: [ { type: 'slider', // 滑动条型 dataZoom start: 0, // 默认显示起始位置 end: 20 // 默认显示结束位置(显示前20%的数据) }, { type: 'inside', // 内部型 dataZoom,支持鼠标滚轮缩放 start: 0, end: 20 } ], series: [{ type: 'line', data: Array.from({length: 100}, () => Math.floor(Math.random() * 1000)) }] }; 实战案例:构建一个交互式仪表盘
我们将结合以上知识点,构建一个包含折线图和饼图的综合仪表盘。
案例需求
- 左侧显示“用户来源分布”(饼图)。
- 右侧显示“近7日活跃用户趋势”(折线图)。
- 点击饼图扇区时,联动更新折线图数据(模拟)。
完整代码实现
<!DOCTYPE html> <html> <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> /* 使用 Flex 布局让两个图表并排 */ .container { display: flex; width: 100%; height: 500px; padding: 20px; box-sizing: border-box; } .chart-box { flex: 1; /* 各占一半 */ height: 100%; border: 1px solid #eee; margin: 5px; border-radius: 5px; } </style> </head> <body> <div class="container"> <div id="pieChart" class="chart-box"></div> <div id="lineChart" class="chart-box"></div> </div> <script type="text/javascript"> // 1. 初始化两个图表实例 var pieChart = echarts.init(document.getElementById('pieChart')); var lineChart = echarts.init(document.getElementById('lineChart')); // 2. 模拟数据 var sourceData = [ { value: 1048, name: '搜索引擎' }, { value: 735, name: '直接访问' }, { value: 580, name: '邮件营销' }, { value: 484, name: '联盟广告' } ]; // 3. 设置饼图配置 var pieOption = { title: { text: '用户来源', left: 'center' }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', left: 'left' }, series: [{ name: '访问来源', type: 'pie', radius: '50%', data: sourceData, emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } }] }; pieChart.setOption(pieOption); // 4. 设置折线图初始配置 var lineOption = { title: { text: '近7日活跃用户', left: 'center' }, tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [{ name: '活跃用户', type: 'line', smooth: true, // 平滑曲线 data: [150, 230, 224, 218, 135, 147, 260] // 默认数据 }] }; lineChart.setOption(lineOption); // 5. 实现联动交互 // 监听饼图的点击事件 pieChart.on('click', function (params) { // 模拟根据点击的扇区名称生成不同的折线数据 // 在实际项目中,这里会发送 AJAX 请求获取对应的数据 var newData = []; for (var i = 0; i < 7; i++) { // 简单的算法:根据名称生成随机数,模拟数据变化 newData.push(Math.floor(Math.random() * 300) + (params.name === '搜索引擎' ? 100 : 50)); } // 更新折线图 lineChart.setOption({ series: [{ data: newData }], title: { text: `近7日活跃用户 (${params.name})` } }); }); // 6. 响应式处理 window.addEventListener('resize', function() { pieChart.resize(); lineChart.resize(); }); </script> </body> </html> 总结与最佳实践
通过以上内容的学习,你已经从零基础跨越到了能够独立开发交互式图表的阶段。以下是最后的一些建议:
善用官方文档:ECharts 的官方文档非常完善,遇到不懂的配置项(如
visualMap、series-layout),第一时间查阅文档。性能优化:当数据量达到万级甚至十万级时,不要使用普通的折线图/柱状图,应改用 ECharts 提供的
large模式或 WebGL 版本的Apache ECharts GL。颜色搭配:避免使用过于刺眼的颜色。可以使用 ECharts 提供的
color调色盘,或者参考 Material Design 配色。按需引入:如果使用 npm 构建项目,建议按需引入模块以减小包体积。例如:
// 只引入柱状图和提示框组件 import * as echarts from 'echarts/core'; import { BarChart } from 'echarts/charts'; import { TooltipComponent } from 'echarts/components'; echarts.use([BarChart, TooltipComponent]);
掌握了这些核心技巧,你就能利用 ECharts 将枯燥的数据转化为生动、直观的可视化作品。祝你在数据可视化的道路上越走越远!
支付宝扫一扫
微信扫一扫