📃 Echarts简介

Apache ECharts 是一个基于 JavaScript 的开源可视化图表库。

Echarts官网:

📃 Echarts使用

首先,在 https://www.jsdelivr.com/package/npm/echarts 选择 dist/echarts.js,点击并保存为 echarts.js 文件。

基础示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>ECharts</title>
  6. <script src="https://cdn.jsdelivr.net/npm/echarts@5.3.2/dist/echarts.js"></script>
  7. </head>
  8. <body>
  9. <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
  10. <div id="main" style="width: 600px;height:400px;"></div>
  11. <script type="text/javascript">
  12. // 基于准备好的dom,初始化echarts实例
  13. let myChart = echarts.init(document.getElementById('main'));
  14. // 指定图表的配置项和数据
  15. let option = {
  16. title: {
  17. text: '国家人口与GDP'
  18. },
  19. tooltip: {},
  20. legend: {
  21. data: ['GDP', '人口']
  22. },
  23. xAxis: {
  24. data: ['中国', '美国', '印度', '英国', '日本', '韩国']
  25. },
  26. yAxis: {},
  27. series: [
  28. {
  29. name: 'GDP',
  30. type: 'bar',
  31. data: [20, 30, 15, 10, 16, 18]
  32. },
  33. {
  34. name: '人口',
  35. type: 'bar',
  36. data: [50, 40, 45, 10, 8, 5]
  37. }
  38. ]
  39. };
  40. // 使用刚指定的配置项和数据显示图表。
  41. myChart.setOption(option);
  42. </script>
  43. </body>
  44. </html>

点击查看【codepen】

通过npm的方式安装:

  1. yarn add echarts

使用:

  1. import * as echarts from 'echarts';
  2. // 基于准备好的dom,初始化echarts实例
  3. let myChart = echarts.init(document.getElementById('main'));
  4. // 绘制图表
  5. myChart.setOption({
  6. title: {
  7. text: 'ECharts 入门示例'
  8. },
  9. tooltip: {},
  10. xAxis: {
  11. data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  12. },
  13. yAxis: {},
  14. series: [
  15. {
  16. name: '销量',
  17. type: 'bar',
  18. data: [5, 20, 36, 10, 10, 20]
  19. }
  20. ]
  21. });

如果在DOM中没有定义容器的宽高,可以在初始化的时候指定其宽高:

  1. let myChart = echarts.init(document.getElementById('main'), null, {
  2. width: 600,
  3. height: 400
  4. });

📃 Echarts基本概念

✨ 主题

可以在初始化的时候,指定echarts的主题,默认支持深色主题:

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

加载外部主题

如果默认主题不满足用户使用,可以到以下链接创建自己的主题,导出为json

导出json后,如果是通过包管理工具加载,可以直接引入:

  1. import vintage from 'vintage.json'
  2. echarts.registerTheme('vintage', vintage);
  3. let chart = echarts.init(dom, 'vintage');

如果没有使用打包工具,则可以通过网络请求的方式获取并加载:

  1. // 假设主题名称是 "vintage"
  2. $.getJSON('vintage.json', function(themeJSON) {
  3. echarts.registerTheme('vintage', JSON.parse(themeJSON));
  4. let chart = echarts.init(dom, 'vintage');
  5. });

✨ 数据集

数据集有两种设置方式:dataset.sourceseries.data

dataset.source

一种是通过dataset.source设置:

  1. option = {
  2. legend: {},
  3. tooltip: {},
  4. dataset: {
  5. // 提供一份数据。
  6. source: [
  7. ['product', '2015', '2016', '2017'],
  8. ['Matcha Latte', 43.3, 85.8, 93.7],
  9. ['Milk Tea', 83.1, 73.4, 55.1],
  10. ['Cheese Cocoa', 86.4, 65.2, 82.5],
  11. ['Walnut Brownie', 72.4, 53.9, 39.1]
  12. ]
  13. },
  14. // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
  15. xAxis: { type: 'category' },
  16. // 声明一个 Y 轴,数值轴。
  17. yAxis: {},
  18. // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
  19. series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
  20. };

可以为对象数组形式:

  1. option = {
  2. legend: {},
  3. tooltip: {},
  4. dataset: {
  5. // 用 dimensions 指定了维度的顺序。直角坐标系中,如果 X 轴 type 为 category,
  6. // 默认把第一个维度映射到 X 轴上,后面维度映射到 Y 轴上。
  7. // 如果不指定 dimensions,也可以通过指定 series.encode 完成映射。
  8. dimensions: ['product', '2015', '2016', '2017'],
  9. source: [
  10. { product: 'Matcha Latte', '2015': 43.3, '2016': 85.8, '2017': 93.7 },
  11. { product: 'Milk Tea', '2015': 83.1, '2016': 73.4, '2017': 55.1 },
  12. { product: 'Cheese Cocoa', '2015': 86.4, '2016': 65.2, '2017': 82.5 },
  13. { product: 'Walnut Brownie', '2015': 72.4, '2016': 53.9, '2017': 39.1 }
  14. ]
  15. },
  16. xAxis: { type: 'category' },
  17. yAxis: {},
  18. series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
  19. };

也可以按维度的形式展开:

  1. option = {
  2. legend: {},
  3. tooltip: {},
  4. dataset: {
  5. dimensions: ['product', '2015', '2016', '2017'],
  6. source: {
  7. product: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'],
  8. 2015: [43.3, 83.1, 86.4, 72.4],
  9. 2016: [85.8, 73.4, 65.2, 53.9],
  10. 2017: [93.7, 55.1, 82.5, 39.1]
  11. }
  12. },
  13. xAxis: { type: 'category' },
  14. yAxis: {},
  15. series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
  16. };

效果:
点击查看【codepen】

series.data

另一种是通过series.data设置:

  1. option = {
  2. xAxis: {
  3. type: 'category',
  4. data: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie']
  5. },
  6. yAxis: {},
  7. series: [
  8. {
  9. type: 'bar',
  10. name: '2015',
  11. data: [89.3, 92.1, 94.4, 85.4]
  12. },
  13. {
  14. type: 'bar',
  15. name: '2016',
  16. data: [95.8, 89.4, 91.2, 76.9]
  17. },
  18. {
  19. type: 'bar',
  20. name: '2017',
  21. data: [97.7, 83.1, 92.5, 78.1]
  22. }
  23. ]
  24. };

✨ 数据转换

在dataset中可以定义多个数据集,通过transform指定数据转换方法。

过滤器

transform的type设置为filter,可以指定数据转换器为过滤器;dimension为要筛选的维度;value为筛选维度的值。

  1. option = {
  2. dataset: [
  3. {
  4. // 这个 dataset 的 index 是 `0`。
  5. source: [
  6. ['Product', 'Sales', 'Price', 'Year'],
  7. ['Cake', 123, 32, 2011],
  8. ['Cereal', 231, 14, 2011],
  9. ['Tofu', 235, 5, 2011],
  10. ['Dumpling', 341, 25, 2011],
  11. ['Biscuit', 122, 29, 2011],
  12. ['Cake', 143, 30, 2012],
  13. ['Cereal', 201, 19, 2012],
  14. ['Tofu', 255, 7, 2012],
  15. ['Dumpling', 241, 27, 2012],
  16. ['Biscuit', 102, 34, 2012],
  17. ['Cake', 153, 28, 2013],
  18. ['Cereal', 181, 21, 2013],
  19. ['Tofu', 395, 4, 2013],
  20. ['Dumpling', 281, 31, 2013],
  21. ['Biscuit', 92, 39, 2013],
  22. ['Cake', 223, 29, 2014],
  23. ['Cereal', 211, 17, 2014],
  24. ['Tofu', 345, 3, 2014],
  25. ['Dumpling', 211, 35, 2014],
  26. ['Biscuit', 72, 24, 2014]
  27. ]
  28. // id: 'a'
  29. },
  30. {
  31. // 这个 dataset 的 index 是 `1`。
  32. // 这个 `transform` 配置,表示,此 dataset 的数据,来自于此 transform 的结果。
  33. transform: {
  34. type: 'filter',
  35. config: { dimension: 'Year', value: 2011 }
  36. }
  37. // 我们还可以设置这些可选的属性: `fromDatasetIndex` 或 `fromDatasetId`。
  38. // 这些属性,指定了,transform 的输入,来自于哪个 dataset。例如,
  39. // `fromDatasetIndex: 0` 表示输入来自于 index 为 `0` 的 dataset 。又例如,
  40. // `fromDatasetId: 'a'` 表示输入来自于 `id: 'a'` 的 dataset。
  41. // 当这些属性都不指定时,默认认为,输入来自于 index 为 `0` 的 dataset 。
  42. },
  43. {
  44. // 这个 dataset 的 index 是 `2`。
  45. // 同样,这里因为 `fromDatasetIndex` 和 `fromDatasetId` 都没有被指定,
  46. // 那么输入默认来自于 index 为 `0` 的 dataset 。
  47. transform: {
  48. // 这个类型为 "filter" 的 transform 能够遍历并筛选出满足条件的数据项。
  49. type: 'filter',
  50. // 每个 transform 如果需要有配置参数的话,都须配置在 `config` 里。
  51. // 在这个 "filter" transform 中,`config` 用于指定筛选条件。
  52. // 下面这个筛选条件是:选出维度( dimension )'Year' 中值为 2012 的所有
  53. // 数据项。
  54. config: { dimension: 'Year', value: 2012 }
  55. }
  56. },
  57. {
  58. // 这个 dataset 的 index 是 `3`。
  59. transform: {
  60. type: 'filter',
  61. config: { dimension: 'Year', value: 2013 }
  62. }
  63. }
  64. ],
  65. series: [
  66. {
  67. type: 'pie',
  68. radius: 50,
  69. center: ['25%', '50%'],
  70. // 这个饼图系列,引用了 index 为 `1` 的 dataset 。也就是,引用了上述
  71. // 2011 年那个 "filter" transform 的结果。
  72. datasetIndex: 1
  73. },
  74. {
  75. type: 'pie',
  76. radius: 50,
  77. center: ['50%', '50%'],
  78. datasetIndex: 2
  79. },
  80. {
  81. type: 'pie',
  82. radius: 50,
  83. center: ['75%', '50%'],
  84. datasetIndex: 3
  85. }
  86. ]
  87. };

效果:
点击查看【codepen】

排序

transform的type设置为sort,可以为指定的维度进行排序;其中 asc升序,desc降序。

  1. option = {
  2. dataset: [
  3. {
  4. source: [
  5. // 原始数据
  6. ]
  7. },
  8. {
  9. transform: {
  10. type: 'sort',
  11. config: { dimension: 'Year', order: 'desc' }
  12. }
  13. }
  14. ],
  15. series: {
  16. type: 'pie',
  17. // 这个系列引用上述 transform 的结果。
  18. datasetIndex: 1
  19. }
  20. };

链式操作

transform可以是一个数组,多个转换器可以进行链式操作,上一个的输出是下一个的输入。

  1. option = {
  2. dataset: [
  3. {
  4. source: [
  5. // 原始数据
  6. ]
  7. },
  8. {
  9. // 几个 transform 被声明成 array ,他们构成了一个链,
  10. // 前一个 transform 的输出是后一个 transform 的输入。
  11. transform: [
  12. {
  13. type: 'filter',
  14. config: { dimension: 'Product', value: 'Tofu' }
  15. },
  16. {
  17. type: 'sort',
  18. config: { dimension: 'Year', order: 'desc' }
  19. }
  20. ]
  21. }
  22. ],
  23. series: {
  24. type: 'pie',
  25. // 这个系列引用上述 transform 的结果。
  26. datasetIndex: 1
  27. }
  28. };

✨ 坐标轴

x 轴和 y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。部分图表中还会有网格线来帮助查看和计算数据。
charts_axis_img02.webp

通过 xAxis``yAxis设置两条坐标轴信息:

  1. option = {
  2. xAxis: {
  3. type: 'time',
  4. name: '销售时间'
  5. },
  6. yAxis: {
  7. type: 'value',
  8. name: '销售数量'
  9. }
  10. };

多条轴线

可以为X、Y两个方向设置多个轴线(数组形式),两个 Y 轴显示在上下,两个 Y 轴显示在左右两侧。

  1. option = {
  2. xAxis: {
  3. type: 'time',
  4. name: '销售时间'
  5. },
  6. yAxis: [
  7. {
  8. type: 'value',
  9. name: '销售数量'
  10. },
  11. {
  12. type: 'value',
  13. name: '销售金额'
  14. }
  15. ]
  16. };

多于两个 x/y 轴需要通过配置 offset 属性防止同个位置多个轴的重叠。

轴线样式

通过 axisLine 为轴线设置样式。比如轴线带箭头,并设置为虚线:

  1. option = {
  2. xAxis: {
  3. type: 'time',
  4. name: '销售时间',
  5. axisLine: {
  6. symbol: 'arrow',
  7. lineStyle: {
  8. type: 'dashed'
  9. }
  10. }
  11. },
  12. yAxis: {
  13. type: 'value',
  14. name: '销售数量',
  15. axisLine: {
  16. symbol: 'arrow',
  17. lineStyle: {
  18. type: 'dashed'
  19. }
  20. }
  21. }
  22. };

通过 axisTick 为刻度线设置样式。比如刻度线宽度、刻度线样式等:

  1. option = {
  2. xAxis: {
  3. axisTick: {
  4. length: 30,
  5. lineStyle: {
  6. type: 'dashed'
  7. }
  8. }
  9. },
  10. yAxis: {
  11. axisTick: {
  12. length: 30,
  13. lineStyle: {
  14. type: 'dashed'
  15. }
  16. }
  17. }
  18. };

刻度标签

通过 axisLabel 设置相应坐标轴标签,例如文字对齐方式,自定义刻度标签内容等:

  1. option = {
  2. xAxis: {
  3. axisLabel: {
  4. formatter: '{value} kg',
  5. align: 'center'
  6. }
  7. },
  8. yAxis: {
  9. axisLabel: {
  10. formatter: '{value} 元',
  11. align: 'center'
  12. }
  13. }
  14. };

✨ 图例

通说legend设置图例,包括其排列方向、位置信息:

  1. option = {
  2. legend: {
  3. type: 'scroll', // 可滚动翻页的图例
  4. orient: 'vertical', // or 'horizontal'
  5. right: 'center',
  6. top: 'top',
  7. data: ['Evaporation', 'Precipitation', 'Temperature'], // 若省略,则显示所有图例
  8. },
  9. }

一个复杂一点的图例示例:

  1. let option = {
  2. legend: {
  3. type: 'scroll', // 可滚动翻页的图例
  4. orient: 'vertical', // or 'horizontal'
  5. right: 'center',
  6. top: 'top',
  7. data: [{
  8. name: 'Evaporation',
  9. icon: 'rect', // 图例样式
  10. }, {
  11. name: 'Precipitation',
  12. icon: 'roundRect',
  13. }, {
  14. name: 'Temperature',
  15. icon: 'pin',
  16. }],
  17. // 图例背景
  18. backgroundColor: '#000',
  19. // 图例样式
  20. textStyle: {
  21. color: '#fff'
  22. // ...
  23. },
  24. // 设置默认显示隐藏的图例
  25. selected: {
  26. Evaporation: true,
  27. Precipitation: true,
  28. Temperature: false
  29. }
  30. },
  31. }

其中:

  • orient设置图例方向
  • data可以设置显示的图例,不设置此项则显示全部图例
  • data.icon设置图例图标,可选 circle, rect, roundRect, triangle, diamond, pin, arrow, none
  • selected设置默认选中的图例

示例:
点击查看【codepen】
以上示例,设置了轴线和刻度线的样式,Y轴设置了两条轴线,图例垂直方向排布。

📃 Echarts应用

Echarts示例参考:

✨ 柱状图

series中将type设置为bar即可添加柱状图。

示例:

  1. option = {
  2. xAxis: {
  3. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. type: 'bar',
  9. data: [23, 24, 18, 25, 27, 28, 25]
  10. }
  11. ]
  12. };

横向柱状图

yAxis设置为 { type: 'category' },在 series中将encode的x轴和y轴分别设置为source中的维度。

  1. let option = {
  2. dataset: {
  3. source: [
  4. ['score', 'amount', 'product'],
  5. [89.3, 58212, 'Matcha Latte'],
  6. [57.1, 78254, 'Milk Tea'],
  7. [74.4, 41032, 'Cheese Cocoa'],
  8. [50.1, 12755, 'Cheese Brownie'],
  9. [89.7, 20145, 'Matcha Cocoa'],
  10. [68.1, 79146, 'Tea'],
  11. [19.6, 91852, 'Orange Juice'],
  12. [10.6, 101852, 'Lemon Juice'],
  13. [32.7, 20112, 'Walnut Brownie']
  14. ]
  15. },
  16. xAxis: {},
  17. // 将 类目轴(category) 映射到y轴
  18. yAxis: { type: 'category' },
  19. series: [
  20. {
  21. type: 'bar',
  22. encode: {
  23. // 将 "amount" 列映射到 X 轴。
  24. x: 'amount',
  25. // 将 "product" 列映射到 Y 轴。
  26. y: 'product'
  27. }
  28. }
  29. ]
  30. };

效果:
点击查看【codepen】

堆叠柱状图

通过stack可将柱状图分组,只要名称一致即可。

  1. option = {
  2. xAxis: {
  3. data: ['<20', '20-30', '30-40', '40-50', '>50']
  4. },
  5. yAxis: {},
  6. series: [
  7. // 男性
  8. {
  9. data: [10, 22, 28, 43, 49],
  10. type: 'bar',
  11. stack: 'sex'
  12. },
  13. // 女性
  14. {
  15. data: [5, 4, 3, 5, 10],
  16. type: 'bar',
  17. stack: 'sex'
  18. }
  19. ]
  20. };

效果:
点击查看【codepen】

动态排序柱状图

动态设置数据,可以在图标中看到动效;添加realtimeSort选项,可以进行实时排序:

  1. let myChart = echarts.init(document.getElementById('main'));
  2. let option = {};
  3. let data = [];
  4. for (let i = 0; i < 5; ++i) {
  5. data.push(Math.round(Math.random() * 200));
  6. }
  7. option = {
  8. xAxis: {
  9. max: 'dataMax'
  10. },
  11. yAxis: {
  12. type: 'category',
  13. data: ['A', 'B', 'C', 'D', 'E'],
  14. inverse: true,
  15. animationDuration: 300,
  16. animationDurationUpdate: 300,
  17. max: 2 // only the largest 3 bars will be displayed
  18. },
  19. series: [
  20. {
  21. realtimeSort: true,
  22. name: 'X',
  23. type: 'bar',
  24. data: data,
  25. label: {
  26. show: true,
  27. position: 'right',
  28. valueAnimation: true
  29. }
  30. }
  31. ],
  32. legend: {
  33. show: true
  34. },
  35. animationDuration: 3000,
  36. animationDurationUpdate: 3000,
  37. animationEasing: 'linear',
  38. animationEasingUpdate: 'linear'
  39. };
  40. myChart.setOption(option);
  41. function update() {
  42. let data = option.series[0].data;
  43. for (let i = 0; i < data.length; ++i) {
  44. if (Math.random() > 0.9) {
  45. data[i] += Math.round(Math.random() * 2000);
  46. } else {
  47. data[i] += Math.round(Math.random() * 200);
  48. }
  49. }
  50. myChart.setOption(option);
  51. }
  52. setInterval(function () {
  53. update();
  54. }, 3000);

效果:
点击查看【codepen】

阶梯瀑布流

阶梯瀑布流的原理,是将堆叠柱状图的颜色设置为透明(关注代码高亮部分)。注意,这里使用了一个help数组以存放颜色透明的数据。

  1. let myChart = echarts.init(document.getElementById('main'));
  2. let option = {};
  3. var data = [900, 345, 393, -108, -154, 135, 178, 286, -119, -361, -203];
  4. var help = [];
  5. var positive = [];
  6. var negative = [];
  7. for (var i = 0, sum = 0; i < data.length; ++i) {
  8. if (data[i] >= 0) {
  9. positive.push(data[i]);
  10. negative.push('-');
  11. } else {
  12. positive.push('-');
  13. negative.push(-data[i]);
  14. }
  15. if (i === 0) {
  16. help.push(0);
  17. } else {
  18. sum += data[i - 1];
  19. if (data[i] < 0) {
  20. help.push(sum + data[i]);
  21. } else {
  22. help.push(sum);
  23. }
  24. }
  25. }
  26. option = {
  27. title: {
  28. text: 'Waterfall'
  29. },
  30. grid: {
  31. left: '3%',
  32. right: '4%',
  33. bottom: '3%',
  34. containLabel: true
  35. },
  36. xAxis: {
  37. type: 'category',
  38. splitLine: { show: false },
  39. data: (function () {
  40. var list = [];
  41. for (var i = 1; i <= 11; i++) {
  42. list.push('Oct/' + i);
  43. }
  44. return list;
  45. })()
  46. },
  47. yAxis: {
  48. type: 'value'
  49. },
  50. series: [
  51. {
  52. type: 'bar',
  53. stack: 'all',
  54. itemStyle: {
  55. normal: {
  56. barBorderColor: 'rgba(200,0,0,0)',
  57. color: 'rgba(200,0,0,0)'
  58. },
  59. emphasis: {
  60. barBorderColor: 'rgba(0,0,0,0)',
  61. color: 'rgba(0,0,0,0)'
  62. }
  63. },
  64. data: help
  65. },
  66. {
  67. name: 'positive',
  68. type: 'bar',
  69. stack: 'all',
  70. data: positive
  71. },
  72. {
  73. name: 'negative',
  74. type: 'bar',
  75. stack: 'all',
  76. data: negative,
  77. itemStyle: {
  78. color: '#f33'
  79. }
  80. }
  81. ]
  82. };
  83. myChart.setOption(option);

效果:
点击查看【codepen】

✨ 折线图

series中将type设置为line即可添加折线图。

示例:

  1. option = {
  2. xAxis: {
  3. type: 'category',
  4. data: ['A', 'B', 'C']
  5. },
  6. yAxis: {
  7. type: 'value'
  8. },
  9. series: [
  10. {
  11. data: [120, 200, 150],
  12. type: 'line',
  13. lineStyle: {
  14. normal: {
  15. color: 'green',
  16. width: 4,
  17. type: 'dashed'
  18. }
  19. }
  20. }
  21. ]
  22. };

其中:

  • [lineStyle](https://echarts.apache.org/zh/option.html#series-line.lineStyle)设置线条样式,type可以为:solid、dashed、dotted

在图表中添加折线

折线图可以和柱状图在同一个图表中,指定series为数组,可以创建多序列柱状图/折线图。

  • 可以自定义Y轴坐标,通过{value}指定Y轴刻度;
  • 通过tooltipvalueFormatter指定弹出工具箱格式化数值显示;

比如有如下配置:

  1. let option = {
  2. tooltip: {
  3. trigger: 'axis'
  4. },
  5. legend: {},
  6. xAxis: [
  7. {
  8. type: 'category',
  9. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
  10. axisPointer: {
  11. type: 'shadow'
  12. }
  13. }
  14. ],
  15. yAxis: [
  16. {
  17. type: 'value',
  18. name: 'Precipitation',
  19. alignTicks: true,
  20. axisLabel: {
  21. formatter: '{value} ml'
  22. }
  23. },
  24. {
  25. type: 'value',
  26. name: 'Temperature',
  27. axisLabel: {
  28. formatter: '{value} °C'
  29. }
  30. }
  31. ],
  32. series: [
  33. {
  34. name: 'Evaporation',
  35. type: 'bar',
  36. tooltip: {
  37. valueFormatter: value => value + ' ml'
  38. },
  39. data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
  40. },
  41. {
  42. name: 'Precipitation',
  43. type: 'bar',
  44. tooltip: {
  45. valueFormatter: value => value + ' ml'
  46. },
  47. data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
  48. },
  49. {
  50. name: 'Temperature',
  51. type: 'line',
  52. yAxisIndex: 1,
  53. tooltip: {
  54. valueFormatter: value => value + ' °C'
  55. },
  56. data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
  57. }
  58. ]
  59. };

效果:
点击查看【codepen】

笛卡尔坐标系中的折线图

将数据设置为二维数组,每一项即可表示一个坐标点,折线将在笛卡尔坐标系中连接这些坐标点:

  1. option = {
  2. xAxis: {},
  3. yAxis: {},
  4. series: [
  5. {
  6. data: [
  7. [20, 120],
  8. [50, 200],
  9. [40, 50]
  10. ],
  11. type: 'line'
  12. }
  13. ]
  14. };

效果:
点击查看【codepen】

空数据

使用 -表示空数据

  1. option = {
  2. xAxis: {
  3. data: ['A', 'B', 'C', 'D', 'E']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. data: [0, 22, '-', 23, 19],
  9. type: 'line'
  10. }
  11. ]
  12. };

效果:
点击查看【codepen】

堆叠折线图

跟堆叠柱状图类似,只需要指定相同的stack即可,可以使用areaStyle参数添加区域填充色:

  1. option = {
  2. xAxis: {
  3. data: ['A', 'B', 'C', 'D', 'E']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. data: [10, 22, 28, 43, 49],
  9. type: 'line',
  10. stack: 'x',
  11. areaStyle: {}
  12. },
  13. {
  14. data: [5, 4, 3, 5, 10],
  15. type: 'line',
  16. stack: 'x',
  17. areaStyle: {}
  18. }
  19. ]
  20. };

效果:
点击查看【codepen】

区域面积图

跟堆叠折线图不同的是,区域面积图不需要指定stack,而是将areaStyle设置为透明,这样就可以直观得看出各块区域的面积区别。

  1. option = {
  2. xAxis: {
  3. data: ['A', 'B', 'C', 'D', 'E']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. data: [10, 22, 28, 23, 19],
  9. type: 'line',
  10. areaStyle: {}
  11. },
  12. {
  13. data: [25, 14, 23, 35, 10],
  14. type: 'line',
  15. areaStyle: {
  16. color: '#ff0',
  17. opacity: 0.5
  18. }
  19. }
  20. ]
  21. };

效果:
点击查看【codepen】

平滑曲线图

添加smooth: true选项,可以创建平滑曲线图:

  1. option = {
  2. xAxis: {
  3. data: ['A', 'B', 'C', 'D', 'E']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. data: [10, 22, 28, 23, 19],
  9. type: 'line',
  10. smooth: true
  11. }
  12. ]
  13. };

效果:
点击查看【codepen】

阶梯线图

指定step参数,可以创建阶梯线图,可取值start``middle``end

  1. option = {
  2. xAxis: {
  3. type: 'category',
  4. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  5. },
  6. yAxis: {
  7. type: 'value'
  8. },
  9. series: [
  10. {
  11. name: 'Step Start',
  12. type: 'line',
  13. step: 'start',
  14. data: [120, 132, 101, 134, 90, 230, 210]
  15. },
  16. {
  17. name: 'Step Middle',
  18. type: 'line',
  19. step: 'middle',
  20. data: [220, 282, 201, 234, 290, 430, 410]
  21. },
  22. {
  23. name: 'Step End',
  24. type: 'line',
  25. step: 'end',
  26. data: [450, 432, 401, 454, 590, 530, 510]
  27. }
  28. ]
  29. };

效果:
点击查看【codepen】

✨ 饼图

seriestype设置为 pie即可创建饼图。

基础饼图

通过dataset.source设置数据:

  1. let option = {
  2. dataset: {
  3. source: [
  4. ['Product', 'Sales'],
  5. ['Cake', 123],
  6. ['Cereal', 231],
  7. ['Tofu', 235],
  8. ['Dumpling', 341],
  9. ['Biscuit', 122],
  10. ]
  11. },
  12. series: [
  13. {
  14. type: 'pie',
  15. radius: 100,
  16. },
  17. ]
  18. };

通过series.data设置数据:

  1. option = {
  2. series: [
  3. {
  4. type: 'pie',
  5. // label: {
  6. // show: false
  7. // },
  8. data: [
  9. {
  10. value: 335,
  11. name: '直接访问'
  12. },
  13. {
  14. value: 234,
  15. name: '联盟广告'
  16. },
  17. {
  18. value: 1548,
  19. name: '搜索引擎'
  20. }
  21. ]
  22. }
  23. ]
  24. };

效果:
点击查看【codepen】

对一些设置的说明:

  • radius指定饼图半径
  • label.show设置为false的时候,不显示饼图标签

平分饼图

如果一个饼图的各项数据value都相同,即便为0,则这个饼图被平分:

  1. option = {
  2. series: [
  3. {
  4. type: 'pie',
  5. // stillShowZeroSum: false,
  6. data: [
  7. {
  8. value: 0,
  9. name: '直接访问'
  10. },
  11. {
  12. value: 0,
  13. name: '联盟广告'
  14. },
  15. {
  16. value: 0,
  17. name: '搜索引擎'
  18. }
  19. ]
  20. }
  21. ]
  22. };

效果:
点击查看【codepen】

如果设置了stillShowZeroSum: false选项,则数据和为0的时候不会显示饼图。

圆环图

将radius设置为数组,分别代表内外半径,即可表示一个圆环图

  1. option = {
  2. title: {
  3. text: '圆环图',
  4. left: 'center',
  5. top: 'center'
  6. },
  7. series: [
  8. {
  9. type: 'pie',
  10. data: [
  11. {
  12. value: 335,
  13. name: 'A'
  14. },
  15. {
  16. value: 234,
  17. name: 'B'
  18. },
  19. {
  20. value: 1548,
  21. name: 'C'
  22. }
  23. ],
  24. radius: ['40%', '70%']
  25. }
  26. ]
  27. };

效果:
点击查看【codepen】

如果想要在鼠标划上去的时候,高亮显示选中部分信息,实现思路为:将label.show默认设置为false,在label.emphasis.show将其设置为true,将label.position设置为center。

  1. option = {
  2. legend: {
  3. orient: 'vertical',
  4. x: 'left',
  5. data: ['A', 'B', 'C', 'D', 'E']
  6. },
  7. series: [
  8. {
  9. type: 'pie',
  10. radius: ['50%', '70%'],
  11. avoidLabelOverlap: false,
  12. label: {
  13. show: false,
  14. position: 'center',
  15. emphasis: {
  16. show: true,
  17. fontSize: '50',
  18. fontWeight: 'bold'
  19. }
  20. },
  21. labelLine: {
  22. show: false
  23. },
  24. data: [
  25. { value: 335, name: 'A' },
  26. { value: 310, name: 'B' },
  27. { value: 234, name: 'C' },
  28. { value: 135, name: 'D' },
  29. { value: 1548, name: 'E' }
  30. ]
  31. }
  32. ]
  33. };

效果:
点击查看【codepen】

玫瑰图(南丁格尔图)

设置roseType: 'area',即可表现为玫瑰图:

  1. option = {
  2. series: [
  3. {
  4. type: 'pie',
  5. data: [
  6. {
  7. value: 100,
  8. name: 'A'
  9. },
  10. {
  11. value: 200,
  12. name: 'B'
  13. },
  14. {
  15. value: 300,
  16. name: 'C'
  17. },
  18. {
  19. value: 400,
  20. name: 'D'
  21. },
  22. {
  23. value: 500,
  24. name: 'E'
  25. }
  26. ],
  27. roseType: 'area'
  28. }
  29. ]
  30. };

✨ 散点图

seriestype设置为 scatter 即可创建散点图。

  1. option = {
  2. xAxis: {
  3. data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. type: 'scatter',
  9. data: [220, 182, 191, 234, 290, 330, 310]
  10. }
  11. ]
  12. };

示例:
点击查看【codepen】

笛卡尔坐标系下的散点图

将数据设置为二维数组,每一项即可表示一个坐标点,散点图将标记这些点:

  1. option = {
  2. xAxis: {},
  3. yAxis: {},
  4. series: [
  5. {
  6. type: 'scatter',
  7. data: [
  8. [10, 5],
  9. [0, 8],
  10. [6, 10],
  11. [2, 12],
  12. [8, 9]
  13. ]
  14. }
  15. ]
  16. };

效果:
点击查看【codepen】

设置散点图形

使用 symbol可以指定SVG图形为散点图形,使用symbolSize指定图形大小:

  1. option = {
  2. xAxis: {
  3. data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. type: 'scatter',
  9. data: [220, 182, 191, 234, 290, 330, 310],
  10. symbol: 'path://M51.911,16.242C51.152,7.888,45.239,1.827,37.839,1.827c-4.93,0-9.444,2.653-11.984,6.905 c-2.517-4.307-6.846-6.906-11.697-6.906c-7.399,0-13.313,6.061-14.071,14.415c-0.06,0.369-0.306,2.311,0.442,5.478 c1.078,4.568,3.568,8.723,7.199,12.013l18.115,16.439l18.426-16.438c3.631-3.291,6.121-7.445,7.199-12.014 C52.216,18.553,51.97,16.611,51.911,16.242z',
  11. symbolSize: function (value) {
  12. return value / 10;
  13. }
  14. }
  15. ]
  16. };

效果:
点击查看【codepen】

symbol除了设置为svg的path路径之外,还可以从本地加载图片或从网络加载图片。

示例:使用svg的path作为散点图形:

  1. symbol: 'path://M51.911,16.242C51.152,7.888,45.239,1.827,37.839,1.827c-4.93,0-9.444,2.653-11.984,6.905 c-2.517-4.307-6.846-6.906-11.697-6.906c-7.399,0-13.313,6.061-14.071,14.415c-0.06,0.369-0.306,2.311,0.442,5.478 c1.078,4.568,3.568,8.723,7.199,12.013l18.115,16.439l18.426-16.438c3.631-3.291,6.121-7.445,7.199-12.014 C52.216,18.553,51.97,16.611,51.911,16.242z'

示例:从本地加载图片作为散点图形:

  1. symbol: 'image://../image/love.svg'

示例:从网络加载图片作为散点图形:

  1. symbol: 'image://https://iconfont.alicdn.com/t/122897f9-f664-4e46-82d8-07e7144ff003.png'

✨ 地图

地图数据可以到阿里数据可视化平台DataV.GeoAtlas中获取:

📃 图表样式配置

✨ 标签

通过label可以设置标签样式,将其show设置为true,显示数值:

  1. option = {
  2. xAxis: {
  3. data: ['A', 'B', 'C', 'D', 'E']
  4. },
  5. yAxis: {},
  6. series: [
  7. {
  8. data: [10, 22, 28, 23, 19],
  9. type: 'bar',
  10. label: {
  11. show: true,
  12. position: 'top',
  13. textStyle: {
  14. fontSize: 20
  15. }
  16. }
  17. }
  18. ]
  19. };

效果:
点击查看【codepen】

label常见的参数配置如下:

选项 类型 说明 取值说明

show

| boolean | 是否显示标签。 | | |

position

| string Array | 标签的位置。 | 字符串示例:
top / left / right / bottom / inside / insideLeft / insideRight / insideTop / insideBottom / insideTopLeft / insideBottomLeft / insideTopRight / insideBottomRight
数组示例:
[10, 10] / [‘50%’, ‘50%’] | |

distance

| number | 距离图形元素的距离。 | 当 position 为字符描述值(如 ‘top’、’insideRight’)时候有效。 | |

rotate

| number | 标签旋转。 | 从 -90 度到 90 度。正值是逆时针。 | |

formatter

| string Function | 标签内容格式器。 | 支持字符串模板和回调函数两种形式,字符串模板与回调函数返回的字符串均支持用 \n 换行。 | |

color

| Color | 如果设置为 ‘inherit’,则为视觉映射得到的颜色,如系列色。 | | |

fontStyle

| string | 文字字体的风格。 | normal / italic / oblique | |

fontWeight

| string number | 文字字体的粗细。 | normal / bold / bolder / lighter
100 | 200 | 300 | 400 … | |

fontFamily

| string | 文字的字体系列。 | ‘serif’ , ‘monospace’, ‘Arial’, ‘Courier New’, ‘Microsoft YaHei’, … |

label配置项包括:位置、偏移、宽高、字体、大小、颜色、边框、描边、阴影、溢出隐藏、富文本标签等。

label更多的配置项详见文档:

示例:bar-label-rotation
点击查看【codepen】

示例:label-position
点击查看【codepen】

📃 一些有趣的特性

✨ 富文本标签

参考:富文本标签

✨ 异步加载图表

如果数据为异步获取,可以先渲染一个空的坐标系,待数据响应后,再填充数据。在数据获取期间,可以显示loading图以表示数据获取中。

示例:使用setTimeout模拟数据获取的过程

  1. let myChart = echarts.init(document.getElementById('main'));
  2. // 显示loading占位
  3. myChart.showLoading();
  4. // 显示标题,图例和空的坐标轴等
  5. myChart.setOption({
  6. title: {
  7. text: '异步数据加载示例'
  8. },
  9. tooltip: {},
  10. xAxis: {
  11. data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
  12. },
  13. yAxis: {},
  14. series: [
  15. {
  16. type: 'scatter',
  17. data: []
  18. }
  19. ]
  20. });
  21. setTimeout(() => {
  22. // 隐藏loading
  23. myChart.hideLoading();
  24. // 设置数据
  25. myChart.setOption({
  26. series: [
  27. {
  28. type: 'scatter',
  29. data: [220, 182, 191, 234, 290, 330, 310],
  30. symbol: 'image://https://iconfont.alicdn.com/t/122897f9-f664-4e46-82d8-07e7144ff003.png',
  31. symbolSize: function (value) {
  32. return value / 10;
  33. }
  34. }
  35. ]
  36. });
  37. }, 3000)

效果:
点击查看【codepen】

📃 在微信小程序中使用echarts

使用 echarts-for-weixin 可以在微信小程序中使用echarts

📃 服务器端渲染echarts图表

服务器端渲染只需要将ssr设置为true,选择渲染模式renderer为svg或canvas即可。

示例:通过node.js开启服务,服务器端创建图表,通过svg渲染并返回数据:

  1. var http = require("http");
  2. var echarts = require("echarts");
  3. function renderChart() {
  4. const chart = echarts.init(null, null, {
  5. renderer: "svg",
  6. ssr: true,
  7. width: 400,
  8. height: 300
  9. });
  10. chart.setOption({
  11. legend: {
  12. orient: "vertical",
  13. x: "left",
  14. data: ["A", "B", "C", "D", "E"]
  15. },
  16. series: [
  17. {
  18. type: "pie",
  19. radius: ["50%", "70%"],
  20. avoidLabelOverlap: false,
  21. label: {
  22. show: false,
  23. position: "center",
  24. emphasis: {
  25. show: true,
  26. fontSize: "50",
  27. fontWeight: "bold"
  28. }
  29. },
  30. labelLine: {
  31. show: false
  32. },
  33. data: [
  34. { value: 335, name: "A" },
  35. { value: 310, name: "B" },
  36. { value: 234, name: "C" },
  37. { value: 135, name: "D" },
  38. { value: 1548, name: "E" }
  39. ]
  40. }
  41. ]
  42. });
  43. return chart.renderToSVGString();
  44. }
  45. http
  46. .createServer(function (req, res) {
  47. res.writeHead(200, {
  48. "Content-Type": "application/xml"
  49. });
  50. res.write(renderChart());
  51. res.end();
  52. })
  53. .listen(8000);

现在已知的问题是:使用服务器端渲染,用户交互不生效。

参考:服务端渲染 ECharts 图表

📃 图表示例站点

📃 大屏展示项目