数据集

dataset 是一个专门用于管理数据的组件。虽然你可以在 series.data 中为每个系列设置数据,但我们建议从 ECharts 4 开始使用 dataset 来管理数据,以便数据可以被多个组件重用,并且便于“数据和配置”的分离。毕竟,数据是最常被更改的部分,而其他配置在运行时大多不会更改。

series 下定义 data

如果数据定义在 series 下,例如

option = {
  xAxis: {
    type: 'category',
    data: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      name: '2015',
      data: [89.3, 92.1, 94.4, 85.4]
    },
    {
      type: 'bar',
      name: '2016',
      data: [95.8, 89.4, 91.2, 76.9]
    },
    {
      type: 'bar',
      name: '2017',
      data: [97.7, 83.1, 92.5, 78.1]
    }
  ]
};
live

series 下定义 data 适用于对一些特殊数据结构(如“树”、“图”和大型数据)进行定制。然而,它不利于多个系列的数据共享以及基于原始数据对图表类型和系列进行映射排列。另一个缺点是,程序员总是需要首先将数据分成单独的系列(和类别)。

dataset 中定义 data

如果你在 dataset 中定义 data,则有以下优点

  • 遵循数据可视化的思想:(I)提供数据,(II)从数据到视觉的映射成为图表。
  • 将数据与其他配置分开。数据经常改变,而其他配置则不会。易于单独管理。
  • 数据可以被多个系列或组件重用,你不需要为每个系列创建大量数据的副本。
  • 支持更通用的数据格式,如二维数组、类数组等,避免用户在一定程度上转换数据格式。

这里是一个简单的 dataset 示例

option = {
  legend: {},
  tooltip: {},
  dataset: {
    // Provide a set of data.
    source: [
      ['product', '2015', '2016', '2017'],
      ['Matcha Latte', 43.3, 85.8, 93.7],
      ['Milk Tea', 83.1, 73.4, 55.1],
      ['Cheese Cocoa', 86.4, 65.2, 82.5],
      ['Walnut Brownie', 72.4, 53.9, 39.1]
    ]
  },
  // Declare an x-axis (category axis).
  // The category map the first column in the dataset by default.
  xAxis: { type: 'category' },
  // Declare a y-axis (value axis).
  yAxis: {},
  // Declare several 'bar' series,
  // every series will auto-map to each column by default.
  series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
};
live

或者尝试使用“类数组”格式

option = {
  legend: {},
  tooltip: {},
  dataset: {
    // Define the dimension of array. In cartesian coordinate system,
    // if the type of x-axis is category, map the first dimension to
    // x-axis by default, the second dimension to y-axis.
    // You can also specify 'series.encode' to complete the map
    // without specify dimensions. Please see below.

    dimensions: ['product', '2015', '2016', '2017'],
    source: [
      { product: 'Matcha Latte', '2015': 43.3, '2016': 85.8, '2017': 93.7 },
      { product: 'Milk Tea', '2015': 83.1, '2016': 73.4, '2017': 55.1 },
      { product: 'Cheese Cocoa', '2015': 86.4, '2016': 65.2, '2017': 82.5 },
      { product: 'Walnut Brownie', '2015': 72.4, '2016': 53.9, '2017': 39.1 }
    ]
  },
  xAxis: { type: 'category' },
  yAxis: {},
  series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
};
live

从数据映射到图表

数据可视化的思路:(一)提供数据,(二)从数据映射到可视化,成为图表。

简而言之,您可以设置这些映射配置

  • 指定 dataset 的“列”或“行”来映射 series。您可以使用 series.seriesLayoutBy 来配置它。默认情况下,按列映射。
  • 指定维度映射的规则:如何从 'dataset' 的维度映射到 axistooltiplabelvisualMap。要配置映射,请使用 series.encodevisualMap。前一个案例没有给出映射配置,因此 ECharts 将遵循默认值:如果 x 轴是类目,则映射到 dataset.source 中的第一行;三列图表逐个映射到 dataset.source 中的每一行。

配置的详细信息如下所示

dataset 的行或列映射到 series

有了数据集,您可以灵活地配置数据如何映射到轴和系列。

你可以使用 seriesLayoutBy 更改图表中行和列的理解方式。seriesLayoutBy 可以是

  • 'column':默认值。系列放置在 dataset 的列上方。
  • 'row':系列放置在 dataset 的行上方。

检查此案例

option = {
  legend: {},
  tooltip: {},
  dataset: {
    source: [
      ['product', '2012', '2013', '2014', '2015'],
      ['Matcha Latte', 41.1, 30.4, 65.1, 53.3],
      ['Milk Tea', 86.5, 92.1, 85.7, 83.1],
      ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4]
    ]
  },
  xAxis: [
    { type: 'category', gridIndex: 0 },
    { type: 'category', gridIndex: 1 }
  ],
  yAxis: [{ gridIndex: 0 }, { gridIndex: 1 }],
  grid: [{ bottom: '55%' }, { top: '55%' }],
  series: [
    // These series will show in the first coordinate, each series map a row in dataset.
    { type: 'bar', seriesLayoutBy: 'row' },
    { type: 'bar', seriesLayoutBy: 'row' },
    { type: 'bar', seriesLayoutBy: 'row' },
    // These series will show in the second coordinate, each series map a column in dataset.
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 }
  ]
};
live

配置的效果显示在 此案例 中。

维度

常用图表中描述的大部分数据都是“二维表格”结构,在前一个案例中,我们使用一个二维数组来包含一个二维表格。现在,当我们将一个系列映射到一个列时,该列被称为“维度”,每一行被称为“项”,反之亦然。

维度可以有自己的名称在图表中显示。维度名称可以在第一列(行)中定义。在前一个案例中,'score''amount''product' 是维度的名称。实际数据从第二行开始。ECharts 会自动检查 dataset.source 中的第一列(行)是否包含维度名称。你还可以使用 dataset.sourceHeader: true 来声明第一列(行)表示维度名称。

尝试使用单个 dataset.dimensions 或一些 series.dimensions 来定义维度,因此你可以同时指定名称和类型。

var option1 = {
  dataset: {
    dimensions: [
      { name: 'score' },
      // can be abbreviated as 'string', to indicate dimension name 。
      'amount',
      // Specify dimensions in 'type'.
      { name: 'product', type: 'ordinal' }
    ],
    source: []
  }
  // ...
};

var option2 = {
  dataset: {
    source: []
  },
  series: {
    type: 'line',
    // series.dimensions will cover the config in dataset.dimension
    dimensions: [
      null, // use null if you do not want dimension name.
      'amount',
      { name: 'product', type: 'ordinal' }
    ]
  }
  // ...
};

在大多数情况下,您无需定义维度类型,因为 ECharts 会自动判断。如果判断不准确,您可以手动定义。

维度类型可以是以下值

  • 'number':默认,正常数据。
  • 'ordinal':字符串类型数据,如类别、文本,仅可与维度类型“ordinal”一起在轴上使用。ECharts 会尝试自动判断此类型,但可能不准确,因此您可以手动指定。
  • 'time':要表示时间数据,如果维度类型定义为 'time',ECharts 可以自动将数据分析为时间戳。例如,ECharts 将自动分析此维度的值是否为“2017-05-10”。如果维度用作时间轴(axis.type = 'time'),则维度类型也将为 'time'。有关更多时间类型支持,请参见 data
  • 'float':使用 TypedArray 优化 'float' 维度的性能。
  • 'int':使用 TypedArray 优化 'int' 维度的性能。

从数据到图表(series.encode)的映射

了解维度概念后,您可以使用 series.encode 进行映射

var option = {
  dataset: {
    source: [
      ['score', 'amount', 'product'],
      [89.3, 58212, 'Matcha Latte'],
      [57.1, 78254, 'Milk Tea'],
      [74.4, 41032, 'Cheese Cocoa'],
      [50.1, 12755, 'Cheese Brownie'],
      [89.7, 20145, 'Matcha Cocoa'],
      [68.1, 79146, 'Tea'],
      [19.6, 91852, 'Orange Juice'],
      [10.6, 101852, 'Lemon Juice'],
      [32.7, 20112, 'Walnut Brownie']
    ]
  },
  xAxis: {},
  yAxis: { type: 'category' },
  series: [
    {
      type: 'bar',
      encode: {
        // Map "amount" column to x-axis.
        x: 'amount',
        // Map "product" row to y-axis.
        y: 'product'
      }
    }
  ]
};
live

series.encode 声明的基本结构

  • 冒号的左边:轴或标签的特定名称。
  • 冒号的右边:维度名称(字符串)或数字(int,从 0 开始计数),以指定一个或多个维度(使用数组)。

通常,无需定义以下信息。根据需要填写。

series.encode 建议的属性

// Supported in every coordinate and series:
encode: {
  // Display the value of dimension named "product" and "score" in tooltip.
  tooltip: ['product', 'score']
  // Connect dimension name of "Dimension 1" and "Dimension 3" as the series name. (Avoid to repeat longer names in series.name)
  seriesName: [1, 3],
  // Means to use the value in "Dimension 2" as the id. It makes the new and old data correspond by id
	// when using setOption to update data, so that it can show animation properly.
  itemId: 2,
  // The itemName will show in the legend of Pie Charts.
  itemName: 3
}

// Grid/cartesian coordinate unique configs:
encode: {
  // Map "Dimension 1", "Dimension 5" and "dimension named 'score'" to x-axis:
  x: [1, 5, 'score'],
  // Map "Dimension 0" to y-axis:
  y: 0
}

// singleAxis unique configs:
encode: {
  single: 3
}

// Polar coordinate unique configs:
encode: {
  radius: 3,
  angle: 2
}

// Geo-coordinate unique configs:
encode: {
  lng: 3,
  lat: 2
}

// For some charts without coordinate like pie chart, funnel chart:
encode: {
  value: 3
}

这是一个更丰富的 series.encode 示例。

默认 series.encode

值得一提的是,如果未指定 series.encode,ECharts 将对某些通用图表(折线图、柱状图、散点图、蜡烛图等)使用一些默认映射规则。默认规则是

  • 在坐标系中(例如笛卡尔坐标系、极坐标系)
    • 如果存在分类轴 (axis.type = 'category'),将第一列(行)映射到该轴,并将每列(行)映射到每个系列。
    • 如果两个轴都不是分类轴,则将一个系列中的每两列映射到两个轴。
  • 无轴(例如饼图)
    • 使用第一列(行)作为名称,第二列(行)作为值。如果只有一列(行),ECharts 不会设置名称。

虽然默认规则无法满足要求,但你可以自行配置 encode,这并不复杂。这是一个 示例

series.encode 的一些常规设置

问:如何将第 3 列设置为 x 轴,第 5 列设置为 y 轴?

option = {
  series: {
    // dimensionIndex count from 0, so the 3rd line is dimensions[2].
    encode: { x: 2, y: 4 }
    // ...
  }
};

问:如何将第 3 行设置为 x 轴,第 5 行设置为 y 轴?

option = {
  series: {
    encode: { x: 2, y: 4 },
    seriesLayoutBy: 'row'
    // ...
  }
};

问:如何将第 2 列设置为标签?

答:我们现在支持从特定维度追踪 label.formatter 的值

series: {
  label: {
    // `'{@score}'` means the value in the dimension named "score".
    // `'{@[4]}'` means the value in dimension 4.
    formatter: 'aaa{@product}bbb{@score}ccc{@[4]}ddd';
  }
}

问:如何在工具提示中显示第 2 列和第 3 列?

option = {
  series: {
    encode: {
      tooltip: [1, 2]
      // ...
    }
    // ...
  }
};

问:如果维度名称未包含在数据集中,该如何定义?

var option = {
  dataset: {
    dimensions: ['score', 'amount'],
    source: [
      [89.3, 3371],
      [92.1, 8123],
      [94.4, 1954],
      [85.4, 829]
    ]
  }
};

问:如何将第 3 列映射到散点图的大小?

var option = {
  dataset: {
    source: [
      [12, 323, 11.2],
      [23, 167, 8.3],
      [81, 284, 12],
      [91, 413, 4.1],
      [13, 287, 13.5]
    ]
  },
  visualMap: {
    show: false,
    dimension: 2, // means the 3rd column
    min: 2, // lower bound
    max: 15, // higher bound
    inRange: {
      // Size of the bubble.
      symbolSize: [5, 60]
    }
  },
  xAxis: {},
  yAxis: {},
  series: {
    type: 'scatter'
  }
};
live

问:我在 encode 中指定了一个映射,为什么不起作用?

答:检查你的拼写,例如在 encode 中将维度名称 'Life Expectancy' 拼写错误为 'Life Expectency'

视觉通道映射

我们可以使用 visualMap 映射视觉通道。在 visualMap 文档中查看详细信息。这是一个 示例

图表格式

在大多数常规图表中,数据适合以二维表格的形式描述。像“MS Excel”和“Numbers”这样的知名软件都使用二维表格。它们的数据可以导出为 JSON 格式并输入到 dataset.source 中,并避免一些数据处理步骤。

你可以使用 dsvPapaParse 等工具将 .csv 文件转换为 JSON。

如后面的示例所示,在 JavaScript 的数据传输中,二维数据可以直接通过二维数组存储。

除了二维数组,数据集还支持使用键值对,这也是一种常见的方式。但是,我们目前不支持此格式中的 seriesLayoutBy

dataset: [
  {
    // column by column key-value array is a normal format
    source: [
      { product: 'Matcha Latte', count: 823, score: 95.8 },
      { product: 'Milk Tea', count: 235, score: 81.4 },
      { product: 'Cheese Cocoa', count: 1042, score: 91.2 },
      { product: 'Walnut Brownie', count: 988, score: 76.9 }
    ]
  },
  {
    // row by row key-value
    source: {
      product: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'],
      count: [823, 235, 1042, 988],
      score: [95.8, 81.4, 91.2, 76.9]
    }
  }
];

如何引用多个数据集

ECharts 支持同时定义多个数据集。系列可以通过 series.datasetIndex 分配要引用的数据集。例如

var option = {
  dataset: [
    {
      // 1st Dataset
      source: []
    },
    {
      // 2nd Dataset
      source: []
    },
    {
      // 3rd Dataset。
      source: []
    }
  ],
  series: [
    {
      // Use 2nd dataset
      datasetIndex: 1
    },
    {
      // Use 1st dataset
      datasetIndex: 0
    }
  ]
};

ECharts 3 中的 series.data

ECharts 4 仍然支持 ECharts 3 中的数据声明方式。如果系列已经声明了 series.data,则使用 series.data 而不是 dataset

option = {
  xAxis: {
    type: 'category',
    data: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      name: '2015',
      data: [89.3, 92.1, 94.4, 85.4]
    },
    {
      type: 'bar',
      name: '2016',
      data: [95.8, 89.4, 91.2, 76.9]
    },
    {
      type: 'bar',
      name: '2017',
      data: [97.7, 83.1, 92.5, 78.1]
    }
  ]
};

事实上,series.data 是一种重要的设置方法,它将始终存在。一些特殊的非表格格式图表,如 treemapgraphlines,仍然无法在数据集中编辑,你仍然需要使用 series.data。另一种方式是,对于渲染海量数据(超过一百万),你需要使用 dataset 不支持的 appendData

其他

以下图表现在支持数据集:linebarpiescattereffectScatterparallelcandlestickmapfunnelcustom。ECharts 将在未来支持更多图表。

最后,这里是一个 示例,其中多个图表共享一个 dataset,并具有联动交互。

贡献者 在 GitHub 上编辑此页面

plainheart plainheartpissang pissangOvilia Ovilia100pah 100pahBruce20190410 Bruce20190410simonmcconnell simonmcconnell