数据集

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

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]
    }
  ]
};
实时

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

dataset 中定义 data

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

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

这是一个简单的 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' }]
};
实时

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

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' }]
};
实时

从数据映射到图表

数据可视化的思想:(一)提供数据,(二)将数据映射到视觉以成为图表。

简而言之,你可以设置以下映射配置

  • 指定 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', xAxisIndex: 0, yAxisIndex: 0 },
    { type: 'bar', seriesLayoutBy: 'row', xAxisIndex: 0, yAxisIndex: 0 },
    { type: 'bar', seriesLayoutBy: 'row', xAxisIndex: 0, yAxisIndex: 0 },
    // These series will show in the second coordinate, each series map a column in dataset.
    { type: 'bar', seriesLayoutBy: 'column', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', seriesLayoutBy: 'column', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', seriesLayoutBy: 'column', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', seriesLayoutBy: 'column', xAxisIndex: 1, yAxisIndex: 1 }
  ]
};
实时

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

维度

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

维度可以有自己的名称以在图表中显示。维度名称可以在第一列(行)中定义。在下一个案例中,'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 可以自动将数据分析为时间戳。例如,如果此维度的数据是“2017-05-10”,ECharts 将自动分析。如果维度用作时间轴(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'
      }
    }
  ]
};
实时

series.encode 声明的基本结构

  • 冒号左侧:坐标轴或标签的特定名称。
  • 冒号右侧:维度名称(字符串)或数字(整数,从 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 将对一些通用图表(折线图、柱状图、散点图、K 线图等)使用一些默认的映射规则。默认规则是

  • 在坐标系中(例如笛卡尔坐标系、极坐标系)
    • 如果存在类别轴(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'
  }
};
实时

问:我在编码中指定了映射,为什么它不起作用?

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

视觉通道映射

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

图表格式

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

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

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

除了二维数组之外,dataset 也支持使用键值对(key-value)的方式,这也是一种常用的方式。然而,我们目前不支持在这种格式中使用 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,仍然不能在 dataset 中进行编辑,您仍然需要使用 series.data。另一方面,对于渲染大量数据(超过一百万)的情况,您需要使用 appendData,而 dataset 不支持此方法。

其他

以下图表目前支持 dataset:linebarpiescattereffectScatterparallelcandlestickmapfunnelcustom。ECharts 未来将支持更多图表。

最后,这里有一个多个图表共享一个 dataset 并进行联动交互的示例

贡献者 在 GitHub 上编辑此页面

plainheart plainheartpissang pissangOvilia Ovilia100pah 100pahHertz-Hu Hertz-HuBruce20190410 Bruce20190410YuanyeChi YuanyeChisimonmcconnell simonmcconnell