数据可视化 ECharts

一、数据可视化概述与主流库对比

数据可视化的核心是将冰冷的数字转化为直观图形,揭示数据规律,广泛应用于报表、大屏展示、业务监控等场景。目前主流的前端可视化库各有特点,需根据项目需求选择:

可视化库 核心特点 上手难度 适用场景 开源协议 / 商用情况
ECharts 百度出品,基于 Canvas,图表类型丰富(含地图、水球图),配置化开发,文档完善 企业级报表、大屏展示、常规图表(柱状图 / 折线图 / 饼图等) Apache-2.0 协议,免费商用
D3.js 底层可视化库,灵活性极高,可自定义任意图形 复杂自定义可视化(如学术图表、特殊交互图形) BSD 协议,免费商用
AntV(G2/G6) 蚂蚁金服出品,基于 SVG/Canvas,注重交互与数据驱动,生态完善(含图分析 G6) 中后台系统、数据中台、图可视化(如关系图) MIT 协议,免费商用
Highcharts 国外库,基于 SVG,兼容性好,图表美观 海外项目、对图表样式要求高的场景 非商用免费,商用需付费
ichartjs 国产轻量库,基于 Canvas,体积小 简单图表需求、轻量项目 开源免费

二、ECharts 核心使用流程(五分钟上手)

ECharts 采用 "配置化" 开发模式,核心步骤固定,所有功能通过 option 配置实现:

1. 基础流程(5 步)

  1. 引入 ECharts 文件

    • 本地引入:下载 ECharts 官网echarts.min.js,通过 <script> 标签引入。

    • CDN 引入:直接使用 BootCDN 等公共资源,示例: html

      预览

      复制代码
      <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
  2. 准备 DOM 容器必须为容器设置宽高(行内样式 / 外部 CSS 均可),否则图表无法渲染:

    html

    预览

    复制代码
    <div id="main" style="width: 800px; height: 500px;"></div>
  3. 初始化 ECharts 实例 通过 echarts.init() 绑定 DOM 容器,生成图表实例:

    javascript

    运行

    复制代码
    var myChart = echarts.init(document.getElementById('main'));
  4. 配置 option(核心) option 是一个 JSON 对象,包含图表的标题、坐标轴、数据、样式等所有配置,示例(柱状图):

    javascript

    运行

    复制代码
    var option = {
      title: { text: '商品销量统计' }, // 标题
      xAxis: { data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'] }, // X轴
      yAxis: {}, // Y轴(默认配置可省略)
      series: [ // 数据系列(决定图表类型)
        {
          name: '销量',
          type: 'bar', // 图表类型:bar=柱状图
          data: [5, 20, 36, 10, 10, 20]
        }
      ]
    };
  5. 渲染图表option 配置传入实例,完成渲染:

    javascript

    运行

    复制代码
    myChart.setOption(option);

2. ECharts 关键配置项解析

option 包含多个核心模块,需理解各模块的作用及常用属性:

配置模块 核心作用 常用属性
title 图表标题 text(标题文本)、subtext(副标题)、left/top(位置)、textStyle(文字样式)
tooltip 提示框(鼠标悬浮时显示) trigger(触发方式:axis= 坐标轴触发,item= 数据项触发)、formatter(自定义提示内容)
legend 图例(用于区分多系列数据) data(图例名称数组,需与 series.name 一致)、orient(排列方向:horizontal/vertical
grid 网格(控制折线图 / 柱状图的位置与大小) left/right/top/bottom(边距)、containLabel(是否包含坐标轴标签,避免标签被截断)
xAxis/yAxis 坐标轴(X 轴 / Y 轴) type(类型:category= 类目轴,value= 数值轴,time= 时间轴)、data(类目轴的选项数据)、axisLine(轴线样式)
series 数据系列(决定图表类型与数据) type(图表类型:bar= 柱状图,line= 折线图,pie= 饼图,radar= 雷达图等)、data(具体数据)、itemStyle(数据项样式)
color 调色盘 数组形式定义颜色,如 ['#FF6B6B', '#4ECDC4', '#45B7D1'],控制图表的默认颜色
toolbox 工具箱 提供 "下载图片""数据视图""重置" 等功能,示例:toolbox: { feature: { saveAsImage: {}, restore: {} } }

三、ECharts 常见图表实战(附代码)

1. 折线图(趋势分析)

适用于展示数据随时间的变化趋势(如月度销量、日活用户等):

html

预览

复制代码
<div id="lineChart" style="width: 800px; height: 500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('lineChart'));
var option = {
  title: { text: '月度销量趋势' },
  tooltip: { trigger: 'axis' }, // 坐标轴触发,显示整行数据
  legend: { data: ['销量', '产量'] }, // 多系列图例
  xAxis: {
    type: 'category',
    data: ['1月', '2月', '3月', '4月', '5月', '6月']
  },
  yAxis: { type: 'value' },
  series: [
    { name: '销量', type: 'line', data: [120, 190, 150, 230, 210, 250] },
    { name: '产量', type: 'line', data: [150, 220, 180, 260, 240, 280] }
  ]
};
myChart.setOption(option);
</script>

2. 饼图(占比分析)

适用于展示各部分占总体的比例(如用户来源、产品销量占比等):

html

预览

复制代码
<div id="pieChart" style="width: 800px; height: 500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('pieChart'));
var option = {
  title: { text: '用户访问来源', x: 'center' }, // 标题居中
  tooltip: {
    trigger: 'item',
    formatter: '{a} <br/>{b}: {c} ({d}%)' // 自定义提示:名称+数值+百分比
  },
  legend: {
    orient: 'vertical', // 垂直排列
    left: 'left', // 图例居左
    data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
  },
  series: [
    {
      name: '访问来源',
      type: 'pie',
      radius: '60%', // 饼图半径
      center: ['50%', '60%'], // 饼图位置(水平居中,垂直60%处)
      data: [
        { value: 335, name: '直接访问' },
        { value: 310, name: '邮件营销' },
        { value: 234, name: '联盟广告' },
        { value: 135, name: '视频广告' },
        { value: 1548, name: '搜索引擎' }
      ]
    }
  ]
};
myChart.setOption(option);
</script>

3. 雷达图(多维度对比)

适用于多维度数据对比(如用户能力评分、产品性能评估等):

html

预览

复制代码
<div id="radarChart" style="width: 800px; height: 500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('radarChart'));
var option = {
  title: { text: '用户能力评估' },
  radar: [
    {
      indicator: [ // 维度指标(需包含名称和最大值)
        { text: '收益能力', max: 100 },
        { text: '风险控制', max: 100 },
        { text: '盘面感知', max: 100 },
        { text: '仓位控制', max: 100 },
        { text: '选股能力', max: 100 }
      ],
      radius: 150, // 雷达图半径
      shape: 'polygon' // 形状:polygon=多边形,circle=圆形
    }
  ],
  series: [
    {
      name: '用户评分',
      type: 'radar',
      data: [{ value: [85, 63, 37, 20, 84], name: '用户A' }],
      areaStyle: { color: 'rgba(78, 115, 223, 0.3)' } // 填充区域样式
    }
  ]
};
myChart.setOption(option);
</script>

4. 地图(地理数据展示)

适用于展示区域相关数据(如各省份销量、人口分布等),需注意跨域问题(需在服务器环境运行,或使用同源地图数据):

步骤:
  1. 获取地图数据 :从 阿里云数据可视化平台 下载对应区域的 JSON 数据(如中国地图 100000_full.json)。
  2. 注册地图 :通过 echarts.registerMap() 注册地图数据。
  3. 配置 geo 模块 :在 option 中添加 geo 配置,指定地图类型。
代码示例:

html

预览

复制代码
<div id="mapChart" style="width: 1000px; height: 600px;"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
var myChart = echarts.init(document.getElementById('mapChart'));
// 用 jQuery 加载地图数据(需服务器环境,避免跨域)
$.get('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json', function (mapData) {
  // 1. 注册地图
  echarts.registerMap('china', mapData);
  // 2. 配置地图
  var option = {
    backgroundColor: '#f5f5f5',
    geo: [
      {
        map: 'china', // 对应注册的地图名称
        label: {
          emphasis: { show: true, color: '#333' } // 鼠标悬浮时显示省份名称
        },
        itemStyle: {
          areaColor: '#e0f3ff', // 省份默认颜色
          borderColor: '#fff' // 省份边界颜色
        },
        emphasis: {
          itemStyle: { areaColor: '#4ECDC4' } // 鼠标悬浮时省份颜色
        }
      }
    ]
  };
  myChart.setOption(option);
});
</script>

5. 特殊图表:水球图(进度展示)

水球图需引入额外的扩展库 echarts-liquidfill.min.js,适用于展示进度(如完成率、使用率等):

步骤:
  1. 引入扩展库 :下载 echarts-liquidfillecharts-liquidfill.min.js 并引入。
  2. 配置 series 模块type 设为 liquidFill,指定数据。
代码示例:

html

预览

复制代码
<div id="liquidChart" style="width: 500px; height: 500px;"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/echarts-liquidfill/3.1.0/echarts-liquidfill.min.js"></script>
<script>
var myChart = echarts.init(document.getElementById('liquidChart'));
var option = {
  series: [
    {
      type: 'liquidFill',
      data: [0.6, 0.5, 0.4], // 水球层数与进度(0.6=60%)
      radius: '70%',
      shape: 'diamond', // 形状:diamond=菱形,circle=圆形
      label: {
        formatter: '60%', // 显示进度文本
        fontSize: 36,
        color: '#333'
      }
    }
  ]
};
myChart.setOption(option);
</script>

四、ECharts 进阶功能

1. 图表交互(点击 / 拖拽)

(1)点击事件

通过 myChart.on('click', callback) 监听图表点击,实现数据下钻等功能:

javascript

运行

复制代码
// 监听柱状图点击,切换为该月份的上旬/中旬/下旬数据
myChart.on('click', function (params) {
  // params 包含点击的系列、数据索引等信息
  var monthIndex = params.dataIndex; // 点击的月份索引
  var tenDayData = [ // 上旬/中旬/下旬数据
    [300, 200, 150], [250, 180, 120], [320, 220, 180],
    [280, 190, 160], [350, 250, 200], [310, 210, 170]
  ];
  // 更新 option 数据并重新渲染
  myChart.setOption({
    xAxis: { data: ['上旬', '中旬', '下旬'] },
    series: [{ data: tenDayData[monthIndex] }]
  });
});
(2)窗口自适应

通过 window.onresize 监听窗口大小变化,调用 myChart.resize() 实现图表自适应:

javascript

运行

复制代码
window.onresize = function () {
  myChart.resize(); // 图表随窗口缩放
};

2. 动态数据更新

通过 myChart.setOption(option, true) 实时更新数据(如仪表盘动态刷新):

html

预览

复制代码
<div id="gaugeChart" style="width: 500px; height: 500px;"></div>
<script>
var myChart = echarts.init(document.getElementById('gaugeChart'));
var option = {
  series: [
    {
      type: 'gauge',
      name: '完成率',
      detail: { formatter: '{value}%' },
      data: [{ value: 30, name: '业务指标' }]
    }
  ]
};
myChart.setOption(option);

// 每2秒更新一次数据(随机值)
setInterval(function () {
  var randomValue = (Math.random() * 100).toFixed(2); // 0-100的随机数
  option.series[0].data[0].value = randomValue;
  myChart.setOption(option, true); // 强制更新数据
}, 2000);
</script>

3. 大屏展示优化

大屏场景下,需注意以下优化点:

  • 分辨率适配 :使用 vw/vh 单位设置容器大小,或通过 resize 事件动态调整。
  • 性能优化 :减少不必要的动画(如 animation: false),复杂图表使用 "增量更新" 而非全量重绘。
  • 样式统一 :通过 color 调色盘统一图表颜色,配合大屏背景色(如深色背景用亮色图表)。

五、其他可视化库简介(以 AntV G2 为例)

AntV 是蚂蚁金服推出的企业级数据可视化解决方案,其中 G2(Graph Visualization 2.0)是基于 "图形语法" 设计的可视化库,核心优势是 "数据驱动" 和 "高可定制性",适合中后台系统、数据中台等场景,与 ECharts 形成互补。

1. G2 核心特点

  • 图形语法驱动:基于 Leland Wilkinson 的《The Grammar of Graphics》,通过组合 "数据""标记""编码" 等基础元素,可灵活构建任意图表,而非局限于预设类型。
  • 数据驱动:强调 "数据与图形分离",修改数据后图表自动更新,无需手动调整样式。
  • 轻量高效:核心包体积小(约 40KB gzip 后),支持按需引入,性能优于 ECharts 复杂场景。
  • 生态整合:与 Ant Design(前端 UI 库)、G6(图分析库)、F2(移动端可视化库)无缝衔接,适合企业级技术栈。

2. G2 快速上手(3 步)

(1)引入 G2
  • CDN 引入

    html

    预览

    复制代码
    <script src="https://cdn.jsdelivr.net/npm/@antv/g2@4.2.10/dist/g2.min.js"></script>
  • npm 引入 (工程化项目):

    bash

    复制代码
    npm install @antv/g2 --save

    javascript

    运行

    复制代码
    import { Chart } from '@antv/g2';
(2)准备 DOM 容器

与 ECharts 类似,需指定宽高:

html

预览

复制代码
<div id="g2-container" style="width: 800px; height: 500px;"></div>
(3)核心代码(绘制柱状图)

G2 遵循 "创建图表 → 载入数据 → 定义图形语法 → 渲染" 的流程,示例:

javascript

运行

复制代码
// 1. 准备数据(JSON 格式,每一行对应一个数据项)
const data = [
  { genre: 'Sports', sold: 275 },
  { genre: 'Strategy', sold: 115 },
  { genre: 'Action', sold: 120 },
  { genre: 'Shooter', sold: 350 },
  { genre: 'Other', sold: 150 }
];

// 2. 创建 Chart 实例(绑定容器、设置尺寸)
const chart = new G2.Chart({
  container: 'g2-container', // DOM 容器 ID
  width: 800,
  height: 500,
  padding: [50, 50, 50, 50] // 上右下左内边距(避免标签被截断)
});

// 3. 载入数据
chart.data(data);

// 4. 定义图形语法(核心:标记类型 + 数据编码)
// - interval():标记类型为"矩形"(对应柱状图)
// - position('genre*sold'):x轴映射 genre 字段,y轴映射 sold 字段
chart.interval()
  .position('genre*sold')
  .color('genre', ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FECA57']) // 按 genre 字段着色
  .label('sold', { position: 'top' }); // 在柱子顶部显示 sold 数值

// 5. 渲染图表
chart.render();

3. G2 与 ECharts 核心差异

对比维度 ECharts AntV G2
设计理念 配置化(预设图表类型,通过 option 快速搭建) 图形语法(灵活组合元素,支持高度定制)
上手难度 低(文档直观,复制示例即可用) 中(需理解图形语法概念,适合有一定基础开发者)
定制能力 中等(复杂图表需修改源码或使用扩展) 高(可自定义任意标记、交互逻辑)
体积 较大(全量引入约 1MB+) 小(核心包约 40KB,按需引入更小)
适用场景 快速搭建常规图表(报表、大屏、演示) 复杂自定义可视化(中后台系统、数据产品)

六、总结与资源推荐

1. 核心总结

  • 工具选择:快速出活选 ECharts,复杂定制选 G2,学术 / 特殊图形选 D3.js。
  • ECharts 关键 :掌握 option 配置逻辑,重点理解 series(图表类型)、xAxis/yAxis(坐标轴)、tooltip(交互)三大模块。
  • 性能优化:复杂图表用 "离屏渲染""增量更新",避免频繁全量重绘;地图数据按需加载,避免一次性加载过大 JSON。
  • 交互设计:大屏场景减少冗余动画,聚焦核心数据;中后台场景增加 "筛选""钻取" 功能,提升数据探索效率。

2. 推荐资源

相关推荐
NoneSL3 小时前
Uniapp UTS插件开发实战:引入第三方SDK
前端·uni-app
揭开画皮3 小时前
5.数据分析Matplotlib(数据可视化)
信息可视化·数据挖掘·数据分析
trsoliu3 小时前
Claude Code Templates
前端·人工智能
wangpq3 小时前
使用rerender-spa-plugin在构建时预渲染静态HTML文件优化SEO
前端·javascript·vue.js
KongHen3 小时前
完美解决请求跨域问题
前端
前端开发爱好者3 小时前
弃用 uni-app!Vue3 的原生 App 开发框架来了!
前端·javascript·vue.js
再吃一根胡萝卜3 小时前
VS Code Ctrl+/ 注释失效:两套快速修复与冲突排查方案(含可复制配置)
前端
支付宝体验科技3 小时前
Rokid 许德刚确认出席 SEE Conf 2025,带来《AI + AR 的实践与趋势》演讲
前端
PairsNightRain3 小时前
React.lazy 和 suspense 如何使用?
前端·javascript·react.js