ECharts(二)

本文详细介绍了ECharts中如何使用数据集管理数据,如何在系列和数据集中设置数据,以及如何通过维度映射和series.encode实现数据到图形的灵活配置。特别关注了多个dataset的使用和不同图表类型的对应技巧。
摘要由CSDN通过智能技术生成

ECharts 数据集

  1. 数据集(dataset)是专门用来管理数据的组件。虽然每个系列都可以在 series.data 中设置数据,但是从 ECharts4 支持 数据集 开始,更推荐使用 数据集 来管理数据
  2. 数据可以被多个组件复用,也方便进行 “数据和其他配置” 分离的配置风格

ECharts 在系列中设置数据

  1. 在 系列(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]
        }
      ]
    };
    
  2. 在系列中设置数据的优点:

    1. 对一些特殊的数据结构(如“树”、“图”、超大数据)进行一定的数据类型定制
  3. 在系列中设置数据的缺点:

    1. 需要用户先处理数据,把数据分割设置到各个系列(和类目轴)中
    2. 不利于多个系列共享一份数据,也不利于基于原始数据进行图表类型、系列的映射安排

ECharts 在数据集中设置数据

  1. ECharts 在数据集(dataset)中设置数据的优点

    1. 贴近数据可视化常见思维方式:(I)提供数据,(II)指定数据到视觉的映射,从而形成图表
    2. 数据和其他配置可以被分离开来
    3. 数据可以被多个系列或者组件复用
    4. 支持更多的数据的常用格式,例如二维数组、对象数组等
  2. 简单的 dataset 的例子:

    option = {
      legend: {},
      tooltip: {},
      dataset: {
        // 提供一份数据。
        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]
        ]
      },
      // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
      xAxis: { type: 'category' },
      // 声明一个 Y 轴,数值轴。
      yAxis: {},
      // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
      series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
    };
    
  3. 使用常见的“对象数组”的格式:

    option = {
      legend: {},
      tooltip: {},
      dataset: {
        // 用 dimensions 指定了维度的顺序。直角坐标系中,如果 X 轴 type 为 category,
        // 默认把第一个维度映射到 X 轴上,后面维度映射到 Y 轴上。
        // 如果不指定 dimensions,也可以通过指定 series.encode,完成映射
        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' }]
    };
    

ECharts 把数据集( dataset )的行或列映射为系列(series)

  1. 数据可视化的常见思路是:(I)提供数据,(II)指定数据到视觉的映射。

  2. 可以使用seriesLayoutBy 配置项,改变图表对于行列的映射。

  3. seriesLayoutBy可取值:

    1. 'column': 默认值。系列被安放到 dataset 的列上面
    2. 'row': 系列被安放到 dataset 的行上面。
  4. 简单的样例

    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: [
        // 这几个系列会出现在第一个直角坐标系中,每个系列对应到 dataset 的每一行。
        { type: 'bar', seriesLayoutBy: 'row' },
        { type: 'bar', seriesLayoutBy: 'row' },
        { type: 'bar', seriesLayoutBy: 'row' },
        // 这几个系列会出现在第二个直角坐标系中,每个系列对应到 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 }
      ]
    };
    

ECharts 维度( dimension )

  1. 常用图表所描述的数据大部分是“二维表”结构

  2. 当把系列( series )对应到“列”的时候,那么每一列就称为一个“维度( dimension )”,而每一行称为数据项( item )

  3. 把系列( series )对应到表行,那么每一行就是“维度dimension )”,每一列就是数据项(item

  4. 维度可以有单独的名字,维度名( dimension name)可以在定义在 dataset 的第一行(或者第一列),从第二行开始,才是正式的数据

  5. dataset.source中第一行(列)到底包含不包含维度名,ECharts 默认会自动探测。

  6. 可以设置dataset.sourceHeader: true 显示声明第一行(列)就是维度或者 dataset.sourceHeader: false 表明第一行(列)开始就直接是数据。

  7. 维度的定义,也可以使用单独的dataset.dimensions或者series.dimensions来定义,可以同时指定维度名,和维度的类型( dimension type ):

    var option1 = {
      dataset: {
        dimensions: [
          { name: 'score' },
          // 可以简写为 string ,表示 dimension name 。
          'amount',
          // 可以在 type 中指定维度类型。
          { name: 'product', type: 'ordinal' }
        ],
        source: [
          //...
        ]
      }
      // ...
    };
    
    var option2 = {
      dataset: {
        source: [
          // ...
        ]
      },
      series: {
        type: 'line',
        // series.dimensions 会更优先于 dataset.dimension 采纳。
        dimensions: [
          null, // 可以设置为 null 表示不想设置维度名
          'amount',
          { name: 'product', type: 'ordinal' }
        ]
      }
      // ...
    };
    
  8. 维度类型( dimension type )可以取的值:

    1. 'number': 默认,表示普通数据
    2. 'ordinal': 对于类目、文本这些 string 类型的数据,如果需要能在数轴上使用,须是 'ordinal'类型。ECharts 默认会试图自动判断这个类型。但是自动判断也可能不准确,所以使用者也可以手动强制指定。
    3. 'time': 表示时间数据。设置成 ‘time’ 则能支持自动解析数据成时间戳(timestamp)
    4. 'float':如果设置成'float',在存储时候会使用 TypedArray,对性能优化有好处
    5. 'int': 如果设置成 'int',在存储时候会使用 TypedArray,对性能优化有好处。

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

  1. 使用 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: {
            // 将 "amount" 列映射到 X 轴。
            x: 'amount',
            // 将 "product" 列映射到 Y 轴。
            y: 'product'
          }
        }
      ]
    };
    
  2. series.encode 声明的基本结构如下:

    1. 冒号左边是坐标系、标签等特定名称,如'x', 'y', 'tooltip'
    2. 冒号右边是数据中的维度名(string 格式)或者维度的序号(number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)
  3. series.encode 支持的属性如下;

    // 在任何坐标系和系列中,都支持:
    encode: {
      // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示
      tooltip: ['product', 'score']
      // 使用 “维度 1” 和 “维度 3” 的维度名连起来作为系列名。(有时候名字比较长,这可以避免在 series.name 重复输入这些名字)
      seriesName: [1, 3],
      // 表示使用 “维度2” 中的值作为 id。这在使用 setOption 动态更新数据时有用处,可以使新老数据用 id 对应起来,从而能够产生合适的数据更新动画。
      itemId: 2,
      // 指定数据项的名称使用 “维度3” 在饼图等图表中有用,可以使这个名字显示在图例(legend)中。
      itemName: 3
    }
    
    // 直角坐标系(grid/cartesian)特有的属性:
    encode: {
      // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴:
      x: [1, 5, 'score'],
      // 把“维度0”映射到 Y 轴。
      y: 0
    }
    
    // 单轴(singleAxis)特有的属性:
    encode: {
      single: 3
    }
    
    // 极坐标系(polar)特有的属性:
    encode: {
      radius: 3,
      angle: 2
    }
    
    // 地理坐标系(geo)特有的属性:
    encode: {
      lng: 3,
      lat: 2
    }
    
    // 对于一些没有坐标系的图表,例如饼图、漏斗图等,可以是:
    encode: {
      value: 3
    }
    

常见的 series.encode 设置方式

  1. 第三列设置为 X 轴,第五列设置为 Y 轴

    option = {
      series: {
        // 注意维度序号(dimensionIndex)从 0 开始计数,第三列是 dimensions[2]。
        encode: { x: 2, y: 4 }
        // ...
      }
    };
    
  2. 第三行设置为 X 轴,第五行设置为 Y 轴

    option = {
      series: {
        encode: { x: 3, y: 5 },
        seriesLayoutBy: 'row'
        // ...
      }
    };
    
  3. 第 2 列和第 3 列显示在提示框(tooltip)中

    option = {
      series: {
        encode: {
          tooltip: [1, 2]
          // ...
        }
        // ...
      }
    };
    
  4. 数据里没有维度名,给出维度名

    var option = {
      dataset: {
        dimensions: ['score', 'amount'],
        source: [
          [89.3, 3371],
          [92.1, 8123],
          [94.4, 1954],
          [85.4, 829]
        ]
      }
    };
    
  5. 把第三列映射为气泡图的点的大小

    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, // 指向第三列(列序号从 0 开始记,所以设置为 2)。
        min: 2, // 需要给出数值范围,最小数值。
        max: 15, // 需要给出数值范围,最大数值。
        inRange: {
          // 气泡尺寸:5 像素到 60 像素。
          symbolSize: [5, 60]
        }
      },
      xAxis: {},
      yAxis: {},
      series: {
        type: 'scatter'
      }
    };
    

多个 dataset 以及如何引用他们

  1. 可以同时定义多个 dataset。系列可以通过 series.datasetIndex来指定引用哪个 dataset

    var option = {
      dataset: [
        {
          // 序号为 0 的 dataset。
          source: []
        },
        {
          // 序号为 1 的 dataset。
          source: []
        },
        {
          // 序号为 2 的 dataset。
          source: []
        }
      ],
      series: [
        {
          // 使用序号为 2 的 dataset。
          datasetIndex: 2
        },
        {
          // 使用序号为 1 的 dataset。
          datasetIndex: 1
        }
      ]
    };
    
  2. 目前并非所有图表都支持 dataset

  3. 支持 dataset 的图表有: line、bar、pie、scatter、effectScatter、parallel、candlestick、map、funnel、custom。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值