ECharts 数据集(dataset)(千字长文)

ECharts 数据集(dataset):让数据与图表真正“对上号”

在使用 ECharts 进行数据可视化时,你是否遇到过这样的问题:明明数据没错,图表却显示异常?或者,每次更换图表类型,都要重写一遍 series 配置,代码重复率高,维护困难?这背后,往往是因为没有用好 ECharts 的核心功能之一——数据集(dataset)。

ECharts 数据集(dataset)是 ECharts 4.0 版本引入的一项强大特性,它让数据与图表的绑定变得更清晰、更灵活。你可以把它想象成一个“数据仓库”,所有原始数据都先存进去,然后由不同的图表“按需取用”。这样一来,同一个数据源可以支撑多个不同类型的图表,而无需重复定义数据结构。

今天,我们就来深入聊聊这个让 ECharts 使用体验跃升的关键功能。

什么是 ECharts 数据集(dataset)?

简单来说,dataset 是 ECharts 中用于集中管理原始数据的容器。它独立于 series 存在,可以理解为“数据的源头”。当你在图表中使用 dataset 时,ECharts 会自动从这个数据集中读取数据,并根据 series 的配置进行映射和渲染。

在没有 dataset 之前,我们通常需要在每个 series 中手动写入 data 数组,这导致数据冗余、维护困难。而引入 dataset 后,数据只需定义一次,多个图表可以共享同一个数据源。

举个例子:你有一组月度销售数据,想同时画出柱状图和折线图。没有 dataset 时,你得在两个 series 中分别写一遍数据;有了 dataset,只需定义一次,两个图表都能直接引用。

创建数组与初始化

我们先从最基础的开始:如何定义一个 dataset。在 ECharts 的配置中,datasetoption 对象的一个顶层属性。

option = {
  // 数据集定义
  dataset: {
    // 1. 用 source 属性定义原始数据
    source: [
      ['月份', '销售额', '利润'],
      ['1月', 120, 30],
      ['2月', 150, 40],
      ['3月', 130, 35],
      ['4月', 180, 50],
      ['5月', 200, 60]
    ]
  },
  // 图表系列配置
  series: [
    {
      type: 'bar',
      // 2. 通过 dimensions 指定数据维度
      dimensions: ['月份', '销售额', '利润'],
      // 3. 通过 encode 映射数据到坐标轴
      encode: {
        x: '月份',
        y: '销售额'
      }
    },
    {
      type: 'line',
      dimensions: ['月份', '销售额', '利润'],
      encode: {
        x: '月份',
        y: '利润'
      }
    }
  ]
};

代码注释说明

  • dataset.source:这是数据集的核心,它是一个二维数组,第一行是列名(维度名),后续行是具体数据。这种结构类似于 Excel 表格。
  • dimensions:在 series 中定义,用于告诉 ECharts 哪些列是“销售额”、“利润”等,它和 source 的列名对应。
  • encode:告诉 ECharts 如何把数据映射到图表的坐标轴上。x 对应横轴,y 对应纵轴。
  • 两个 series 共享同一个 dataset,但分别映射不同的数据列,实现“一源多图”。

从数据源到图表的映射过程

理解 dataset 的映射机制是用好它的关键。我们可以把它想象成“数据管道”:

  1. 数据源输入dataset.source 提供原始数据。
  2. 维度定义dimensions 告诉 ECharts 每一列的含义。
  3. 坐标映射encode 将特定列绑定到 xy 轴。
  4. 图表渲染:ECharts 根据映射结果,自动绘制出对应图形。

这个过程就像把一筐水果(数据)放进一个分类盒(dataset),然后告诉厨师(series):“左边那堆苹果给蛋糕用,右边那堆香蕉给果汁用”,而不需要重复搬水果。

下面是一个更复杂的例子,展示如何用 dataset 处理多维数据:

option = {
  dataset: {
    source: [
      ['城市', '2023年', '2024年', '增长率'],
      ['北京', 1500, 1800, 20],
      ['上海', 1400, 1700, 21.4],
      ['广州', 1200, 1400, 16.7],
      ['深圳', 1300, 1600, 23.1]
    ]
  },
  xAxis: {
    type: 'category'
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      type: 'bar',
      dimensions: ['城市', '2023年', '2024年', '增长率'],
      encode: {
        x: '城市',
        y: '2024年'
      },
      name: '2024年销售额'
    },
    {
      type: 'line',
      dimensions: ['城市', '2023年', '2024年', '增长率'],
      encode: {
        x: '城市',
        y: '增长率'
      },
      name: '增长率'
    }
  ]
};

这个例子中,dataset 包含了多个维度,两个 series 分别展示“2024年销售额”和“增长率”,实现了数据的复用。

支持多种数据格式:数组、对象、URL

dataset 不仅支持 source 数组格式,还支持对象格式和远程数据源,灵活性极高。

使用对象格式(推荐用于结构化数据)

dataset: {
  source: [
    { city: '北京', sales2023: 1500, sales2024: 1800, growth: 20 },
    { city: '上海', sales2023: 1400, sales2024: 1700, growth: 21.4 },
    { city: '广州', sales2023: 1200, sales2024: 1400, growth: 16.7 }
  ]
}

使用对象格式时,ECharts 会自动提取键名作为列名,无需手动写列标题。这种方式更符合现代开发习惯,尤其适合 JSON 数据源。

使用远程数据(通过 URL 加载)

dataset: {
  url: 'https://example.com/sales-data.json',
  // 可选:指定数据格式
  format: 'json'
}

当数据量大或需要动态加载时,url 非常有用。ECharts 会自动请求并解析 JSON 文件,然后作为数据源使用。

数据格式 适用场景 优点
数组(source) 小量静态数据 简单直观,便于调试
对象数组 结构化数据,API 返回 语义清晰,易维护
URL 大量数据、动态加载 减少初始包体积,实时更新

高级用法:数据转换与计算列

dataset 还支持数据转换,比如计算新列。通过 transform 配置,你可以在数据进入图表前进行加工。

dataset: {
  source: [
    ['城市', '2023年', '2024年'],
    ['北京', 1500, 1800],
    ['上海', 1400, 1700]
  ],
  // 数据转换配置
  transform: {
    // 定义一个新列:增长率 = (2024 - 2023) / 2023
    type: 'calculate',
    config: {
      expression: '(d[2] - d[1]) / d[1] * 100',
      as: '增长率'
    }
  }
},
series: [
  {
    type: 'bar',
    dimensions: ['城市', '2023年', '2024年', '增长率'],
    encode: {
      x: '城市',
      y: '增长率'
    }
  }
]

这里 transformexpression 是一个表达式,d[1] 表示第二列(2023年),d[2] 表示第三列(2024年),结果会自动添加为“增长率”列,供后续图表使用。

这个功能特别适合需要实时计算的场景,比如增长率、同比变化等。

实际应用建议

在实际项目中,我建议你这样使用 ECharts 数据集(dataset):

  1. 优先使用 dataset:除非数据极简单,否则不要在 series.data 中直接写数据。
  2. 统一数据源:多个图表共享一个 dataset,避免数据不一致。
  3. 使用对象格式:如果数据来自 API,建议用对象数组,代码更清晰。
  4. 善用 transform:复杂计算不要在前端手动处理,交给 dataset
  5. 配合 visualMap 使用:可以基于 dataset 中的列做颜色映射,提升可视化效果。

总结

ECharts 数据集(dataset)不是一个“可有可无”的功能,而是构建高质量可视化应用的基石。它让数据与图表的分离变得合理,让代码更简洁、维护更轻松。

通过本文的讲解,你应该已经掌握了 dataset 的核心用法:从定义数据源、映射维度,到支持远程加载和数据转换。下次当你再面对复杂图表需求时,不妨先思考:能不能用 dataset 来统一管理数据?

记住,好的可视化,从清晰的数据结构开始。而 ECharts 数据集(dataset),正是通往清晰之路的钥匙。