echarts 从0到1

echart从0到1Apache ECharts

一个基于 JavaScript 的开源可视化图表库, 这里记录echart入门基础概念和api使用

安装

npm i -D echarts
// or
yarn add echarts

引入

import * as echarts from 'echarts'
// 安需引入
import { BarChart } from 'echarts 

创建chart实例

const echart = ecahrts.init(element)

渲染

const options = {
  title: { text: '标题名称' },
  // 图例
  legend: {},
  // 提示器
  tooltip: {},
  // x轴
  xAxis: {
    // x轴分类,
    data: ['type01', 'type02', 'type03']
  },
  // y轴
  yAxis: {},
  // 图形映射
  series: [
    {
       name: 'number',
        // 图表类型
       type: 'bar',
       // 数据, 顺序与x轴类型一一对应
       data: [10, 20, 30] 
    }
  ]
}
// 渲染
ecahrt.setOptions(options)

图表基础组成

  • 图表容器 element
  • 图例 legend
  • 提示工具 tooltip
  • 数据集合 data
  • 图例 chart
  • 坐标系/坐标轴 axis
  • 事件/行为 event/action

数据集合、转换

除了通过独立配置每一图表数据, echart 提供 dataset 集中管理实例内的数据集合。

集合模式

数据的映射管理与集合的排列顺序挂钩

{
  
 dataset: {
    // 数据集合
    source: [
      // 第一列为 x轴分类
      ['product', '2015', '2016', '2017'],
      // 以下为对应数据集合
      ['Matcha Latte', 43.3, 85.8, 93.7], 
      // 每条数据与x类型字段一一对应, 等价: { product: 'Matcha Latte', '2015': 43.3, '2016': '85.8', '2017': 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]
    ]
  },
  
  xAxis: { type: 'category' },
  yAxis: {},
  // 每条图表声明对应一条source数据
  series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
}

[图片上传失败...(image-57899-1633271812626)]

对象模式

数据的映射关系通过字段挂钩

dataset: {
    // x 轴字段顺序
    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' }]

修改行列映射

通过设置seriesLayoutBy 修改行或列的映射模式, 默认为: column 既 serices 的每一条对应数据内的一列

row 模式与 column 相反, serices 的每一条对应数据内的一行

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: [
     
    // row 模式, 对应数据行数量
    { type: 'bar', seriesLayoutBy: 'row' },
    { type: 'bar', seriesLayoutBy: 'row' },
    { type: 'bar', seriesLayoutBy: 'row' },
     
    // column 模式, 对应数据列数量
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 },
    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 }
  ]
};

命名维度

可以使用dimensions 为各维度数据指定名称, 方便在后续配置中指定具体的使用维度

dataset: [
  dimensions: [
    // 方式1: 纯字符,将被赋值给name属性
    'product'
    // 方式2:name属性
    { name: 'product' }
    // 方式3:指定具体的维度类型, 优先级低于series
    { name: 'product', type: 'ordinal' }
  ]
]

type类型:

  1. number 数字

  2. ordinal 字符

  3. time 日期

  4. float

  5. int

指定数据映射

通过encode 指定轴对应展示的数据

{
  dataset: {
    source: [
      ['score', 'amount', 'product'],
      [89.3, 58212, 'Matcha Latte'],
      [57.1, 78254, 'Milk Tea']
    ]
  },
  xAxis: {},
  yAxis: { type: 'category' },
  series: [
    {
      type: 'bar',
      encode: {
        // 将 "amount" 列映射到 X 轴。
        x: 'amount',
        // 将 "product" 列映射到 Y 轴。
        y: 'product'
      }
    }
  ]
}

坐标轴

不同的图表使用不同的坐标系,对应的设置项也不同。

一般分为:

  1. 直角坐标系[柱状图], xAxis yAxis
  2. 极坐标系[饼图], radiusAxis angleAxis
  3. 雷达图坐标系[雷达图], radar
  4. 平行坐标系[], parallel parallelAxis
  5. 单一轴/线性 singleAxis
  6. 地理坐标系[地图], geo
  7. 日历坐标系[日历组件] calendar

坐标系一般配置项

{
  // 直角坐标系
  xAxis: {
    // 坐标轴类型
    type: 'category',
    // 坐标轴标题
    name: 'xxx',
    // 坐标轴位置
    position: 'top',
    // 多个坐标轴之间的偏移量
    offset: 10,
    // 轴线
    axisLine: {
      // 线样式
      lineStyle: { type: 'deshed' }
    },
    // 刻度
    axisTick: {
      // 线样式
      lineStyle: { type: 'deshed' }
    },
    // 刻度标签
    axisLable: {
      // 显示格式
      formatter: '{value}元' 
    }
  }
}

样式/ 主题

全局调色

{
  // 图表将根据排列顺序获取配色
  color: [
    'red',
    'orange',
    ...
  ],
  dataset: [
    ['product', '2014', '2015', '2016'],
    [
        '毛毯',
        // red
        10,
        // 'orange'
        20,
        ....
    ]
  ]
}

独立调色

series: [
  {
    type: 'bar',
    color: [ 'red', 'orange' ],
    data: ['毛毯', 10, 20, 30] // 缺失的配色将使用默认色
  }
]
// 全局调色优先级高于独立调色

[图片上传失败...(image-30c84b-1633271812626)]

细分样式

不同组件或图表存在细分的样式配置属性, 具体配置参考: 配置文档

{
  xAixs: {
   // 标签样式   
   axisLabel: {
      color: '#fff',
      fontSize: 14
    },
    // 隐藏刻度线
    axisTick: false
  },
  series: [
    type: 'bar',
    color: 'orange',
    // 显示柱状图背景
    showBackground: true
  ]
}

高亮样式

emphasis 鼠标滑入高亮样式

{
  series: {
    emphasis: { .... }   
 }
}

使用内置主题

var chart = echarts.init(dom, 'dark');

导入主题

// json 主题
$.getJSON('主题文件地址.json', function(themeJSON) {
  // 注册主题
  echarts.registerTheme('主题名称', JSON.parse(themeJSON));
  // 使用主题
  var chart = echarts.init(dom, '主题名称');
});
// umd 主题
import '../主题文件.js'
// 使用主题
var chart = echarts.init(dom, '主题名称');

交互| 事件、行为

绑定事件

cosnt chart = echarts.init(...)
chart.on('click', (params) => {....})

区分触发区域

myChart.on('click', function(params) {
  if (params.componentType === 'markPoint') {
    // 点击到了 markPoint 上
    if (params.seriesIndex === 5) {
      // 点击到了 index 为 5 的 series 的 markPoint 上。
    }
  } else if (params.componentType === 'series') {
    if (params.seriesType === 'graph') {
      if (params.dataType === 'edge') {
        // 点击到了 graph 的 edge(边)上。
      } else {
        // 点击到了 graph 的 node(节点)上。
      }
    }
  }
});

指定可触发区域

// 单一区域
const query = 'series.line',


// or


// 多区域
const query = {
  ${mainType}Index: number // 组件 index
  ${mainType}Name: string // 组件 name
  ${mainType}Id: string // 组件 id
  dataIndex: number // 数据项 index
  name: string // 数据项 name
  dataType: string // 数据项 type,如关系图中的 'node', 'edge'
  element: string // 自定义系列中的 el 的 name
}


// 绑定区域
chart.on('click', query, function() {});

主动触发事件

chart.dispatchActon({
  type: 'hightlight', // 事件类型
  seriesIndex: 0,  // 触发图表
  dataIndex: currentIndex // 数据项
})

富文本标签

[图片上传失败...(image-373852-1633271812626)]

提供多样的自定义文本展示

{
  series: [
    ...,
    data: [
      {
        value: [10, 20, 30],
        label: {
          // 使用格式 {样式片段名称| 文本内容 }
          formatter: [
             '标题',
             '{textStyle| 文本内容 }'
          ].join('\n')
        }
      }
    ]
  ],
  // 定义富文本样式
  rich:{
    textStyle: {
      fontFaily: 'siyuan',
      fontSize: 14,
      borderRadius: [4, 4, 0, 0],
      align: 'center', // 定位
      color: 'orange' 
      backgroundColor: { image: '../bg.jpg' } // 图片背景
    }
  }
}

ecahrts 常用API

  • init 初始化创建实例
  • disponse 销毁指定实例、或元素上挂载的实例
  • use 注册组件
  • registerTheme 注册主题
  • registerMap 注册geo或map图表

echart实例常用API

  • setOption 设置/更新图表
  • dispose 注销实例
  • clear 清空组件和图表
  • reseize 设置图表尺寸, 不传值时默认填充整个容器
  • on 绑定事件
  • off 取消事件
  • dispatchAction 主动触发事件
  • showLoading 显示加载动画
  • hideLoading 隐藏加载动画
  • group 分组

参考文档

官方文件

API文档

主题编辑器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • ECharts的快速上手 ECharts 的入门使用特别简单, 5分钟就能够上手. 他大体分为这几个步骤 步骤1:...
    东邪_黄药师阅读 833评论 0 4
  • 前言:策略模式和适配器模式很像 但前者策略的接口和相关类会暴露出来,并且每个策略的“计算内容”都不同【常用于计...
    程序员ken阅读 955评论 0 0
  • 1.引入 官网下载js引入,npm引入,cdn引入 2.使用 首先准备一个具备宽高的容器,然后通过echarts提...
    三十六计至做笔记阅读 1,768评论 0 0
  • 初次接触 web 图表开发的工程师,面对众多的可视化工具库难免会有疑惑,比如说: 这库的产品定位? 哪个更好学? ...
    子龙0322阅读 24,358评论 0 37
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,055评论 0 4