黄子涵

【HZHE】黄子涵学习Echarts

快速上手

获取 Apache ECharts

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

获取 Apache ECharts

引入 Apache ECharts

在刚才保存 echarts.js 的目录新建一个 HZHE001.html 文件,内容如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <script src="echarts.js"></script>
</head>

<body>
   
</body>

</html>

打开这个 HZHE001.html,你会看到一片空白。

引入 Apache ECharts

但是不要担心,打开控制台确认没有报错信息,就可以进行下一步。

控制台没有报错信息

绘制一个简单的图表

在绘图前我们需要为 ECharts 准备一个定义了高宽的 DOM 容器。在刚才的例子 </head> 之后,添加:

<body>
  <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
  <div id="main" style="width: 600px;height:400px;"></div>
</body>

然后就可以通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成一个简单的柱状图,下面是完整代码。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20]
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>

</html>

黄子涵ECharts 入门示例

实例效果

HZHE001.html的效果

概念篇

下面,我们就常见的几种使用场景,介绍如何初始化一个图表以及改变其大小。

图表容器及大小

通常来说,需要在 HTML 中先定义一个 <div> 节点,并且通过 CSS 使得该节点具有宽度和高度。初始化的时候,传入该节点,图表的大小默认即为该节点的大小,除非声明了 opts.widthopts.height 将其覆盖。

<div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        var HZHChart = echarts.init(document.getElementById('huangzihan'));
    </script>

图表容器及大小

需要注意的是,使用这种方法在调用 echarts.init 时需保证容器已经有宽度和高度了。

初始化

在 HTML 中定义有宽度和高度的父容器(推荐)

指定图表的大小

如果图表容器不存在宽度和高度,或者,你希望图表宽度和高度不等于容器大小,也可以在初始化的时候指定大小。

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <div id="huangzihan"></div>
    <script type="text/javascript">
        var HZHChart = echarts.init(document.getElementById('huangzihan'), null, {
            width: 600,
            height: 400
        });
    </script>
</body>

</html>

指定图表的大小

响应容器大小的变化

监听图表容器的大小并改变图表大小

在有些场景下,我们希望当容器大小改变时,图表的大小也相应地改变。

比如,图表容器是一个高度为 400px、宽度为页面 100% 的节点,你希望在浏览器宽度改变的时候,始终保持图表宽度是页面的 100%。

这种情况下,可以监听页面的 window.onresize 事件获取浏览器大小改变的事件,然后调用 echartsInstance.resize 改变图表的大小。

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
    <style>
        #huangzihan,
        html,
        body {
            width: 100%;
        }

        #huangzihan {
            height: 400px;
        }
    </style>
</head>

<body>
    <div id="huangzihan"></div>
    <script type="text/javascript">
        var HZHChart = echarts.init(document.getElementById('huangzihan'));
        window.onresize = function () {
            HZHChart.resize();
        };
    </script>
</body>

</html>

监听图表容器的大小并改变图表大小

为图表设置特定的大小

除了直接调用 resize() 不含参数的形式之外,还可以指定宽度和高度,实现图表大小不等于容器大小的效果。

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <div id="huangzihan"></div>
    <script type="text/javascript">
        var HZHChart = echarts.init(document.getElementById('huangzihan'));
        window.onresize = function () {
            HZHChart.resize({
                width: 800,
                height: 400
            });
        };
    </script>
</body>

</html>

为图表设置特定的大小

小贴士

阅读 API 文档的时候要留意接口的定义方式,这一接口有时会被误认为是 myCharts.resize(800, 400) 的形式,但其实不存在这样的调用方式。

echartsInstance. resize

容器节点被销毁以及被重建时

假设页面中存在多个标签页,每个标签页都包含一些图表。当选中一个标签页的时候,其他标签页的内容在 DOM 中被移除了。这样,当用户再选中这些标签页的时候,就会发现图表“不见”了。

本质上,这是由于图表的容器节点被移除导致的。即使之后该节点被重新添加,图表所在的节点也已经不存在了。

正确的做法是,在图表容器被销毁之后,调用 echartsInstance.dispose 销毁实例,在图表容器重新被添加后再次调用 echarts.init 初始化。

小贴士

在容器节点被销毁时,总是应调用 echartsInstance.dispose 以销毁实例释放资源,避免内存泄漏。

概念篇

ECharts 中的样式简介

本文主要是大略概述,用哪些方法,可以在 Apache EChartsTM 中设置样式,改变图形元素或者文字的颜色、明暗、大小等。

本文介绍这几种方式,他们的功能范畴可能会有交叉(即同一种细节的效果可能可以用不同的方式实现),但是他们各有各的场景偏好。

  • 颜色主题(Theme)
  • 调色盘
  • 直接样式设置(itemStyle、lineStyle、areaStyle、label、...)
  • 视觉映射(visualMap)

颜色主题(Theme)

最简单的更改全局样式的方式,是直接采用颜色主题(theme)。例如,在 示例集合 中,可以通过切换深色模式,直接看到采用主题的效果。

ECharts5 除了一贯的默认主题外,还内置了'dark'主题。可以像这样切换成深色模式:

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'),'dark');

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20]
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

直接采用颜色主题(theme)

其他的主题,没有内置在 ECharts 中,需要自己加载。这些主题可以在 主题编辑器 里访问到。

主题编辑器

也可以使用这个主题编辑器,自己编辑主题。

下载下来的主题可以这样使用:

JS文件方式

如果主题保存为 JS 文件,例如:

  1. 下载或复制以下的主题保存至 *.js 文件;
  2. 将该文件在 HTML 中引用;
  3. 使用 echarts.init(dom, 'westeros') 创建图表,第二个参数即为 *.js 文件中注册的主题名字。
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
    <script src="westeros.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'),'westeros');

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20]
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

image

JSON 文件(暂时还不会)

如果主题保存为 JSON 文件,则需要自行加载和注册,例如:

  1. 下载或复制以下的主题保存至 *.json 文件;
  2. 读取该 JSON 文件,并使用 obj = JSON.parse(data) 将其转换成对象;
  3. 调用 echarts.registerTheme('walden', obj) 注册主题;
  4. 使用 echarts.init(dom, 'walden') 创建图表,第二个参数即为刚才注册的主题名字。
// 假设主题名称是 "vintage"
$.getJSON('xxx/xxx/vintage.json', function(themeJSON) {
  echarts.registerTheme('vintage', JSON.parse(themeJSON));
  var chart = echarts.init(dom, 'vintage');
});

UMD 格式的 JS 文件

如果保存为 UMD 格式的 JS 文件,文件内部已经做了自注册,直接引入 JS 即可:

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
    <script src="walden.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'),'walden');

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20]
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

UMD 格式的 JS 文件

调色盘

调色盘,可以在 option 中设置。它给定了一组颜色,图形、系列会自动从其中选择颜色。 可以设置全局的调色盘,

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20],
                },

            ],
            color: [
                '#c23531',
                '#2f4554',
                '#61a0a8',
                '#d48265',
                '#91c7ae',
                '#749f83',
                '#ca8622',
                '#bda29a',
                '#6e7074',
                '#546570',
                '#c4ccd3'
            ],
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

全局的调色盘

也可以设置系列自己专属的调色盘。

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data: ['黄子涵']
            },
            xAxis: {
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4', 'HZH5', 'HZH6']
            },
            yAxis: {},
            series: [
                {
                    name: '黄子涵',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20],

                    type: 'bar',
                    // 此系列自己的调色盘。
                    color: [
                        '#dd6b66',
                        '#759aa0',
                        '#e69d87',
                        '#8dc1a9',
                        '#ea7e53',
                        '#eedd78',
                        '#73a373',
                        '#73b9bc',
                        '#7289ab',
                        '#91ca8c',
                        '#f49f42'
                    ]
                },

            ],
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

自己专属的调色盘

直接的样式设置 itemStyle, lineStyle, areaStyle, label, ...

直接的样式设置是比较常用设置方式。纵观 ECharts 的 option 中,很多地方可以设置 itemStylelineStyleareaStylelabel等等。这些的地方可以直接设置图形元素的颜色、线宽、点的大小、标签的文字、标签的样式等等。

一般来说,ECharts 的各个系列和组件,都遵从这些命名习惯,虽然不同图表和组件中,itemStylelabel 等可能出现在不同的地方。

在下面例子中我们给气泡图设置了阴影,渐变色等复杂的样式,你可以修改代码中的样式看修改后的效果:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));
        var data = [
            [
                [28604, 77, 17096869, 'Australia', 1990],
                [31163, 77.4, 27662440, 'Canada', 1990],
                [1516, 68, 1154605773, 'China', 1990],
                [13670, 74.7, 10582082, 'Cuba', 1990],
                [28599, 75, 4986705, 'Finland', 1990],
                [29476, 77.1, 56943299, 'France', 1990],
                [31476, 75.4, 78958237, 'Germany', 1990],
                [28666, 78.1, 254830, 'Iceland', 1990],
                [1777, 57.7, 870601776, 'India', 1990],
                [29550, 79.1, 122249285, 'Japan', 1990],
                [2076, 67.9, 20194354, 'North Korea', 1990],
                [12087, 72, 42972254, 'South Korea', 1990],
                [24021, 75.4, 3397534, 'New Zealand', 1990],
                [43296, 76.8, 4240375, 'Norway', 1990],
                [10088, 70.8, 38195258, 'Poland', 1990],
                [19349, 69.6, 147568552, 'Russia', 1990],
                [10670, 67.3, 53994605, 'Turkey', 1990],
                [26424, 75.7, 57110117, 'United Kingdom', 1990],
                [37062, 75.4, 252847810, 'United States', 1990]
            ],
            [
                [44056, 81.8, 23968973, 'Australia', 2015],
                [43294, 81.7, 35939927, 'Canada', 2015],
                [13334, 76.9, 1376048943, 'China', 2015],
                [21291, 78.5, 11389562, 'Cuba', 2015],
                [38923, 80.8, 5503457, 'Finland', 2015],
                [37599, 81.9, 64395345, 'France', 2015],
                [44053, 81.1, 80688545, 'Germany', 2015],
                [42182, 82.8, 329425, 'Iceland', 2015],
                [5903, 66.8, 1311050527, 'India', 2015],
                [36162, 83.5, 126573481, 'Japan', 2015],
                [1390, 71.4, 25155317, 'North Korea', 2015],
                [34644, 80.7, 50293439, 'South Korea', 2015],
                [34186, 80.6, 4528526, 'New Zealand', 2015],
                [64304, 81.6, 5210967, 'Norway', 2015],
                [24787, 77.3, 38611794, 'Poland', 2015],
                [23038, 73.13, 143456918, 'Russia', 2015],
                [19360, 76.5, 78665830, 'Turkey', 2015],
                [38225, 81.4, 64715810, 'United Kingdom', 2015],
                [53354, 79.1, 321773631, 'United States', 2015]
            ]
        ];
        // 指定图表的配置项和数据
        var option = {
            backgroundColor: {
                type: 'radial',
                x: 0.3,
                y: 0.3,
                r: 0.8,
                colorStops: [
                    {
                        offset: 0,
                        color: '#f7f8fa'
                    },
                    {
                        offset: 1,
                        color: '#cdd0d5'
                    }
                ]
            },
            grid: {
                left: 10,
                containLabel: true,
                bottom: 10,
                top: 10,
                right: 30
            },
            xAxis: {
                splitLine: {
                    show: false
                }
            },
            yAxis: {
                splitLine: {
                    show: false
                },
                scale: true
            },
            series: [
                {
                    name: '1990',
                    data: data[0],
                    type: 'scatter',
                    symbolSize: function (data) {
                        return Math.sqrt(data[2]) / 5e2;
                    },
                    emphasis: {
                        focus: 'series',
                        label: {
                            show: true,
                            formatter: function (param) {
                                return param.data[3];
                            },
                            position: 'top'
                        }
                    },
                    itemStyle: {
                        shadowBlur: 10,
                        shadowColor: 'rgba(120, 36, 50, 0.5)',
                        shadowOffsetY: 5,
                        color: {
                            type: 'radial',
                            x: 0.4,
                            y: 0.3,
                            r: 1,
                            colorStops: [
                                {
                                    offset: 0,
                                    color: 'rgb(251, 118, 123)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(204, 46, 72)'
                                }
                            ]
                        }
                    }
                },
                {
                    name: '2015',
                    data: data[1],
                    type: 'scatter',
                    symbolSize: function (data) {
                        return Math.sqrt(data[2]) / 5e2;
                    },
                    emphasis: {
                        focus: 'series',
                        label: {
                            show: true,
                            formatter: function (param) {
                                return param.data[3];
                            },
                            position: 'top'
                        }
                    },
                    itemStyle: {
                        shadowBlur: 10,
                        shadowColor: 'rgba(25, 100, 150, 0.5)',
                        shadowOffsetY: 5,
                        color: {
                            type: 'radial',
                            x: 0.4,
                            y: 0.3,
                            r: 1,
                            colorStops: [
                                {
                                    offset: 0,
                                    color: 'rgb(129, 227, 238)'
                                },
                                {
                                    offset: 1,
                                    color: 'rgb(25, 183, 207)'
                                }
                            ]
                        }
                    }
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
    </script>
</body>

</html>

实例效果

直接的样式设置

高亮的样式:emphasis

在鼠标悬浮到图形元素上时,一般会出现高亮的样式。默认情况下,高亮的样式是根据普通样式自动生成的。但是高亮的样式也可以自己定义,主要是通过 emphasis 属性来定制。emphasis 中的结构,和普通样式的结构相同,例如:

option = {
  series: {
    type: 'scatter',

    // 普通样式。
    itemStyle: {
      // 点的颜色。
      color: 'red'
    },
    label: {
      show: true,
      // 标签的文字。
      formatter: 'This is a normal label.'
    },

    // 高亮样式。
    emphasis: {
      itemStyle: {
        // 高亮时点的颜色。
        color: 'blue'
      },
      label: {
        show: true,
        // 高亮时标签的文字。
        formatter: 'This is a emphasis label.'
      }
    }
  }
};

通过 visualMap 组件设定样式

visualMap 组件 组件 能指定数据到颜色、图形尺寸的映射规则,详见 数据的视觉映射

概念篇

数据集

数据集(dataset)是专门用来管理数据的组件。虽然每个系列都可以在 series.data 中设置数据,但是从 ECharts4 支持 数据集 开始,更推荐使用 数据集 来管理数据。因为这样,数据可以被多个组件复用,也方便进行 “数据和其他配置” 分离的配置风格。毕竟,在运行时,数据是最常改变的,而其他配置大多并不会改变。

在系列中设置数据

如果数据设置在 系列(series)中,例如:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            xAxis: {
                type: 'category',
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4']
            },
            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]
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

在系列中设置数据

这种方式的优点是,适于对一些特殊的数据结构(如“树”、“图”、超大数据)进行一定的数据类型定制。 但是缺点是,常需要用户先处理数据,把数据分割设置到各个系列(和类目轴)中。此外,不利于多个系列共享一份数据,也不利于基于原始数据进行图表类型、系列的映射安排。

在数据集中设置数据

而数据设置在 数据集(dataset)中,会有这些好处:

  • 能够贴近数据可视化常见思维方式:(I)提供数据,(II)指定数据到视觉的映射,从而形成图表。
  • 数据和其他配置可以被分离开来。数据常变,其他配置常不变。分开易于分别管理。
  • 数据可以被多个系列或者组件复用,对于大数据量的场景,不必为每个系列创建一份数据。
  • 支持更多的数据的常用格式,例如二维数组、对象数组等,一定程度上避免使用者为了数据格式而进行转换。

一个最简单的 dataset 的例子

下面是一个最简单的 dataset 的例子:

实例代码
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 600px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts示例'
            },
            legend: {},
            tooltip: {},
            dataset: {
                // 提供一份数据。
                source: [
                    ['HZH1', '2015', '2016', '2017'],
                    ['HZH2', 43.3, 85.8, 93.7],
                    ['HZH3', 83.1, 73.4, 55.1],
                    ['HZH4', 86.4, 65.2, 82.5],
                    ['HZH5', 72.4, 53.9, 39.1]
                ]
            },
            // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
            xAxis: { type: 'category' },
            // 声明一个 Y 轴,数值轴。
            yAxis: {},
            // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
            series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>
实例效果

一个最简单的 dataset 的例子

使用常见的“对象数组”的格式

或者也可以使用常见的“对象数组”的格式:

实例代码
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            legend: {},
            tooltip: {},
            dataset: {
                // 用 dimensions 指定了维度的顺序。直角坐标系中,如果 X 轴 type 为 category,
                // 默认把第一个维度映射到 X 轴上,后面维度映射到 Y 轴上。
                // 如果不指定 dimensions,也可以通过指定 series.encode
                // 完成映射,参见后文。
                dimensions: ['product', '2015', '2016', '2017'],
                source: [
                    { product: 'HZH1', '2015': 43.3, '2016': 85.8, '2017': 93.7 },
                    { product: 'HZH2', '2015': 83.1, '2016': 73.4, '2017': 55.1 },
                    { product: 'HZH3', '2015': 86.4, '2016': 65.2, '2017': 82.5 },
                    { product: 'HZH4', '2015': 72.4, '2016': 53.9, '2017': 39.1 }
                ]
            },
            xAxis: { type: 'category' },
            yAxis: {},
            series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>
实例效果

使用常见的“对象数组”的格式

数据到图形的映射

如上所述,数据可视化的一个常见思路是:(I)提供数据,(II)指定数据到视觉的映射。

简而言之,可以进行这些映射的设定:

  • 指定 数据集 的列(column)还是行(row)映射为 系列(series)。这件事可以使用 series.seriesLayoutBy 属性来配置。默认是按照列(column)来映射。

  • 指定维度映射的规则:如何从 dataset 的维度(一个“维度”的意思是一行/列)映射到坐标轴(如 X、Y 轴)、提示框(tooltip)、标签(label)、图形元素大小颜色等(visualMap)。这件事可以使用 series.encode 属性,以及 visualMap 组件来配置(如果有需要映射颜色大小等视觉维度的话)。上面的例子中,没有给出这种映射配置,那么 ECharts 就按最常见的理解进行默认映射:X 坐标轴声明为类目轴,默认情况下会自动对应到 dataset.source 中的第一列;三个柱图系列,一一对应到 dataset.source 中后面每一列。

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

下面详细解释这些映射的设定。

有了数据表之后,使用者可以灵活地配置:数据如何对应到轴和图形系列。

用户可以使用 seriesLayoutBy 配置项,改变图表对于行列的理解。seriesLayoutBy 可取值:

  • 'column': 默认值。系列被安放到 dataset 的列上面。
  • 'row': 系列被安放到 dataset 的行上面。

看这个例子:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '黄子涵ECharts示例'
            },
            legend: {},
            tooltip: {},
            dataset: {
                source: [
                    ['HZH1', '2012', '2013', '2014', '2015'],
                    ['HZH2', 41.1, 30.4, 65.1, 53.3],
                    ['HZH3', 86.5, 92.1, 85.7, 83.1],
                    ['HZH4', 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 }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

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

维度( dimension )

常用图表所描述的数据大部分是“二维表”结构,上述的例子中,我们都使用二维数组来容纳二维表。现在,当我们把系列( series )对应到“列”的时候,那么每一列就称为一个“维度( dimension )”,而每一行称为数据项( item )。反之,如果我们把系列( series )对应到表行,那么每一行就是“维度( dimension )”,每一列就是数据项( item )。

维度可以有单独的名字,便于在图表中显示。维度名( dimension name )可以在定义在 dataset 的第一行(或者第一列)。例如上面的例子中,'score''amount''product' 就是维度名。从第二行开始,才是正式的数据。dataset.source 中第一行(列)到底包含不包含维度名,ECharts 默认会自动探测。当然也可以设置 dataset.sourceHeader: true 显示声明第一行(列)就是维度,或者 dataset.sourceHeader: false 表明第一行(列)开始就直接是数据。

维度的定义,也可以使用单独的 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' }
    ]
  }
  // ...
};

大多数情况下,我们并不需要去设置维度类型,因为 ECharts 会自动尝试判断。但是如果不足够准确时,可以手动设置维度类型。

维度类型( dimension type )可以取这些值:

  • 'number': 默认,表示普通数据。
  • 'ordinal': 对于类目、文本这些 string 类型的数据,如果需要能在数轴上使用,须是 'ordinal' 类型。ECharts 默认会试图自动判断这个类型。但是自动判断也可能不准确,所以使用者也可以手动强制指定。
  • 'time': 表示时间数据。设置成 'time' 则能支持自动解析数据成时间戳(timestamp),比如该维度的数据是 '2017-05-10',会自动被解析。如果这个维度被用在时间数轴(axis.type'time')上,那么会被自动设置为 'time' 类型。时间类型的支持参见 data
  • 'float': 如果设置成 'float',在存储时候会使用 TypedArray,对性能优化有好处。
  • 'int': 如果设置成 'int',在存储时候会使用 TypedArray,对性能优化有好处。

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

了解了维度的概念后,我们就可以使用 series.encode 来做映射。总体是这样的感觉:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            dataset: {
                source: [
                    ['score', 'amount', 'product'],
                    [89.3, 58212, 'HZH1'],
                    [57.1, 78254, 'HZH2'],
                    [74.4, 41032, 'HZH3'],
                    [50.1, 12755, 'HZH4'],
                    [89.7, 20145, 'HZH5'],
                    [68.1, 79146, 'HZH6'],
                    [19.6, 91852, 'HZH7'],
                    [10.6, 101852, 'HZH8'],
                    [32.7, 20112, 'HZH9']
                ]
            },
            xAxis: {},
            yAxis: { type: 'category' },
            series: [
                {
                    type: 'bar',
                    encode: {
                        // 将 "amount" 列映射到 X 轴。
                        x: 'amount',
                        // 将 "product" 列映射到 Y 轴。
                        y: 'product'
                    }
                }
            ]
        };
        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

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

series.encode 声明的基本结构如下。其中冒号左边是坐标系、标签等特定名称,如 'x', 'y', 'tooltip' 等,冒号右边是数据中的维度名(string 格式)或者维度的序号(number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)。通常情况下,下面各种信息不需要所有的都写,按需写即可。

下面是 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示例

默认的 series.encode

值得一提的是,当 series.encode 并没有指定时,ECharts 针对最常见直角坐标系中的图表(折线图、柱状图、散点图、K 线图等)、饼图、漏斗图,会采用一些默认的映射规则。默认的映射规则比较简单,大体是:

  • 在坐标系中(如直角坐标系、极坐标系等)
    • 如果有类目轴(axis.type 为 'category'),则将第一列(行)映射到这个轴上,后续每一列(行)对应一个系列。
    • 如果没有类目轴,假如坐标系有两个轴(例如直角坐标系的 X Y 轴),则每两列对应一个系列,这两列分别映射到这两个轴上。
  • 如果没有坐标系(如饼图)
    • 取第一列(行)为名字,第二列(行)为数值(如果只有一列,则取第一列为数值)。
      默认的规则不能满足要求时,就可以自己来配置 encode,也并不复杂。这是一个 例子:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        var option = {
            title: {
                text: '黄子涵ECharts示例'
            },
            legend: {},
            tooltip: {},
            dataset: {
                source: [
                    ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
                    ['HZH1', 86.5, 92.1, 85.7, 83.1, 73.4, 55.1],
                    ['HZH2', 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
                    ['HZH3', 24.1, 67.2, 79.5, 86.4, 65.2, 82.5],
                    ['HZH4', 55.2, 67.1, 69.2, 72.4, 53.9, 39.1]
                ]
            },
            series: [
                {
                    type: 'pie',
                    radius: '20%',
                    center: ['25%', '30%']
                    // No encode specified, by default, it is '2012'.
                },
                {
                    type: 'pie',
                    radius: '20%',
                    center: ['75%', '30%'],
                    encode: {
                        itemName: 'product',
                        value: '2013'
                    }
                },
                {
                    type: 'pie',
                    radius: '20%',
                    center: ['25%', '75%'],
                    encode: {
                        itemName: 'product',
                        value: '2014'
                    }
                },
                {
                    type: 'pie',
                    radius: '20%',
                    center: ['75%', '75%'],
                    encode: {
                        itemName: 'product',
                        value: '2015'
                    }
                }
            ]
        };

        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

自己来配置 encode

几个常见的 series.encode 设置方式举例

问:如何把第三列设置为 X 轴,第五列设置为 Y 轴?

答:

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

问:如何把第二列设置为标签?

答: 关于标签的显示 label.formatter,现在支持引用特定维度的值,例如:

series: {
  label: {
    // `'{@score}'` 表示 “名为 score” 的维度里的值。
    // `'{@[4]}'` 表示引用序号为 4 的维度里的值。
    formatter: 'aaa{@product}bbb{@score}ccc{@[4]}ddd';
  }
}

问:如何让第 2 列和第 3 列显示在提示框(tooltip)中?

答:

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

问:如何把第三列映射为气泡图的点的大小?

答:

实例代码
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:400px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            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'
            }
        };
        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>
实例效果

把第三列映射为气泡图的点的大小

问:encode 里指定了映射,但是不管用?

答:可以查查有没有拼错,比如,维度名是:'Life Expectancy',encode 中拼成了 'Life Expectency'

视觉通道(颜色、尺寸等)的映射

我们可以使用 visualMap 组件进行视觉通道的映射。详见 visualMap 文档的介绍。这是一个 示例:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:500px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            dataset: {
                source: [
                    ['score', 'amount', 'product'],
                    [89.3, 58212, 'HZH1'],
                    [57.1, 78254, 'HZH2'],
                    [74.4, 41032, 'HZH3'],
                    [50.1, 12755, 'HZH4'],
                    [89.7, 20145, 'HZH5'],
                    [68.1, 79146, 'HZH6'],
                    [19.6, 91852, 'HZH7'],
                    [10.6, 101852, 'HZH8'],
                    [32.7, 20112, 'HZH9']
                ]
            },
            grid: { containLabel: true },
            xAxis: { name: '黄子涵的数量' },
            yAxis: { type: 'category' },
            visualMap: {
                orient: 'horizontal',
                left: 'center',
                min: 10,
                max: 100,
                text: ['黄子涵的最高分', '黄子涵的最低分'],
                // Map the score column to color
                dimension: 0,
                inRange: {
                    color: ['#8ECEE7', '#8EE7CC', '#7C8DC1']
                }
            },
            series: [
                {
                    type: 'bar',
                    encode: {
                        // Map the "amount" column to X axis.
                        x: 'amount',
                        // Map the "product" column to Y axis
                        y: 'product'
                    }
                }
            ]
        };
        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

视觉通道(颜色、尺寸等)的映射

数据的各种格式

多数常见图表中,数据适于用二维表的形式描述。广为使用的数据表格软件(如 MS Excel、Numbers)或者关系数据数据库都是二维表。他们的数据可以导出成 JSON 格式,输入到 dataset.source 中,在不少情况下可以免去一些数据处理的步骤。

假如数据导出成 csv 文件,那么可以使用一些 csv 工具如 dsv 或者 PapaParse 将 csv 转成 JSON。

在 JavaScript 常用的数据传输格式中,二维数组可以比较直观的存储二维表。前面的示例都是使用二维数组表示。

除了二维数组以外,dataset 也支持例如下面 key-value 方式的数据格式,这类格式也非常常见。但是这类格式中,目前并不支持 seriesLayoutBy 参数。

dataset: [
  {
    // 按行的 key-value 形式(对象数组),这是个比较常见的格式。
    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 }
    ]
  },
  {
    // 按列的 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]
    }
  }
];

多个 dataset 以及如何引用他们

可以同时定义多个 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
    }
  ]
};

ECharts 3 的数据设置方式(series.data)仍正常使用

ECharts 4 之前一直以来的数据声明方式仍然被正常支持,如果系列已经声明了 series.data, 那么就会使用 series.data 而非 dataset

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:500px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'));

        var option = {
            title: {
                text: '黄子涵ECharts 入门示例'
            },
            xAxis: {
                type: 'category',
                data: ['HZH1', 'HZH2', 'HZH3', 'HZH4']
            },
            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]
                }
            ]
        };
        // 使用刚指定的配置项和数据显示图表。
        HZHChart.setOption(option);
    </script>
</body>

</html>

实例效果

ECharts 3 的数据设置方式

其实,series.data 也是种会一直存在的重要设置方式。一些特殊的非 table 格式的图表,如 treemapgraphlines 等,现在仍不支持在 dataset 中设置,仍然需要使用 series.data。另外,对于巨大数据量的渲染(如百万以上的数据量),需要使用 appendData 进行增量加载,这种情况不支持使用 dataset

其他

目前并非所有图表都支持 dataset。支持 dataset 的图表有: linebarpiescattereffectScatterparallelcandlestickmapfunnelcustom。 后续会有更多的图表进行支持。

最后,给出这个 示例,多个图表共享一个 dataset,并带有联动交互:

实例代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>黄子涵学习Echarts</title>
    <script src="echarts.js"></script>
</head>

<body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="huangzihan" style="width: 1000px;height:500px;"></div>

    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var HZHChart = echarts.init(document.getElementById('huangzihan'), 'dark');

        setTimeout(function () {
            option = {
                title: {
                    text: '黄子涵ECharts 入门示例'
                },
                legend: {},
                tooltip: {
                    trigger: 'axis',
                    showContent: false
                },
                dataset: {
                    source: [
                        ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
                        ['HZH1', 56.5, 82.1, 88.7, 70.1, 53.4, 85.1],
                        ['HZH2', 51.1, 51.4, 55.1, 53.3, 73.8, 68.7],
                        ['HZH3', 40.1, 62.2, 69.5, 36.4, 45.2, 32.5],
                        ['HZH4', 25.2, 37.1, 41.2, 18, 33.9, 49.1]
                    ]
                },
                xAxis: { type: 'category' },
                yAxis: { gridIndex: 0 },
                grid: { top: '55%' },
                series: [
                    {
                        type: 'line',
                        smooth: true,
                        seriesLayoutBy: 'row',
                        emphasis: { focus: 'series' }
                    },
                    {
                        type: 'line',
                        smooth: true,
                        seriesLayoutBy: 'row',
                        emphasis: { focus: 'series' }
                    },
                    {
                        type: 'line',
                        smooth: true,
                        seriesLayoutBy: 'row',
                        emphasis: { focus: 'series' }
                    },
                    {
                        type: 'line',
                        smooth: true,
                        seriesLayoutBy: 'row',
                        emphasis: { focus: 'series' }
                    },
                    {
                        type: 'pie',
                        id: 'pie',
                        radius: '30%',
                        center: ['50%', '25%'],
                        emphasis: {
                            focus: 'self'
                        },
                        label: {
                            formatter: '{b}: {@2012} ({d}%)'
                        },
                        encode: {
                            itemName: 'product',
                            value: '2012',
                            tooltip: '2012'
                        }
                    }
                ]
            };
            HZHChart.on('updateAxisPointer', function (event) {
                const xAxisInfo = event.axesInfo[0];
                if (xAxisInfo) {
                    const dimension = xAxisInfo.value + 1;
                    HZHChart.setOption({
                        series: {
                            id: 'pie',
                            label: {
                                formatter: '{b}: {@[' + dimension + ']} ({d}%)'
                            },
                            encode: {
                                value: dimension,
                                tooltip: dimension
                            }
                        }
                    });
                }
            });
            HZHChart.setOption(option);
        });
    </script>
</body>

</html>

实例结果

多个图表共享一个 dataset

posted @ 2022-04-16 18:33  黄子涵  阅读(72)  评论(0编辑  收藏  举报