You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/09/04 12:53:04 UTC

[echarts-examples] branch gh-pages updated: WIP: update more examples to ts

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/echarts-examples.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new d759480  WIP: update more examples to ts
d759480 is described below

commit d7594801837ac17c6f46dbdf1c4cc6cbac5122e6
Author: pissang <bm...@gmail.com>
AuthorDate: Sat Sep 4 20:52:25 2021 +0800

    WIP: update more examples to ts
---
 public/examples/ts/pictorialBar-hill.ts            |  114 ++
 public/examples/ts/pictorialBar-spirit.ts          |  114 ++
 public/examples/ts/pictorialBar-vehicle.ts         |  112 ++
 public/examples/ts/pictorialBar-velocity.ts        |  102 ++
 public/examples/ts/pie-alignTo.ts                  |   97 ++
 public/examples/ts/pie-borderRadius.ts             |   52 +
 public/examples/ts/pie-custom.ts                   |   72 ++
 public/examples/ts/pie-doughnut.ts                 |   46 +
 public/examples/ts/pie-labelLine-adjust.ts         |   97 ++
 public/examples/ts/pie-legend.ts                   |   82 ++
 public/examples/ts/pie-nest.ts                     |   89 ++
 public/examples/ts/pie-parliament-transition.ts    |  150 +++
 public/examples/ts/pie-pattern.ts                  |   62 +
 public/examples/ts/pie-rich-text.ts                |  137 +++
 public/examples/ts/pie-roseType-simple.ts          |   46 +
 public/examples/ts/pie-roseType.ts                 |   84 ++
 public/examples/ts/pie-simple.ts                   |   44 +
 public/examples/ts/polar-roundCap.ts               |   51 +
 public/examples/ts/radar-aqi.ts                    |  211 ++++
 public/examples/ts/radar-custom.ts                 |  133 ++
 public/examples/ts/radar-multiple.ts               |   99 ++
 public/examples/ts/radar.ts                        |   41 +
 public/examples/ts/radar2.ts                       |   74 ++
 public/examples/ts/sankey-energy.ts                |   37 +
 public/examples/ts/sankey-itemstyle.ts             | 1283 ++++++++++++++++++++
 public/examples/ts/sankey-levels.ts                |   72 ++
 public/examples/ts/sankey-nodeAlign-left.ts        |   38 +
 public/examples/ts/sankey-nodeAlign-right.ts       |   40 +
 public/examples/ts/sankey-simple.ts                |   56 +
 public/examples/ts/sankey-vertical.ts              |   49 +
 public/examples/ts/scatter-aggregate-bar.ts        |  189 +++
 public/examples/ts/scatter-anscombe-quartet.ts     |  147 +++
 public/examples/ts/scatter-aqi-color.ts            |  262 ++++
 public/examples/ts/scatter-clustering.ts           |  133 ++
 public/examples/ts/scatter-effect.ts               |   80 ++
 .../examples/ts/scatter-exponential-regression.ts  |   86 ++
 public/examples/ts/scatter-label-align-right.ts    |   58 +
 public/examples/ts/scatter-label-align-top.ts      |   53 +
 public/examples/ts/scatter-large.ts                |   72 ++
 public/examples/ts/scatter-linear-regression.ts    |  269 ++++
 .../examples/ts/scatter-logarithmic-regression.ts  |  135 ++
 public/examples/ts/scatter-map-brush.ts            |  647 ++++++++++
 public/examples/ts/scatter-matrix.ts               |  302 +++++
 src/common/store.js                                |    2 +-
 44 files changed, 6118 insertions(+), 1 deletion(-)

diff --git a/public/examples/ts/pictorialBar-hill.ts b/public/examples/ts/pictorialBar-hill.ts
new file mode 100644
index 0000000..1a66e97
--- /dev/null
+++ b/public/examples/ts/pictorialBar-hill.ts
@@ -0,0 +1,114 @@
+/*
+title: Wish List and Mountain Height
+category: pictorialBar
+titleCN: 圣诞愿望清单和山峰高度
+videoStart: 0
+videoEnd: 2000
+*/
+
+var paperDataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAAAyCAYAAACgRRKpAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB6FJREFUeNrsnE9y2zYYxUmRkig7spVdpx3Hdqb7ZNeFO2PdoD1Cj9DeoEdKbmDPeNFNW7lu0y7tRZvsYqfjWhL/qPgggoIggABIQKQkwsOhE5sQCfzw3uNHJu5sNnOaZq29RttolwfAbxgwChO9nad//4C2C7S9Sfe3uzQobqNghdoJBdIw3R8qHnvNANcA1sBUGCaV9pYC7rYBbLvbgAFpaBgmWbujlO1NA9h2wQTbcdHOoih2ZujLa7WcFtoMtUsKuFEDWL3bkAHq2GTnT+OJkyTzsXRd1/G8FoYN9vBnQ+pGZ7f7BrDqYSLbq6IdxXGM96 [...]
+
+option = {
+    backgroundColor: '#0f375f',
+    tooltip: {},
+    legend: {
+        textStyle: {color: '#ddd'}
+    },
+    xAxis: [{
+        data: ['Christmas Wish List', '', 'Qomolangma', 'Kilimanjaro'],
+        axisTick: {show: false},
+        axisLine: {show: false},
+        axisLabel: {
+            margin: 20,
+            color: '#ddd',
+            fontSize: 14
+        }
+    }],
+    yAxis: {
+        splitLine: {show: false},
+        axisTick: {show: false},
+        axisLine: {show: false},
+        axisLabel: {show: false}
+    },
+    markLine: {
+        z: -1
+    },
+    animationEasing: 'elasticOut',
+    series: [{
+        type: 'pictorialBar',
+        name: 'All',
+        emphasis: {
+            scale: true
+        },
+        label: {
+            show: true,
+            position: 'top',
+            formatter: '{c} m',
+            fontSize: 16,
+            color: '#e54035'
+        },
+        data: [{
+            value: 13000,
+            symbol: 'image://' + paperDataURI,
+            symbolRepeat: true,
+            symbolSize: ['130%', '20%'],
+            symbolOffset: [0, 10],
+            symbolMargin: '-30%',
+            animationDelay: function (dataIndex, params: any) {
+                return params.index * 30;
+            }
+        }, {
+            value: '-',
+            symbol: 'none',
+        }, {
+            value: 8844,
+            symbol: 'image://' + ROOT_PATH + '/data/asset/img/hill-Qomolangma.png',
+            symbolSize: ['200%', '105%'],
+            symbolPosition: 'end',
+            z: 10
+        }, {
+            value: 5895,
+            symbol: 'image://' + ROOT_PATH + '/data/asset/img/hill-Kilimanjaro.png',
+            symbolSize: ['200%', '105%'],
+            symbolPosition: 'end'
+        }],
+        markLine: {
+            symbol: ['none', 'none'],
+            label: {
+                show: false
+            },
+            lineStyle: {
+                color: '#e54035',
+                width: 2
+            },
+            data: [{
+                yAxis: 8844
+            }]
+        }
+    }, {
+        name: 'All',
+        type: 'pictorialBar',
+        barGap: '-100%',
+        symbol: 'circle',
+        itemStyle: {
+            color: '#185491'
+        },
+        silent: true,
+        symbolOffset: [0, '50%'],
+        z: -10,
+        data: [{
+            value: 1,
+            symbolSize: ['150%', 50]
+        }, {
+            value: '-'
+        }, {
+            value: 1,
+            symbolSize: ['200%', 50]
+        }, {
+            value: 1,
+            symbolSize: ['200%', 50]
+        }]
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pictorialBar-spirit.ts b/public/examples/ts/pictorialBar-spirit.ts
new file mode 100644
index 0000000..04a100c
--- /dev/null
+++ b/public/examples/ts/pictorialBar-spirit.ts
@@ -0,0 +1,114 @@
+/*
+title: Spirits
+category: pictorialBar
+titleCN: 精灵
+*/
+
+const spirit = 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHUAAACUCAYAAACtHGabAAAACXBIWXMAABcSAAAXEgFnn9JSAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2Mk [...]
+
+var maxData = 2000;
+
+option = {
+    tooltip: {
+    },
+    xAxis: {
+        max: maxData,
+        splitLine: {show: false},
+        offset: 10,
+        axisLine: {
+            lineStyle: {
+                color: '#999'
+            }
+        },
+        axisLabel: {
+            margin: 10
+        }
+    },
+    yAxis: {
+        data: ['2013', '2014', '2015', '2016'],
+        inverse: true,
+        axisTick: {show: false},
+        axisLine: {show: false},
+        axisLabel: {
+            margin: 10,
+            color: '#999',
+            fontSize: 16
+        }
+    },
+    grid: {
+        top: 'center',
+        height: 200,
+        left: 70,
+        right: 100
+    },
+    series: [{
+        // current data
+        type: 'pictorialBar',
+        symbol: spirit,
+        symbolRepeat: 'fixed',
+        symbolMargin: '5%',
+        symbolClip: true,
+        symbolSize: 30,
+        symbolBoundingData: maxData,
+        data: [891, 1220, 660, 1670],
+        markLine: {
+            symbol: 'none',
+            label: {
+                formatter: 'max: {c}',
+                position: 'start'
+            },
+            lineStyle: {
+                color: 'green',
+                type: 'dotted',
+                opacity: 0.2,
+                width: 2
+            },
+            data: [{
+                type: 'max'
+            }]
+        },
+        z: 10
+    }, {
+        // full data
+        type: 'pictorialBar',
+        itemStyle: {
+            opacity: 0.2
+        },
+        label: {
+            show: true,
+            formatter: function (params: any) {
+                return (params.value / maxData * 100).toFixed(1) + ' %';
+            },
+            position: 'right',
+            offset: [10, 0],
+            color: 'green',
+            fontSize: 18
+        },
+        animationDuration: 0,
+        symbolRepeat: 'fixed',
+        symbolMargin: '5%',
+        symbol: spirit,
+        symbolSize: 30,
+        symbolBoundingData: maxData,
+        data: [891, 1220, 660, 1670],
+        z: 5
+    }]
+};
+
+
+// Make dynamic data.
+function random() {
+    return +(Math.random() * (maxData - 10)).toFixed(1);
+}
+setInterval(function () {
+    const dynamicData = [random(), random(), random(), random()];
+    myChart.setOption({
+        series: [{
+            data: dynamicData.slice()
+        }, {
+            data: dynamicData.slice()
+        }]
+    })
+}, 3000)
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pictorialBar-vehicle.ts b/public/examples/ts/pictorialBar-vehicle.ts
new file mode 100644
index 0000000..eb7cb14
--- /dev/null
+++ b/public/examples/ts/pictorialBar-vehicle.ts
@@ -0,0 +1,112 @@
+/*
+title: Vehicles
+category: pictorialBar
+titleCN: 交通工具
+*/
+
+const pathSymbols = {
+    reindeer: 'path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892 c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347 c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557 c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313 c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,1 [...]
+    plane: 'path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559z M37.803,23.96 c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009 c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803z M39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076 C40.115,23.361,39.854,23.036,39.738,23.036z M39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986 s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867z M38.963 [...]
+    train: 'path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371 c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027 c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596z M27.999,30.413h-3.105v-4.141h3.105V30.413z M35.245,30.413 h-3.104v-4.141h3.104V30.413z M42.491,30.413h-3.104v-4.141h3.104V30.413z M49.736,30.413h-3.104v-4.141h3.104V30.413z  M14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35 [...]
+    ship: 'path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375 v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086z M49.6,31.84 l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84z M33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1z M22.377,14.045 h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.6 [...]
+    car: 'path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0. [...]
+};
+
+const labelSetting: echarts.PictorialBarSeriesOption['label'] = {
+    show: true,
+    position: 'right',
+    offset: [10, 0],
+    fontSize: 16
+};
+
+
+option = {
+    title: {
+        text: 'Vehicles in X City'
+    },
+    legend: {
+        data: ['2015', '2016']
+    },
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'shadow'
+        }
+    },
+    grid: {
+        containLabel: true,
+        left: 20
+    },
+    yAxis: {
+        data: ['reindeer', 'ship', 'plane', 'train', 'car'],
+        inverse: true,
+        axisLine: {show: false},
+        axisTick: {show: false},
+        axisLabel: {
+            margin: 30,
+            fontSize: 14
+        },
+        axisPointer: {
+            label: {
+                show: true,
+                margin: 30
+            }
+        }
+    },
+    xAxis: {
+        splitLine: {show: false},
+        axisLabel: {show: false},
+        axisTick: {show: false},
+        axisLine: {show: false}
+    },
+    series: [{
+        name: '2015',
+        type: 'pictorialBar',
+        label: labelSetting,
+        symbolRepeat: true,
+        symbolSize: ['80%', '60%'],
+        barCategoryGap: '40%',
+        data: [{
+            value: 157,
+            symbol: pathSymbols.reindeer
+        }, {
+            value: 21,
+            symbol: pathSymbols.ship
+        }, {
+            value: 66,
+            symbol: pathSymbols.plane
+        }, {
+            value: 78,
+            symbol: pathSymbols.train
+        }, {
+            value: 123,
+            symbol: pathSymbols.car
+        }]
+    }, {
+        name: '2016',
+        type: 'pictorialBar',
+        barGap: '10%',
+        label: labelSetting,
+        symbolRepeat: true,
+        symbolSize: ['80%', '60%'],
+        data: [{
+            value: 184,
+            symbol: pathSymbols.reindeer
+        }, {
+            value: 29,
+            symbol: pathSymbols.ship
+        }, {
+            value: 73,
+            symbol: pathSymbols.plane
+        }, {
+            value: 91,
+            symbol: pathSymbols.train
+        }, {
+            value: 95,
+            symbol: pathSymbols.car
+        }]
+    }]
+};
+
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pictorialBar-velocity.ts b/public/examples/ts/pictorialBar-velocity.ts
new file mode 100644
index 0000000..8441b98
--- /dev/null
+++ b/public/examples/ts/pictorialBar-velocity.ts
@@ -0,0 +1,102 @@
+/*
+title: Velocity of Christmas Reindeers
+category: pictorialBar
+titleCN: 驯鹿的速度
+*/
+
+const pathSymbols = {
+    reindeer: 'path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892 c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347 c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557 c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313 c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,1 [...]
+    plane: 'path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559z M37.803,23.96 c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009 c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803z M39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076 C40.115,23.361,39.854,23.036,39.738,23.036z M39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986 s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867z M38.963 [...]
+    rocket: 'path://M-244.396,44.399c0,0,0.47-2.931-2.427-6.512c2.819-8.221,3.21-15.709,3.21-15.709s5.795,1.383,5.795,7.325C-237.818,39.679-244.396,44.399-244.396,44.399z M-260.371,40.827c0,0-3.881-12.946-3.881-18.319c0-2.416,0.262-4.566,0.669-6.517h17.684c0.411,1.952,0.675,4.104,0.675,6.519c0,5.291-3.87,18.317-3.87,18.317H-260.371z M-254.745,18.951c-1.99,0-3.603,1.676-3.603,3.744c0,2.068,1.612,3.744,3.603,3.744c1.988,0,3.602-1.676,3.602-3.744S-252.757,18.951-254.745,18.951z M-255.521,2. [...]
+    train: 'path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371 c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027 c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596z M27.999,30.413h-3.105v-4.141h3.105V30.413z M35.245,30.413 h-3.104v-4.141h3.104V30.413z M42.491,30.413h-3.104v-4.141h3.104V30.413z M49.736,30.413h-3.104v-4.141h3.104V30.413z  M14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35 [...]
+    ship: 'path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375 v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086z M49.6,31.84 l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84z M33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1z M22.377,14.045 h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.6 [...]
+    car: 'path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0. [...]
+    run: 'path://M13.676,32.955c0.919-0.031,1.843-0.008,2.767-0.008v0.007c0.827,0,1.659,0.041,2.486-0.019 c0.417-0.028,1.118,0.325,1.14-0.545c0.014-0.637-0.156-1.279-0.873-1.367c-1.919-0.241-3.858-0.233-5.774,0.019 c-0.465,0.062-0.998,0.442-0.832,1.069C12.715,32.602,13.045,32.977,13.676,32.955z M14.108,29.013 c1.47-0.007,2.96-0.122,4.414,0.035c1.792,0.192,3.1-0.412,4.273-2.105c-3.044,0-5.882,0.014-8.719-0.01 c-0.768-0.005-1.495,0.118-1.461,1C12.642,28.731,13.329,29.014,14.108,29.013z M23 [...]
+    walk: 'path://M29.902,23.275c1.86,0,3.368-1.506,3.368-3.365c0-1.859-1.508-3.365-3.368-3.365 c-1.857,0-3.365,1.506-3.365,3.365C26.537,21.769,28.045,23.275,29.902,23.275z M36.867,30.74c-1.666-0.467-3.799-1.6-4.732-4.199 c-0.932-2.6-3.131-2.998-4.797-2.998s-7.098,3.894-7.098,3.894c-1.133,1.001-2.1,6.502-0.967,6.769 c1.133,0.269,1.266-1.533,1.934-3.599c0.666-2.065,3.797-3.466,3.797-3.466s0.201,2.467-0.398,3.866 c-0.599,1.399-1.133,2.866-1.467,6.198s-1.6,3.665-3.799,6.266c-2.199,2.598-0.6 [...]
+};
+
+option = {
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'none'
+        },
+        formatter: function (params: any) {
+            return params[0].name + ': ' + params[0].value;
+        }
+    },
+    xAxis: {
+        data: ['驯鹿', '火箭', '飞机', '高铁', '轮船', '汽车', '跑步', '步行'],
+        axisTick: {show: false},
+        axisLine: {show: false},
+        axisLabel: {
+            color: '#e54035'
+        }
+    },
+    yAxis: {
+        splitLine: {show: false},
+        axisTick: {show: false},
+        axisLine: {show: false},
+        axisLabel: {show: false}
+    },
+    color: ['#e54035'],
+    series: [{
+        name: 'hill',
+        type: 'pictorialBar',
+        barCategoryGap: '-130%',
+        // symbol: 'path://M0,10 L10,10 L5,0 L0,10 z',
+        symbol: 'path://M0,10 L10,10 C5.5,10 5.5,5 5,0 C4.5,5 4.5,10 0,10 z',
+        itemStyle: {
+            opacity: 0.5
+        },
+        emphasis: {
+            itemStyle: {
+                opacity: 1
+            }
+        },
+        data: [123, 60, 25, 18, 12, 9, 2, 1],
+        z: 10
+    }, {
+        name: 'glyph',
+        type: 'pictorialBar',
+        barGap: '-100%',
+        symbolPosition: 'end',
+        symbolSize: 50,
+        symbolOffset: [0, '-120%'],
+        data: [{
+            value: 123,
+            symbol: pathSymbols.reindeer,
+            symbolSize: [60, 60]
+        }, {
+            value: 60,
+            symbol: pathSymbols.rocket,
+            symbolSize: [50, 60]
+        }, {
+            value: 25,
+            symbol: pathSymbols.plane,
+            symbolSize: [65, 35]
+        }, {
+            value: 18,
+            symbol: pathSymbols.train,
+            symbolSize: [50, 30]
+        }, {
+            value: 12,
+            symbol: pathSymbols.ship,
+            symbolSize: [50, 35]
+        }, {
+            value: 9,
+            symbol: pathSymbols.car,
+            symbolSize: [40, 30]
+        }, {
+            value: 2,
+            symbol: pathSymbols.run,
+            symbolSize: [40, 50]
+        }, {
+            value: 1,
+            symbol: pathSymbols.walk,
+            symbolSize: [40, 50]
+        }]
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-alignTo.ts b/public/examples/ts/pie-alignTo.ts
new file mode 100644
index 0000000..4dd9062
--- /dev/null
+++ b/public/examples/ts/pie-alignTo.ts
@@ -0,0 +1,97 @@
+/*
+title: Pie Label Align
+category: pie
+titleCN: 饼图标签对齐
+difficulty: 3
+*/
+
+const data = [{
+    name: 'Apples',
+    value: 70
+}, {
+    name: 'Strawberries',
+    value: 68
+}, {
+    name: 'Bananas',
+    value: 48
+}, {
+    name: 'Oranges',
+    value: 40
+}, {
+    name: 'Pears',
+    value: 32
+}, {
+    name: 'Pineapples',
+    value: 27
+}, {
+    name: 'Grapes',
+    value: 18
+}];
+
+option = {
+    title: [{
+        text: 'Pie label alignTo',
+        left: 'center',
+    }, {
+        subtext: 'alignTo: "none" (default)',
+        left: '16.67%',
+        top: '75%',
+        textAlign: 'center'
+    }, {
+        subtext: 'alignTo: "labelLine"',
+        left: '50%',
+        top: '75%',
+        textAlign: 'center'
+    }, {
+        subtext: 'alignTo: "edge"',
+        left: '83.33%',
+        top: '75%',
+        textAlign: 'center'
+    }],
+    series: [{
+        type: 'pie',
+        radius: '25%',
+        center: ['50%', '50%'],
+        data: data,
+        label: {
+            position: 'outer',
+            alignTo: 'none',
+            bleedMargin: 5
+        },
+        left: 0,
+        right: '66.6667%',
+        top: 0,
+        bottom: 0
+    }, {
+        type: 'pie',
+        radius: '25%',
+        center: ['50%', '50%'],
+        data: data,
+        label: {
+            position: 'outer',
+            alignTo: 'labelLine',
+            bleedMargin: 5
+        },
+        left: '33.3333%',
+        right: '33.3333%',
+        top: 0,
+        bottom: 0
+    }, {
+        type: 'pie',
+        radius: '25%',
+        center: ['50%', '50%'],
+        data: data,
+        label: {
+            position: 'outer',
+            alignTo: 'edge',
+            margin: 20
+        },
+        left: '66.6667%',
+        right: 0,
+        top: 0,
+        bottom: 0
+    }]
+};
+
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-borderRadius.ts b/public/examples/ts/pie-borderRadius.ts
new file mode 100644
index 0000000..7e32a4a
--- /dev/null
+++ b/public/examples/ts/pie-borderRadius.ts
@@ -0,0 +1,52 @@
+/*
+title: Doughnut Chart with Rounded Corner
+category: pie
+titleCN: 圆角环形图
+difficulty: 1
+*/
+
+option = {
+    tooltip: {
+        trigger: 'item'
+    },
+    legend: {
+        top: '5%',
+        left: 'center'
+    },
+    series: [
+        {
+            name: 'Access From',
+            type: 'pie',
+            radius: ['40%', '70%'],
+            avoidLabelOverlap: false,
+            itemStyle: {
+                borderRadius: 10,
+                borderColor: '#fff',
+                borderWidth: 2
+            },
+            label: {
+                show: false,
+                position: 'center'
+            },
+            emphasis: {
+                label: {
+                    show: true,
+                    fontSize: '40',
+                    fontWeight: 'bold'
+                }
+            },
+            labelLine: {
+                show: false
+            },
+            data: [
+                {value: 1048, name: 'Search Engine'},
+                {value: 735, name: 'Direct'},
+                {value: 580, name: 'Email'},
+                {value: 484, name: 'Union Ads'},
+                {value: 300, name: 'Video Ads'}
+            ]
+        }
+    ]
+};
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/pie-custom.ts b/public/examples/ts/pie-custom.ts
new file mode 100644
index 0000000..ca0aafa
--- /dev/null
+++ b/public/examples/ts/pie-custom.ts
@@ -0,0 +1,72 @@
+/*
+title: Customized Pie
+category: pie
+titleCN: 饼图自定义样式
+difficulty: 2
+*/
+
+option = {
+    backgroundColor: '#2c343c',
+
+    title: {
+        text: 'Customized Pie',
+        left: 'center',
+        top: 20,
+        textStyle: {
+            color: '#ccc'
+        }
+    },
+
+    tooltip: {
+        trigger: 'item'
+    },
+
+    visualMap: {
+        show: false,
+        min: 80,
+        max: 600,
+        inRange: {
+            colorLightness: [0, 1]
+        }
+    },
+    series: [
+        {
+            name: 'Access From',
+            type: 'pie',
+            radius: '55%',
+            center: ['50%', '50%'],
+            data: [
+                {value: 335, name: 'Direct'},
+                {value: 310, name: 'Email'},
+                {value: 274, name: 'Union Ads'},
+                {value: 235, name: 'Video Ads'},
+                {value: 400, name: 'Search Engine'}
+            ].sort(function (a, b) { return a.value - b.value; }),
+            roseType: 'radius',
+            label: {
+                color: 'rgba(255, 255, 255, 0.3)'
+            },
+            labelLine: {
+                lineStyle: {
+                    color: 'rgba(255, 255, 255, 0.3)'
+                },
+                smooth: 0.2,
+                length: 10,
+                length2: 20
+            },
+            itemStyle: {
+                color: '#c23531',
+                shadowBlur: 200,
+                shadowColor: 'rgba(0, 0, 0, 0.5)'
+            },
+
+            animationType: 'scale',
+            animationEasing: 'elasticOut',
+            animationDelay: function (idx) {
+                return Math.random() * 200;
+            }
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-doughnut.ts b/public/examples/ts/pie-doughnut.ts
new file mode 100644
index 0000000..584cf11
--- /dev/null
+++ b/public/examples/ts/pie-doughnut.ts
@@ -0,0 +1,46 @@
+/*
+title: Doughnut Chart
+category: pie
+titleCN: 环形图
+difficulty: 1
+*/
+
+option = {
+    tooltip: {
+        trigger: 'item'
+    },
+    legend: {
+        top: '5%',
+        left: 'center'
+    },
+    series: [
+        {
+            name: 'Access From',
+            type: 'pie',
+            radius: ['40%', '70%'],
+            avoidLabelOverlap: false,
+            label: {
+                show: false,
+                position: 'center'
+            },
+            emphasis: {
+                label: {
+                    show: true,
+                    fontSize: '40',
+                    fontWeight: 'bold'
+                }
+            },
+            labelLine: {
+                show: false
+            },
+            data: [
+                {value: 1048, name: 'Search Engine'},
+                {value: 735, name: 'Direct'},
+                {value: 580, name: 'Email'},
+                {value: 484, name: 'Union Ads'},
+                {value: 300, name: 'Video Ads'}
+            ]
+        }
+    ]
+};
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-labelLine-adjust.ts b/public/examples/ts/pie-labelLine-adjust.ts
new file mode 100644
index 0000000..fad5631
--- /dev/null
+++ b/public/examples/ts/pie-labelLine-adjust.ts
@@ -0,0 +1,97 @@
+/*
+title: Label Line Adjust
+category: pie
+titleCN: 饼图引导线调整
+difficulty: 3
+*/
+
+var datas = [
+    ////////////////////////////////////////
+    [
+        { name: '圣彼得堡来客', value: 5.6 },
+        { name: '陀思妥耶夫斯基全集', value: 1 },
+        { name: '史记精注全译(全6册)', value: 0.8 },
+        { name: '加德纳艺术通史', value: 0.5 },
+        { name: '表象与本质', value: 0.5 },
+        { name: '其它', value: 3.8 }
+    ],
+    // ////////////////////////////////////////
+    [
+        { name: '银河帝国5:迈向基地', value: 3.8 },
+        { name: '俞军产品方法论', value: 2.3 },
+        { name: '艺术的逃难', value: 2.2 },
+        { name: '第一次世界大战回忆录(全五卷)', value: 1.3 },
+        { name: 'Scrum 精髓', value: 1.2 },
+        { name: '其它', value: 5.7 }
+    ],
+
+    ////////////////////////////////////////
+    [
+        { name: '克莱因壶', value: 3.5 },
+        { name: '投资最重要的事', value: 2.8 },
+        { name: '简读中国史', value: 1.7 },
+        { name: '你当像鸟飞往你的山', value: 1.4 },
+        { name: '表象与本质', value: 0.5 },
+        { name: '其它', value: 3.8 }
+    ]
+];
+
+option = {
+    title: {
+        text: '阅读书籍分布',
+        left: 'center',
+        textStyle: {
+            color: '#999',
+            fontWeight: 'normal',
+            fontSize: 14
+        }
+    },
+    series: datas.map(function (data, idx) {
+        var top = idx * 33.3;
+        return {
+            type: 'pie',
+            radius: [20, 60],
+            top: top + '%',
+            height: '33.33%',
+            left: 'center',
+            width: 400,
+            itemStyle: {
+                borderColor: '#fff',
+                borderWidth: 1
+            },
+            label: {
+                alignTo: 'edge',
+                formatter: '{name|{b}}\n{time|{c} 小时}',
+                minMargin: 5,
+                edgeDistance: 10,
+                lineHeight: 15,
+                rich: {
+                    time: {
+                        fontSize: 10,
+                        color: '#999'
+                    }
+                }
+            },
+            labelLine: {
+                length: 15,
+                length2: 0,
+                maxSurfaceAngle: 80
+            },
+            labelLayout: function (params) {
+                const isLeft = params.labelRect.x < myChart.getWidth() / 2;
+                const points = params.labelLinePoints as number[][];
+                // Update the end point.
+                points[2][0] = isLeft
+                    ? params.labelRect.x
+                    : params.labelRect.x + params.labelRect.width;
+
+                return {
+                    labelLinePoints: points
+                };
+            },
+            data: data
+        }
+    })
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-legend.ts b/public/examples/ts/pie-legend.ts
new file mode 100644
index 0000000..7db34c8
--- /dev/null
+++ b/public/examples/ts/pie-legend.ts
@@ -0,0 +1,82 @@
+/*
+title: Pie with Scrollable Legend
+category: pie
+titleCN: 可滚动的图例
+difficulty: 4
+*/
+
+const data = genData(50);
+
+option = {
+    title: {
+        text: '同名数量统计',
+        subtext: '纯属虚构',
+        left: 'center'
+    },
+    tooltip: {
+        trigger: 'item',
+        formatter: '{a} <br/>{b} : {c} ({d}%)'
+    },
+    legend: {
+        type: 'scroll',
+        orient: 'vertical',
+        right: 10,
+        top: 20,
+        bottom: 20,
+        data: data.legendData
+    },
+    series: [
+        {
+            name: '姓名',
+            type: 'pie',
+            radius: '55%',
+            center: ['40%', '50%'],
+            data: data.seriesData,
+            emphasis: {
+                itemStyle: {
+                    shadowBlur: 10,
+                    shadowOffsetX: 0,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            }
+        }
+    ]
+};
+
+
+
+
+function genData(count: number) {
+    const nameList = [
+        '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', [...]
+    ];
+    const legendData = [];
+    const seriesData = [];
+    for (var i = 0; i < count; i++) {
+        var name = Math.random() > 0.65
+            ? makeWord(4, 1) + '·' + makeWord(3, 0)
+            : makeWord(2, 1);
+        legendData.push(name);
+        seriesData.push({
+            name: name,
+            value: Math.round(Math.random() * 100000)
+        });
+    }
+
+    return {
+        legendData: legendData,
+        seriesData: seriesData
+    };
+
+    function makeWord(max: number, min: number) {
+        const nameLen = Math.ceil(Math.random() * max + min);
+        const name = [];
+        for (var i = 0; i < nameLen; i++) {
+            name.push(nameList[Math.round(Math.random() * nameList.length - 1)]);
+        }
+        return name.join('');
+    }
+}
+
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-nest.ts b/public/examples/ts/pie-nest.ts
new file mode 100644
index 0000000..90e7374
--- /dev/null
+++ b/public/examples/ts/pie-nest.ts
@@ -0,0 +1,89 @@
+/*
+title: Nested Pies
+category: 'pie, rich'
+titleCN: 嵌套环形图
+difficulty: 5
+*/
+
+option = {
+    tooltip: {
+        trigger: 'item',
+        formatter: '{a} <br/>{b}: {c} ({d}%)'
+    },
+    legend: {
+        data: ['Direct', 'Marketing', 'Search Engine', 'Email', 'Union Ads', 'Video Ads', 'Baidu', 'Google', 'Bing', 'Others']
+    },
+    series: [
+        {
+            name: 'Access From',
+            type: 'pie',
+            selectedMode: 'single',
+            radius: [0, '30%'],
+            label: {
+                position: 'inner',
+                fontSize: 14,
+            },
+            labelLine: {
+                show: false
+            },
+            data: [
+                {value: 1548, name: 'Search Engine'},
+                {value: 775, name: 'Direct'},
+                {value: 679, name: 'Marketing', selected: true}
+            ]
+        },
+        {
+            name: 'Access From',
+            type: 'pie',
+            radius: ['45%', '60%'],
+            labelLine: {
+                length: 30,
+            },
+            label: {
+                formatter: '{a|{a}}{abg|}\n{hr|}\n  {b|{b}:}{c}  {per|{d}%}  ',
+                backgroundColor: '#F6F8FC',
+                borderColor: '#8C8D8E',
+                borderWidth: 1,
+                borderRadius: 4,
+
+                rich: {
+                    a: {
+                        color: '#6E7079',
+                        lineHeight: 22,
+                        align: 'center'
+                    },
+                    hr: {
+                        borderColor: '#8C8D8E',
+                        width: '100%',
+                        borderWidth: 1,
+                        height: 0
+                    },
+                    b: {
+                        color: '#4C5058',
+                        fontSize: 14,
+                        fontWeight: 'bold',
+                        lineHeight: 33
+                    },
+                    per: {
+                        color: '#fff',
+                        backgroundColor: '#4C5058',
+                        padding: [3, 4],
+                        borderRadius: 4
+                    }
+                }
+            },
+            data: [
+                {value: 1048, name: 'Baidu'},
+                {value: 335, name: 'Direct'},
+                {value: 310, name: 'Email'},
+                {value: 251, name: 'Google'},
+                {value: 234, name: 'Union Ads'},
+                {value: 147, name: 'Bing'},
+                {value: 135, name: 'Video Ads'},
+                {value: 102, name: 'Others'}
+            ]
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-parliament-transition.ts b/public/examples/ts/pie-parliament-transition.ts
new file mode 100644
index 0000000..36727b9
--- /dev/null
+++ b/public/examples/ts/pie-parliament-transition.ts
@@ -0,0 +1,150 @@
+/*
+title: Transition of Parliament and Pie Chart
+category: custom, animtion
+titleCN: 自定义议会图与饼图过渡动画
+difficulty: 10
+videoStart: 1000
+videoEnd: 6000
+*/
+
+const data = [
+    { value: 800, name: 'A' },
+    { value: 635, name: 'B' },
+    { value: 580, name: 'C' },
+    { value: 484, name: 'D' },
+    { value: 300, name: 'E' },
+    { value: 200, name: 'F' }
+];
+
+const defaultPalette = [
+    // '#51689b', '#ce5c5c', '#fbc357', '#8fbf8f', '#659d84', '#fb8e6a', '#c77288', '#786090', '#91c4c5', '#6890ba'
+    '#5470c6',
+    '#91cc75',
+    '#fac858',
+    '#ee6666',
+    '#73c0de',
+    '#3ba272',
+    '#fc8452',
+    '#9a60b4',
+    '#ea7ccc'
+];
+
+const radius = ['30%', '80%'];
+
+const pieOption: echarts.EChartsOption = {
+    series: [{
+        type: 'pie',
+        id: 'distribution',
+        radius: radius,
+        label: {
+            show: false
+        },
+        universalTransition: true,
+        animationDurationUpdate: 1000,
+        data: data
+    }]
+};
+
+
+const parliamentOption = (function () {
+    let sum = data.reduce(function (sum, cur) {
+        return sum + cur.value;
+    }, 0);
+
+    let angles: number[] = [];
+    let startAngle = -Math.PI / 2;
+    let curAngle = startAngle;
+    data.forEach(function (item) {
+        angles.push(curAngle);
+        curAngle += (item.value / sum) * Math.PI * 2;
+    });
+    angles.push(startAngle + Math.PI * 2);
+    function parliamentLayout(
+        startAngle: number,
+        endAngle: number,
+        totalAngle: number,
+        r0: number,
+        r1: number,
+        size: number
+    ) {
+        let rowsCount = Math.ceil((r1 - r0) / size);
+        let points = [];
+
+        let r = r0;
+        for (let i = 0; i < rowsCount; i++) {
+            // Recalculate size
+            let totalRingSeatsNumber = Math.round((totalAngle * r) / size);
+            let newSize = (totalAngle * r) / totalRingSeatsNumber;
+            for (
+                let k = Math.floor((startAngle * r) / newSize) * newSize;
+                k < Math.floor((endAngle * r) / newSize) * newSize - 1e-6;
+                k += newSize
+            ) {
+                let angle = k / r;
+                let x = Math.cos(angle) * r;
+                let y = Math.sin(angle) * r;
+                points.push([x, y]);
+            }
+
+            r += size;
+        }
+
+        return points;
+    }
+    return {
+        series: {
+            type: 'custom',
+            id: 'distribution',
+            data: data,
+            coordinateSystem: undefined,
+            universalTransition: true,
+            animationDurationUpdate: 1000,
+            renderItem: function (params, api) {
+                var idx = params.dataIndex;
+                var viewSize = Math.min(api.getWidth(), api.getHeight());
+                var r0 = ((parseFloat(radius[0]) / 100) * viewSize) / 2;
+                var r1 = ((parseFloat(radius[1]) / 100) * viewSize) / 2;
+                var cx = api.getWidth() * 0.5;
+                var cy = api.getHeight() * 0.5;
+                var size = viewSize / 50;
+
+                var points = parliamentLayout(
+                    angles[idx],
+                    angles[idx + 1],
+                    Math.PI * 2,
+                    r0,
+                    r1,
+                    size + 3
+                );
+
+                return {
+                    type: 'group',
+                    children: points.map(function (pt) {
+                        return {
+                            type: 'circle',
+                            autoBatch: true,
+                            shape: {
+                                cx: cx + pt[0],
+                                cy: cy + pt[1],
+                                r: size / 2
+                            },
+                            style: {
+                                fill: defaultPalette[idx % defaultPalette.length]
+                            }
+                        };
+                    })
+                };
+            }
+        }
+    } as echarts.EChartsOption;
+})();
+
+
+let currentOption = option = pieOption;
+
+setInterval(function () {
+    currentOption = currentOption === pieOption ? parliamentOption : pieOption;
+    myChart.setOption(currentOption);
+}, 2000);
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-pattern.ts b/public/examples/ts/pie-pattern.ts
new file mode 100644
index 0000000..392c884
--- /dev/null
+++ b/public/examples/ts/pie-pattern.ts
@@ -0,0 +1,62 @@
+/*
+title: Texture on Pie Chart
+category: pie
+titleCN: 饼图纹理
+difficulty: 2
+*/
+
+const piePatternSrc = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMA [...]
+const bgPatternSrc = 'data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAC9+ElEQVR42pSd2Y7kSHJF6/9/TVLPaCQ9qmvJjJ2MYERmdY/edO49EYbCAJIggGAySV/Mzc1td48vx8uZ67Rebx8f959/XK63z7//1/XxsW738/Z49M3ltt0+Pj/+/DvvufPm8cef76fL+Xo7r9ft4+Oyrut244GSl+uVwsv98/p42A7/blT/48/rPW9oc39e6YtP98+fvDkvl+P5TPXTsjz++OOwXKlLLynw8+ft8bF9/uR5vT/o98BToVq2O23eUutCRV4u23a4XOmLr9SyX+pS67ws6317O53P63Jazsvt9n7YHU7parmu++Nh2W5ff7ydrwslKQ8AhWelHVu73D94zzNgMBBaXm6bYxQq3gMD+AEnwMZX3q8tSV3uvAc/tA [...]
+
+const piePatternImg = new Image();
+piePatternImg.src = piePatternSrc;
+const bgPatternImg = new Image();
+bgPatternImg.src = bgPatternSrc;
+
+option = {
+    backgroundColor: {
+        image: bgPatternImg,
+        repeat: 'repeat'
+    },
+    title: {
+        text: '饼图纹理',
+        textStyle: {
+            color: '#235894'
+        }
+    },
+    tooltip: {},
+    series: [{
+        name: 'pie',
+        type: 'pie',
+        selectedMode: 'single',
+        selectedOffset: 30,
+        clockwise: true,
+        label: {
+            fontSize: 18,
+            color: '#235894'
+        },
+        labelLine: {
+            lineStyle: {
+                color: '#235894'
+            }
+        },
+        data: [
+            {value: 1048, name: 'Search Engine'},
+            {value: 735, name: 'Direct'},
+            {value: 580, name: 'Email'},
+            {value: 484, name: 'Union Ads'},
+            {value: 300, name: 'Video Ads'}
+        ],
+        itemStyle: {
+            opacity: 0.7,
+            color: {
+                image: piePatternImg,
+                repeat: 'repeat'
+            },
+            borderWidth: 3,
+            borderColor: '#235894'
+        }
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-rich-text.ts b/public/examples/ts/pie-rich-text.ts
new file mode 100644
index 0000000..c3928d5
--- /dev/null
+++ b/public/examples/ts/pie-rich-text.ts
@@ -0,0 +1,137 @@
+/*
+title: Pie Special Label
+category: 'pie, rich'
+titleCN: 富文本标签
+difficulty: 4
+*/
+
+const weatherIcons = {
+    'Sunny': ROOT_PATH + '/data/asset/img/weather/sunny_128.png',
+    'Cloudy': ROOT_PATH + '/data/asset/img/weather/cloudy_128.png',
+    'Showers': ROOT_PATH + '/data/asset/img/weather/showers_128.png'
+};
+
+option = {
+    title: {
+        text: 'Weather Statistics',
+        subtext: 'Fake Data',
+        left: 'center'
+    },
+    tooltip: {
+        trigger: 'item',
+        formatter: '{a} <br/>{b} : {c} ({d}%)'
+    },
+    legend: {
+        bottom: 10,
+        left: 'center',
+        data: ['CityA', 'CityB', 'CityD', 'CityC', 'CityE']
+    },
+    series: [
+        {
+            type: 'pie',
+            radius: '65%',
+            center: ['50%', '50%'],
+            selectedMode: 'single',
+            data: [
+                {
+                    value: 1548,
+                    name: 'CityE',
+                    label: {
+                        formatter: [
+                            '{title|{b}}{abg|}',
+                            '  {weatherHead|Weather}{valueHead|Days}{rateHead|Percent}',
+                            '{hr|}',
+                            '  {Sunny|}{value|202}{rate|55.3%}',
+                            '  {Cloudy|}{value|142}{rate|38.9%}',
+                            '  {Showers|}{value|21}{rate|5.8%}'
+                        ].join('\n'),
+                        backgroundColor: '#eee',
+                        borderColor: '#777',
+                        borderWidth: 1,
+                        borderRadius: 4,
+                        rich: {
+                            title: {
+                                color: '#eee',
+                                align: 'center'
+                            },
+                            abg: {
+                                backgroundColor: '#333',
+                                width: '100%',
+                                align: 'right',
+                                height: 25,
+                                borderRadius: [4, 4, 0, 0]
+                            },
+                            Sunny: {
+                                height: 30,
+                                align: 'left',
+                                backgroundColor: {
+                                    image: weatherIcons.Sunny
+                                }
+                            },
+                            Cloudy: {
+                                height: 30,
+                                align: 'left',
+                                backgroundColor: {
+                                    image: weatherIcons.Cloudy
+                                }
+                            },
+                            Showers: {
+                                height: 30,
+                                align: 'left',
+                                backgroundColor: {
+                                    image: weatherIcons.Showers
+                                }
+                            },
+                            weatherHead: {
+                                color: '#333',
+                                height: 24,
+                                align: 'left'
+                            },
+                            hr: {
+                                borderColor: '#777',
+                                width: '100%',
+                                borderWidth: 0.5,
+                                height: 0
+                            },
+                            value: {
+                                width: 20,
+                                padding: [0, 20, 0, 30],
+                                align: 'left'
+                            },
+                            valueHead: {
+                                color: '#333',
+                                width: 20,
+                                padding: [0, 20, 0, 30],
+                                align: 'center'
+                            },
+                            rate: {
+                                width: 40,
+                                align: 'right',
+                                padding: [0, 10, 0, 0]
+                            },
+                            rateHead: {
+                                color: '#333',
+                                width: 40,
+                                align: 'center',
+                                padding: [0, 10, 0, 0]
+                            }
+                        }
+                    }
+                },
+                {value: 735, name: 'CityC'},
+                {value: 510, name: 'CityD'},
+                {value: 434, name: 'CityB'},
+                {value: 335, name: 'CityA'}
+            ],
+            emphasis: {
+                itemStyle: {
+                    shadowBlur: 10,
+                    shadowOffsetX: 0,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            }
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-roseType-simple.ts b/public/examples/ts/pie-roseType-simple.ts
new file mode 100644
index 0000000..ac16725
--- /dev/null
+++ b/public/examples/ts/pie-roseType-simple.ts
@@ -0,0 +1,46 @@
+/*
+title: Nightingale Chart
+category: pie
+titleCN: 基础南丁格尔玫瑰图
+shotWidth: 800
+difficulty: 2
+*/
+
+option = {
+    legend: {
+        top: 'bottom'
+    },
+    toolbox: {
+        show: true,
+        feature: {
+            mark: {show: true},
+            dataView: {show: true, readOnly: false},
+            restore: {show: true},
+            saveAsImage: {show: true}
+        }
+    },
+    series: [
+        {
+            name: 'Nightingale Chart',
+            type: 'pie',
+            radius: [50, 250],
+            center: ['50%', '50%'],
+            roseType: 'area',
+            itemStyle: {
+                borderRadius: 8
+            },
+            data: [
+                {value: 40, name: 'rose 1'},
+                {value: 38, name: 'rose 2'},
+                {value: 32, name: 'rose 3'},
+                {value: 30, name: 'rose 4'},
+                {value: 28, name: 'rose 5'},
+                {value: 26, name: 'rose 6'},
+                {value: 22, name: 'rose 7'},
+                {value: 18, name: 'rose 8'}
+            ]
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-roseType.ts b/public/examples/ts/pie-roseType.ts
new file mode 100644
index 0000000..1315ab9
--- /dev/null
+++ b/public/examples/ts/pie-roseType.ts
@@ -0,0 +1,84 @@
+/*
+title: Nightingale Chart
+category: pie
+titleCN: 南丁格尔玫瑰图
+difficulty: 2
+*/
+
+option = {
+    title: {
+        text: 'Nightingale Chart',
+        subtext: 'Fake Data',
+        left: 'center'
+    },
+    tooltip: {
+        trigger: 'item',
+        formatter: '{a} <br/>{b} : {c} ({d}%)'
+    },
+    legend: {
+        left: 'center',
+        top: 'bottom',
+        data: ['rose1', 'rose2', 'rose3', 'rose4', 'rose5', 'rose6', 'rose7', 'rose8']
+    },
+    toolbox: {
+        show: true,
+        feature: {
+            mark: {show: true},
+            dataView: {show: true, readOnly: false},
+            restore: {show: true},
+            saveAsImage: {show: true}
+        }
+    },
+    series: [
+        {
+            name: 'Radius Mode',
+            type: 'pie',
+            radius: [20, 140],
+            center: ['25%', '50%'],
+            roseType: 'radius',
+            itemStyle: {
+                borderRadius: 5
+            },
+            label: {
+                show: false
+            },
+            emphasis: {
+                label: {
+                    show: true
+                }
+            },
+            data: [
+                {value: 40, name: 'rose 1'},
+                {value: 33, name: 'rose 2'},
+                {value: 28, name: 'rose 3'},
+                {value: 22, name: 'rose 4'},
+                {value: 20, name: 'rose 5'},
+                {value: 15, name: 'rose 6'},
+                {value: 12, name: 'rose 7'},
+                {value: 10, name: 'rose 8'}
+            ]
+        },
+        {
+            name: 'Area Mode',
+            type: 'pie',
+            radius: [20, 140],
+            center: ['75%', '50%'],
+            roseType: 'area',
+            itemStyle: {
+                borderRadius: 5
+            },
+            data: [
+                {value: 30, name: 'rose 1'},
+                {value: 28, name: 'rose 2'},
+                {value: 26, name: 'rose 3'},
+                {value: 24, name: 'rose 4'},
+                {value: 22, name: 'rose 5'},
+                {value: 20, name: 'rose 6'},
+                {value: 18, name: 'rose 7'},
+                {value: 16, name: 'rose 8'}
+            ]
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/pie-simple.ts b/public/examples/ts/pie-simple.ts
new file mode 100644
index 0000000..7002ef5
--- /dev/null
+++ b/public/examples/ts/pie-simple.ts
@@ -0,0 +1,44 @@
+/*
+title: Referer of a Website
+category: pie
+titleCN: 某站点用户Access From
+difficulty: 0
+*/
+
+option = {
+    title: {
+        text: 'Referer of a Website',
+        subtext: 'Fake Data',
+        left: 'center'
+    },
+    tooltip: {
+        trigger: 'item'
+    },
+    legend: {
+        orient: 'vertical',
+        left: 'left',
+    },
+    series: [
+        {
+            name: 'Access From',
+            type: 'pie',
+            radius: '50%',
+            data: [
+                {value: 1048, name: 'Search Engine'},
+                {value: 735, name: 'Direct'},
+                {value: 580, name: 'Email'},
+                {value: 484, name: 'Union Ads'},
+                {value: 300, name: 'Video Ads'}
+            ],
+            emphasis: {
+                itemStyle: {
+                    shadowBlur: 10,
+                    shadowOffsetX: 0,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            }
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/polar-roundCap.ts b/public/examples/ts/polar-roundCap.ts
new file mode 100644
index 0000000..7797749
--- /dev/null
+++ b/public/examples/ts/polar-roundCap.ts
@@ -0,0 +1,51 @@
+/*
+title: Rounded Bar on Polar
+category: bar
+titleCN: 圆角环形图
+difficulty: 7
+*/
+
+option = {
+    angleAxis: {
+        max: 2,
+        startAngle: 30,
+        splitLine: {
+            show: false
+        }
+    },
+    radiusAxis: {
+        type: 'category',
+        data: ['v', 'w', 'x', 'y', 'z'],
+        z: 10
+    },
+    polar: {
+    },
+    series: [{
+        type: 'bar',
+        data: [4, 3, 2, 1, 0],
+        coordinateSystem: 'polar',
+        name: 'Without Round Cap',
+        itemStyle: {
+            borderColor: 'red',
+            opacity: 0.8,
+            borderWidth: 1
+        }
+    }, {
+        type: 'bar',
+        data: [4, 3, 2, 1, 0],
+        coordinateSystem: 'polar',
+        name: 'With Round Cap',
+        roundCap: true,
+        itemStyle: {
+            borderColor: 'green',
+            opacity: 0.8,
+            borderWidth: 1
+        }
+    }],
+    legend: {
+        show: true,
+        data: ['Without Round Cap', 'With Round Cap']
+    }
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/radar-aqi.ts b/public/examples/ts/radar-aqi.ts
new file mode 100644
index 0000000..664fcdb
--- /dev/null
+++ b/public/examples/ts/radar-aqi.ts
@@ -0,0 +1,211 @@
+/*
+title: AQI - Radar Chart
+category: radar
+titleCN: AQI - 雷达图
+difficulty: 1
+*/
+
+// Schema:
+// date,AQIindex,PM2.5,PM10,CO,NO2,SO2
+const dataBJ = [
+    [55,9,56,0.46,18,6,1],
+    [25,11,21,0.65,34,9,2],
+    [56,7,63,0.3,14,5,3],
+    [33,7,29,0.33,16,6,4],
+    [42,24,44,0.76,40,16,5],
+    [82,58,90,1.77,68,33,6],
+    [74,49,77,1.46,48,27,7],
+    [78,55,80,1.29,59,29,8],
+    [267,216,280,4.8,108,64,9],
+    [185,127,216,2.52,61,27,10],
+    [39,19,38,0.57,31,15,11],
+    [41,11,40,0.43,21,7,12],
+    [64,38,74,1.04,46,22,13],
+    [108,79,120,1.7,75,41,14],
+    [108,63,116,1.48,44,26,15],
+    [33,6,29,0.34,13,5,16],
+    [94,66,110,1.54,62,31,17],
+    [186,142,192,3.88,93,79,18],
+    [57,31,54,0.96,32,14,19],
+    [22,8,17,0.48,23,10,20],
+    [39,15,36,0.61,29,13,21],
+    [94,69,114,2.08,73,39,22],
+    [99,73,110,2.43,76,48,23],
+    [31,12,30,0.5,32,16,24],
+    [42,27,43,1,53,22,25],
+    [154,117,157,3.05,92,58,26],
+    [234,185,230,4.09,123,69,27],
+    [160,120,186,2.77,91,50,28],
+    [134,96,165,2.76,83,41,29],
+    [52,24,60,1.03,50,21,30],
+    [46,5,49,0.28,10,6,31]
+];
+
+const dataGZ = [
+    [26,37,27,1.163,27,13,1],
+    [85,62,71,1.195,60,8,2],
+    [78,38,74,1.363,37,7,3],
+    [21,21,36,0.634,40,9,4],
+    [41,42,46,0.915,81,13,5],
+    [56,52,69,1.067,92,16,6],
+    [64,30,28,0.924,51,2,7],
+    [55,48,74,1.236,75,26,8],
+    [76,85,113,1.237,114,27,9],
+    [91,81,104,1.041,56,40,10],
+    [84,39,60,0.964,25,11,11],
+    [64,51,101,0.862,58,23,12],
+    [70,69,120,1.198,65,36,13],
+    [77,105,178,2.549,64,16,14],
+    [109,68,87,0.996,74,29,15],
+    [73,68,97,0.905,51,34,16],
+    [54,27,47,0.592,53,12,17],
+    [51,61,97,0.811,65,19,18],
+    [91,71,121,1.374,43,18,19],
+    [73,102,182,2.787,44,19,20],
+    [73,50,76,0.717,31,20,21],
+    [84,94,140,2.238,68,18,22],
+    [93,77,104,1.165,53,7,23],
+    [99,130,227,3.97,55,15,24],
+    [146,84,139,1.094,40,17,25],
+    [113,108,137,1.481,48,15,26],
+    [81,48,62,1.619,26,3,27],
+    [56,48,68,1.336,37,9,28],
+    [82,92,174,3.29,0,13,29],
+    [106,116,188,3.628,101,16,30],
+    [118,50,0,1.383,76,11,31]
+];
+
+const dataSH = [
+    [91,45,125,0.82,34,23,1],
+    [65,27,78,0.86,45,29,2],
+    [83,60,84,1.09,73,27,3],
+    [109,81,121,1.28,68,51,4],
+    [106,77,114,1.07,55,51,5],
+    [109,81,121,1.28,68,51,6],
+    [106,77,114,1.07,55,51,7],
+    [89,65,78,0.86,51,26,8],
+    [53,33,47,0.64,50,17,9],
+    [80,55,80,1.01,75,24,10],
+    [117,81,124,1.03,45,24,11],
+    [99,71,142,1.1,62,42,12],
+    [95,69,130,1.28,74,50,13],
+    [116,87,131,1.47,84,40,14],
+    [108,80,121,1.3,85,37,15],
+    [134,83,167,1.16,57,43,16],
+    [79,43,107,1.05,59,37,17],
+    [71,46,89,0.86,64,25,18],
+    [97,71,113,1.17,88,31,19],
+    [84,57,91,0.85,55,31,20],
+    [87,63,101,0.9,56,41,21],
+    [104,77,119,1.09,73,48,22],
+    [87,62,100,1,72,28,23],
+    [168,128,172,1.49,97,56,24],
+    [65,45,51,0.74,39,17,25],
+    [39,24,38,0.61,47,17,26],
+    [39,24,39,0.59,50,19,27],
+    [93,68,96,1.05,79,29,28],
+    [188,143,197,1.66,99,51,29],
+    [174,131,174,1.55,108,50,30],
+    [187,143,201,1.39,89,53,31]
+];
+
+const lineStyle = {
+    width: 1,
+    opacity: 0.5
+};
+
+option = {
+    backgroundColor: '#161627',
+    title: {
+        text: 'AQI - 雷达图',
+        left: 'center',
+        textStyle: {
+            color: '#eee'
+        }
+    },
+    legend: {
+        bottom: 5,
+        data: ['Beijing', 'Shanghai', 'Guangzhou'],
+        itemGap: 20,
+        textStyle: {
+            color: '#fff',
+            fontSize: 14
+        },
+        selectedMode: 'single'
+    },
+    radar: {
+        indicator: [
+            {name: 'AQI', max: 300},
+            {name: 'PM2.5', max: 250},
+            {name: 'PM10', max: 300},
+            {name: 'CO', max: 5},
+            {name: 'NO2', max: 200},
+            {name: 'SO2', max: 100}
+        ],
+        shape: 'circle',
+        splitNumber: 5,
+        axisName: {
+            color: 'rgb(238, 197, 102)'
+        },
+        splitLine: {
+            lineStyle: {
+                color: [
+                    'rgba(238, 197, 102, 0.1)', 'rgba(238, 197, 102, 0.2)',
+                    'rgba(238, 197, 102, 0.4)', 'rgba(238, 197, 102, 0.6)',
+                    'rgba(238, 197, 102, 0.8)', 'rgba(238, 197, 102, 1)'
+                ].reverse()
+            }
+        },
+        splitArea: {
+            show: false
+        },
+        axisLine: {
+            lineStyle: {
+                color: 'rgba(238, 197, 102, 0.5)'
+            }
+        }
+    },
+    series: [
+        {
+            name: 'Beijing',
+            type: 'radar',
+            lineStyle: lineStyle,
+            data: dataBJ,
+            symbol: 'none',
+            itemStyle: {
+                color: '#F9713C'
+            },
+            areaStyle: {
+                opacity: 0.1
+            }
+        },
+        {
+            name: 'Shanghai',
+            type: 'radar',
+            lineStyle: lineStyle,
+            data: dataSH,
+            symbol: 'none',
+            itemStyle: {
+                color: '#B3E4A1'
+            },
+            areaStyle: {
+                opacity: 0.05
+            }
+        },
+        {
+            name: 'Guangzhou',
+            type: 'radar',
+            lineStyle: lineStyle,
+            data: dataGZ,
+            symbol: 'none',
+            itemStyle: {
+                color: 'rgb(238, 197, 102)'
+            },
+            areaStyle: {
+                opacity: 0.05
+            }
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/radar-custom.ts b/public/examples/ts/radar-custom.ts
new file mode 100644
index 0000000..ef964d6
--- /dev/null
+++ b/public/examples/ts/radar-custom.ts
@@ -0,0 +1,133 @@
+/*
+title: Customized Radar Chart
+category: radar
+titleCN: 自定义雷达图
+difficulty: 2
+*/
+
+option = {
+    color: [ '#67F9D8', '#FFE434', '#56A3F1', '#FF917C'],
+    title: {
+        text: 'Customized Radar Chart'
+    },
+    legend: {
+    },
+    radar: [
+        {
+            indicator: [
+                { text: 'Indicator1' },
+                { text: 'Indicator2' },
+                { text: 'Indicator3' },
+                { text: 'Indicator4' },
+                { text: 'Indicator5' }
+            ],
+            center: ['25%', '50%'],
+            radius: 120,
+            startAngle: 90,
+            splitNumber: 4,
+            shape: 'circle',
+            axisName: {
+                formatter: '【{value}】',
+                color: '#428BD4'
+            },
+            splitArea: {
+                areaStyle: {
+                    color: ['#77EADF', '#26C3BE', '#64AFE9', '#428BD4'],
+                    shadowColor: 'rgba(0, 0, 0, 0.2)',
+                    shadowBlur: 10
+                }
+            },
+            axisLine: {
+                lineStyle: {
+                    color: 'rgba(211, 253, 250, 0.8)'
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: 'rgba(211, 253, 250, 0.8)'
+                }
+            }
+        },
+        {
+            indicator: [
+                { text: 'Indicator1', max: 150 },
+                { text: 'Indicator2', max: 150 },
+                { text: 'Indicator3', max: 150 },
+                { text: 'Indicator4', max: 120 },
+                { text: 'Indicator5', max: 108 },
+                { text: 'Indicator6', max: 72 }
+            ],
+            center: ['75%', '50%'],
+            radius: 120,
+            axisName: {
+                color: '#fff',
+                backgroundColor: '#666',
+                borderRadius: 3,
+                padding: [3, 5]
+            }
+
+        }
+    ],
+    series: [
+        {
+            type: 'radar',
+            emphasis: {
+                lineStyle: {
+                    width: 4
+                }
+            },
+            data: [
+                {
+                    value: [100, 8, 0.40, -80, 2000],
+                    name: 'Data A'
+                },
+                {
+                    value: [60, 5, 0.30, -100, 1500],
+                    name: 'Data B',
+                    areaStyle: {
+                        color: 'rgba(255, 228, 52, 0.6)'
+                    }
+                }
+            ]
+        },
+        {
+            type: 'radar',
+            radarIndex: 1,
+            data: [
+                {
+                    value: [120, 118, 130, 100, 99, 70],
+                    name: 'Data C',
+                    symbol: 'rect',
+                    symbolSize: 12,
+                    lineStyle: {
+                        type: 'dashed'
+                    },
+                    label: {
+                        show: true,
+                        formatter: function (params: any) {
+                            return params.value as string;
+                        }
+                    }
+                },
+                {
+                    value: [100, 93, 50, 90, 70, 60],
+                    name: 'Data D',
+                    areaStyle: {
+                        color: new echarts.graphic.RadialGradient(0.1, 0.6, 1, [
+                            {
+                                color: 'rgba(255, 145, 124, 0.1)',
+                                offset: 0
+                            },
+                            {
+                                color: 'rgba(255, 145, 124, 0.9)',
+                                offset: 1
+                            }
+                        ])
+                    }
+                }
+            ]
+        }
+    ]
+};
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/radar-multiple.ts b/public/examples/ts/radar-multiple.ts
new file mode 100644
index 0000000..c64af74
--- /dev/null
+++ b/public/examples/ts/radar-multiple.ts
@@ -0,0 +1,99 @@
+/*
+title: Multiple Radar
+category: radar
+titleCN: 多雷达图
+*/
+
+option = {
+    title: {
+        text: '多雷达图'
+    },
+    tooltip: {
+        trigger: 'axis'
+    },
+    legend: {
+        left: 'center',
+        data: ['A Software', 'A Phone', 'Another Phone', 'Precipitation', 'Evaporation']
+    },
+    radar: [
+        {
+            indicator: [
+                {text: 'Brand', max: 100},
+                {text: 'Content', max: 100},
+                {text: 'Usability', max: 100},
+                {text: 'Function', max: 100}
+            ],
+            center: ['25%', '40%'],
+            radius: 80
+        },
+        {
+            indicator: [
+                {text: 'Look', max: 100},
+                {text: 'Photo', max: 100},
+                {text: 'System', max: 100},
+                {text: 'Performance', max: 100},
+                {text: 'Screen', max: 100}
+            ],
+            radius: 80,
+            center: ['50%', '60%'],
+        },
+        {
+            indicator: (function (){
+                var res = [];
+                for (var i = 1; i <= 12; i++) {
+                    res.push({text: i + '月', max: 100});
+                }
+                return res;
+            })(),
+            center: ['75%', '40%'],
+            radius: 80
+        }
+    ],
+    series: [
+        {
+            type: 'radar',
+            tooltip: {
+                trigger: 'item'
+            },
+            areaStyle: {},
+            data: [
+                {
+                    value: [60, 73, 85, 40],
+                    name: 'A Software'
+                }
+            ]
+        },
+        {
+            type: 'radar',
+            radarIndex: 1,
+            areaStyle: {},
+            data: [
+                {
+                    value: [85, 90, 90, 95, 95],
+                    name: 'A Phone'
+                },
+                {
+                    value: [95, 80, 95, 90, 93],
+                    name: 'Another Phone'
+                }
+            ]
+        },
+        {
+            type: 'radar',
+            radarIndex: 2,
+            areaStyle: {},
+            data: [
+                {
+                    name: 'Precipitation',
+                    value: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 75.6, 82.2, 48.7, 18.8, 6.0, 2.3],
+                },
+                {
+                    name: 'Evaporation',
+                    value: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 35.6, 62.2, 32.6, 20.0, 6.4, 3.3]
+                }
+            ]
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/radar.ts b/public/examples/ts/radar.ts
new file mode 100644
index 0000000..5af7ce9
--- /dev/null
+++ b/public/examples/ts/radar.ts
@@ -0,0 +1,41 @@
+/*
+title: Basic Radar Chart
+category: radar
+titleCN: 基础雷达图
+difficulty: 0
+*/
+
+option = {
+    title: {
+        text: 'Basic Radar Chart'
+    },
+    legend: {
+        data: ['Allocated Budget', 'Actual Spending']
+    },
+    radar: {
+        // shape: 'circle',
+        indicator: [
+            { name: 'Sales', max: 6500},
+            { name: 'Administration', max: 16000},
+            { name: 'Information Technology', max: 30000},
+            { name: 'Customer Support', max: 38000},
+            { name: 'Development', max: 52000},
+            { name: 'Marketing', max: 25000}
+        ]
+    },
+    series: [{
+        name: 'Budget vs spending',
+        type: 'radar',
+        data: [
+            {
+                value: [4200, 3000, 20000, 35000, 50000, 18000],
+                name: 'Allocated Budget'
+            },
+            {
+                value: [5000, 14000, 28000, 26000, 42000, 21000],
+                name: 'Actual Spending'
+            }
+        ]
+    }]
+};
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/radar2.ts b/public/examples/ts/radar2.ts
new file mode 100644
index 0000000..304f15f
--- /dev/null
+++ b/public/examples/ts/radar2.ts
@@ -0,0 +1,74 @@
+/*
+title: Proportion of Browsers
+category: radar
+titleCN: 浏览器占比变化
+difficulty: 3
+*/
+
+option = {
+    title: {
+        text: 'Proportion of Browsers',
+        subtext: 'Fake Data',
+        top: 10,
+        left: 10
+    },
+    tooltip: {
+        trigger: 'item'
+    },
+    legend: {
+        type: 'scroll',
+        bottom: 10,
+        data: (function (){
+            var list = [];
+            for (var i = 1; i <=28; i++) {
+                list.push(i + 2000 + '');
+            }
+            return list;
+        })()
+    },
+    visualMap: {
+        top: 'middle',
+        right: 10,
+        color: ['red', 'yellow'],
+        calculable: true
+    },
+    radar: {
+        indicator: [
+            { text: 'IE8-', max: 400},
+            { text: 'IE9+', max: 400},
+            { text: 'Safari', max: 400},
+            { text: 'Firefox', max: 400},
+            { text: 'Chrome', max: 400}
+        ]
+    },
+    series: (function (){
+        var series = [];
+        for (var i = 1; i <= 28; i++) {
+            series.push({
+                type: 'radar',
+                symbol: 'none',
+                lineStyle: {
+                    width: 1
+                },
+                emphasis: {
+                    areaStyle: {
+                        color: 'rgba(0,250,0,0.3)'
+                    }
+                },
+                data: [{
+                    value: [
+                        (40 - i) * 10,
+                        (38 - i) * 4 + 60,
+                        i * 5 + 10,
+                        i * 9,
+                        i * i /2
+                    ],
+                    name: i + 2000 + ''
+                }]
+            });
+        }
+        return series as echarts.RadarSeriesOption;
+    })()
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/sankey-energy.ts b/public/examples/ts/sankey-energy.ts
new file mode 100644
index 0000000..706698e
--- /dev/null
+++ b/public/examples/ts/sankey-energy.ts
@@ -0,0 +1,37 @@
+/*
+title: Gradient Edge
+category: sankey
+titleCN: 桑基图渐变色边
+difficulty: 3
+*/
+
+myChart.showLoading();
+$.get(ROOT_PATH + '/data/asset/data/energy.json', function (data) {
+    myChart.hideLoading();
+
+    myChart.setOption(option = {
+        title: {
+            text: 'Sankey Diagram'
+        },
+        tooltip: {
+            trigger: 'item',
+            triggerOn: 'mousemove'
+        },
+        series: [
+            {
+                type: 'sankey',
+                data: data.nodes,
+                links: data.links,
+                emphasis: {
+                    focus: 'adjacency'
+                },
+                lineStyle: {
+                    color: 'gradient',
+                    curveness: 0.5
+                }
+            }
+        ]
+    });
+});
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/sankey-itemstyle.ts b/public/examples/ts/sankey-itemstyle.ts
new file mode 100644
index 0000000..a0a8254
--- /dev/null
+++ b/public/examples/ts/sankey-itemstyle.ts
@@ -0,0 +1,1283 @@
+/*
+title: Specify ItemStyle for Each Node in Sankey
+category: sankey
+titleCN: 桑基图节点自定义样式
+difficulty: 2
+*/
+
+
+option = {
+    title: {
+        subtext: 'Data From lisachristina1234 on GitHub',
+        left: 'center'
+    },
+    backgroundColor: '#FFFFFF',
+    series: [
+        {
+            type: 'sankey',
+            left: 50.0,
+            top: 20.0,
+            right: 150.0,
+            bottom: 25.0,
+            data: [
+                {
+                    'name': 'Werne',
+                    'itemStyle': {
+                        'color': '#f18bbf',
+                        'borderColor': '#f18bbf'
+                    }
+                },
+                {
+                    'name': 'Duesseldorf',
+                    'itemStyle': {
+                        'color': '#0078D7',
+                        'borderColor': '#0078D7'
+                    }
+                },
+                {
+                    'name': 'Cambridge',
+                    'itemStyle': {
+                        'color': '#3891A7',
+                        'borderColor': '#3891A7'
+                    }
+                },
+                {
+                    'name': 'Colma',
+                    'itemStyle': {
+                        'color': '#0037DA',
+                        'borderColor': '#0037DA'
+                    }
+                },
+                {
+                    'name': 'W. York',
+                    'itemStyle': {
+                        'color': '#C0BEAF',
+                        'borderColor': '#C0BEAF'
+                    }
+                },
+                {
+                    'name': 'Frankfurt am Main',
+                    'itemStyle': {
+                        'color': '#EA005E',
+                        'borderColor': '#EA005E'
+                    }
+                },
+                {
+                    'name': 'Metz',
+                    'itemStyle': {
+                        'color': '#D13438',
+                        'borderColor': '#D13438'
+                    }
+                },
+                {
+                    'name': 'Orleans',
+                    'itemStyle': {
+                        'color': '#567C73',
+                        'borderColor': '#567C73'
+                    }
+                },
+                {
+                    'name': 'Saint-Denis',
+                    'itemStyle': {
+                        'color': '#9ed566',
+                        'borderColor': '#9ed566'
+                    }
+                },
+                {
+                    'name': 'Hof',
+                    'itemStyle': {
+                        'color': '#2BCC7F',
+                        'borderColor': '#2BCC7F'
+                    }
+                },
+                {
+                    'name': 'Cliffside',
+                    'itemStyle': {
+                        'color': '#809B48',
+                        'borderColor': '#809B48'
+                    }
+                },
+                {
+                    'name': 'Leeds',
+                    'itemStyle': {
+                        'color': '#9B2D1F',
+                        'borderColor': '#9B2D1F'
+                    }
+                },
+                {
+                    'name': 'Victoria',
+                    'itemStyle': {
+                        'color': '#604878',
+                        'borderColor': '#604878'
+                    }
+                },
+                {
+                    'name': 'Erlangen',
+                    'itemStyle': {
+                        'color': '#A5644E',
+                        'borderColor': '#A5644E'
+                    }
+                },
+                {
+                    'name': 'Saint Germain en Laye',
+                    'itemStyle': {
+                        'color': '#2D3F3A',
+                        'borderColor': '#2D3F3A'
+                    }
+                },
+                {
+                    'name': 'Roissy en Brie',
+                    'itemStyle': {
+                        'color': '#761721',
+                        'borderColor': '#761721'
+                    }
+                },
+                {
+                    'name': 'Wokingham',
+                    'itemStyle': {
+                        'color': '#B1BADD',
+                        'borderColor': '#B1BADD'
+                    }
+                },
+                {
+                    'name': 'Runcorn',
+                    'itemStyle': {
+                        'color': '#B0CCB0',
+                        'borderColor': '#B0CCB0'
+                    }
+                },
+                {
+                    'name': 'Newton',
+                    'itemStyle': {
+                        'color': '#8164A3',
+                        'borderColor': '#8164A3'
+                    }
+                },
+                {
+                    'name': 'Morangis',
+                    'itemStyle': {
+                        'color': '#8E562E',
+                        'borderColor': '#8E562E'
+                    }
+                },
+                {
+                    'name': 'Metchosin',
+                    'itemStyle': {
+                        'color': '#C1504D',
+                        'borderColor': '#C1504D'
+                    }
+                },
+                {
+                    'name': 'Kirkby',
+                    'itemStyle': {
+                        'color': '#CCAF0A',
+                        'borderColor': '#CCAF0A'
+                    }
+                },
+                {
+                    'name': 'London',
+                    'itemStyle': {
+                        'color': '#956251',
+                        'borderColor': '#956251'
+                    }
+                },
+                {
+                    'name': 'Offenbach',
+                    'itemStyle': {
+                        'color': '#C17529',
+                        'borderColor': '#C17529'
+                    }
+                },
+                {
+                    'name': 'Warrington',
+                    'itemStyle': {
+                        'color': '#CEC597',
+                        'borderColor': '#CEC597'
+                    }
+                },
+                {
+                    'name': 'Vancouver',
+                    'itemStyle': {
+                        'color': '#9F2936',
+                        'borderColor': '#9F2936'
+                    }
+                },
+                {
+                    'name': 'SuperiorCard',
+                    'itemStyle': {
+                        'color': 'rgba(128,155,72,255)',
+                        'borderColor': 'rgba(128,155,72,255)'
+                    }
+                },
+                {
+                    'name': 'Lille',
+                    'itemStyle': {
+                        'color': '#ac7430',
+                        'borderColor': '#ac7430'
+                    }
+                },
+                {
+                    'name': 'Hamburg',
+                    'itemStyle': {
+                        'color': '#00BCF2',
+                        'borderColor': '#00BCF2'
+                    }
+                },
+                {
+                    'name': 'Langley',
+                    'itemStyle': {
+                        'color': '#CD7B38',
+                        'borderColor': '#CD7B38'
+                    }
+                },
+                {
+                    'name': 'Les Ulis',
+                    'itemStyle': {
+                        'color': '#424242',
+                        'borderColor': '#424242'
+                    }
+                },
+                {
+                    'name': 'Saarbrücken',
+                    'itemStyle': {
+                        'color': '#f63185',
+                        'borderColor': '#f63185'
+                    }
+                },
+                {
+                    'name': 'N. Vancouver',
+                    'itemStyle': {
+                        'color': '#9CBC59',
+                        'borderColor': '#9CBC59'
+                    }
+                },
+                {
+                    'name': 'Chalk Riber',
+                    'itemStyle': {
+                        'color': '#4F4BD9',
+                        'borderColor': '#4F4BD9'
+                    }
+                },
+                {
+                    'name': 'Esher-Molesey',
+                    'itemStyle': {
+                        'color': '#3EC562',
+                        'borderColor': '#3EC562'
+                    }
+                },
+                {
+                    'name': 'Chatou',
+                    'itemStyle': {
+                        'color': '#F06F2E',
+                        'borderColor': '#F06F2E'
+                    }
+                },
+                {
+                    'name': 'Hannover',
+                    'itemStyle': {
+                        'color': '#C3986D',
+                        'borderColor': '#C3986D'
+                    }
+                },
+                {
+                    'name': 'Roncq',
+                    'itemStyle': {
+                        'color': '#4D291C',
+                        'borderColor': '#4D291C'
+                    }
+                },
+                {
+                    'name': 'Ingolstadt',
+                    'itemStyle': {
+                        'color': '#009c7a',
+                        'borderColor': '#009c7a'
+                    }
+                },
+                {
+                    'name': 'Drancy',
+                    'itemStyle': {
+                        'color': '#986F0B',
+                        'borderColor': '#986F0B'
+                    }
+                },
+                {
+                    'name': 'Langford',
+                    'itemStyle': {
+                        'color': '#3C8EA4',
+                        'borderColor': '#3C8EA4'
+                    }
+                },
+                {
+                    'name': 'Lebanon',
+                    'itemStyle': {
+                        'color': '#4F82BE',
+                        'borderColor': '#4F82BE'
+                    }
+                },
+                {
+                    'name': 'Maidenhead',
+                    'itemStyle': {
+                        'color': '#D38017',
+                        'borderColor': '#D38017'
+                    }
+                },
+                {
+                    'name': 'Stoke-on-Trent',
+                    'itemStyle': {
+                        'color': '#A8CDD7',
+                        'borderColor': '#A8CDD7'
+                    }
+                },
+                {
+                    'name': 'Peterborough',
+                    'itemStyle': {
+                        'color': '#7A072D',
+                        'borderColor': '#7A072D'
+                    }
+                },
+                {
+                    'name': 'Suresnes',
+                    'itemStyle': {
+                        'color': '#859599',
+                        'borderColor': '#859599'
+                    }
+                },
+                {
+                    'name': 'Versailles',
+                    'itemStyle': {
+                        'color': '#84AA33',
+                        'borderColor': '#84AA33'
+                    }
+                },
+                {
+                    'name': 'Neunkirchen',
+                    'itemStyle': {
+                        'color': '#ff8b67',
+                        'borderColor': '#ff8b67'
+                    }
+                },
+                {
+                    'name': 'Vista',
+                    'itemStyle': {
+                        'color': 'rgba(106,82,134,255)',
+                        'borderColor': 'rgba(106,82,134,255)'
+                    }
+                },
+                {
+                    'name': 'Westminster',
+                    'itemStyle': {
+                        'color': '#1B587C',
+                        'borderColor': '#1B587C'
+                    }
+                },
+                {
+                    'name': 'Kiel',
+                    'itemStyle': {
+                        'color': '#A19574',
+                        'borderColor': '#A19574'
+                    }
+                },
+                {
+                    'name': 'Newcastle upon Tyne',
+                    'itemStyle': {
+                        'color': '#918485',
+                        'borderColor': '#918485'
+                    }
+                },
+                {
+                    'name': 'Oxon',
+                    'itemStyle': {
+                        'color': '#FFA98C',
+                        'borderColor': '#FFA98C'
+                    }
+                },
+                {
+                    'name': 'West Sussex',
+                    'itemStyle': {
+                        'color': '#B0E3C0',
+                        'borderColor': '#B0E3C0'
+                    }
+                },
+                {
+                    'name': 'Oak Bay',
+                    'itemStyle': {
+                        'color': '#4BADC7',
+                        'borderColor': '#4BADC7'
+                    }
+                },
+                {
+                    'name': 'Milton Keynes',
+                    'itemStyle': {
+                        'color': '#BA144C',
+                        'borderColor': '#BA144C'
+                    }
+                },
+                {
+                    'name': 'Eilenburg',
+                    'itemStyle': {
+                        'color': '#F0A22E',
+                        'borderColor': '#F0A22E'
+                    }
+                },
+                {
+                    'name': 'ColonialVoice',
+                    'itemStyle': {
+                        'color': 'rgba(64,105,157,255)',
+                        'borderColor': 'rgba(64,105,157,255)'
+                    }
+                },
+                {
+                    'name': 'Liverpool',
+                    'itemStyle': {
+                        'color': '#A28E6A',
+                        'borderColor': '#A28E6A'
+                    }
+                },
+                {
+                    'name': 'Calgary',
+                    'itemStyle': {
+                        'color': '#9F413E',
+                        'borderColor': '#9F413E'
+                    }
+                },
+                {
+                    'name': 'CAD',
+                    'itemStyle': {
+                        'color': '#40699D',
+                        'borderColor': '#40699D'
+                    }
+                },
+                {
+                    'name': 'Paris La Defense',
+                    'itemStyle': {
+                        'color': '#989391',
+                        'borderColor': '#989391'
+                    }
+                },
+                {
+                    'name': 'Villeneuve-d\'Ascq',
+                    'itemStyle': {
+                        'color': '#886CE4',
+                        'borderColor': '#886CE4'
+                    }
+                },
+                {
+                    'name': 'Gloucestershire',
+                    'itemStyle': {
+                        'color': '#964305',
+                        'borderColor': '#964305'
+                    }
+                },
+                {
+                    'name': 'Gateshead',
+                    'itemStyle': {
+                        'color': '#485FB5',
+                        'borderColor': '#485FB5'
+                    }
+                },
+                {
+                    'name': 'Salzgitter',
+                    'itemStyle': {
+                        'color': '#87a0c7',
+                        'borderColor': '#87a0c7'
+                    }
+                },
+                {
+                    'name': 'Woolston',
+                    'itemStyle': {
+                        'color': '#FFE2C5',
+                        'borderColor': '#FFE2C5'
+                    }
+                },
+                {
+                    'name': 'Frankfurt',
+                    'itemStyle': {
+                        'color': '#40699D',
+                        'borderColor': '#40699D'
+                    }
+                },
+                {
+                    'name': 'Münster',
+                    'itemStyle': {
+                        'color': '#7e7eb2',
+                        'borderColor': '#7e7eb2'
+                    }
+                },
+                {
+                    'name': 'York',
+                    'itemStyle': {
+                        'color': '#587C7D',
+                        'borderColor': '#587C7D'
+                    }
+                },
+                {
+                    'name': 'High Wycombe',
+                    'itemStyle': {
+                        'color': '#F07F09',
+                        'borderColor': '#F07F09'
+                    }
+                },
+                {
+                    'name': 'Stuttgart',
+                    'itemStyle': {
+                        'color': '#E3008C',
+                        'borderColor': '#E3008C'
+                    }
+                },
+                {
+                    'name': 'Sooke',
+                    'itemStyle': {
+                        'color': '#4E8542',
+                        'borderColor': '#4E8542'
+                    }
+                },
+                {
+                    'name': 'Essen',
+                    'itemStyle': {
+                        'color': '#B58B80',
+                        'borderColor': '#B58B80'
+                    }
+                },
+                {
+                    'name': 'München',
+                    'itemStyle': {
+                        'color': '#4dc0a6',
+                        'borderColor': '#4dc0a6'
+                    }
+                },
+                {
+                    'name': 'Haney',
+                    'itemStyle': {
+                        'color': '#6A5286',
+                        'borderColor': '#6A5286'
+                    }
+                },
+                {
+                    'name': 'Port Hammond',
+                    'itemStyle': {
+                        'color': '#F89746',
+                        'borderColor': '#F89746'
+                    }
+                },
+                {
+                    'name': 'Saint Ouen',
+                    'itemStyle': {
+                        'color': '#744DA9',
+                        'borderColor': '#744DA9'
+                    }
+                },
+                {
+                    'name': 'Watford',
+                    'itemStyle': {
+                        'color': '#E8B7B7',
+                        'borderColor': '#E8B7B7'
+                    }
+                },
+                {
+                    'name': 'GBP',
+                    'itemStyle': {
+                        'color': '#C32D2E',
+                        'borderColor': '#C32D2E'
+                    }
+                },
+                {
+                    'name': 'Paderborn',
+                    'itemStyle': {
+                        'color': '#F0C42E',
+                        'borderColor': '#F0C42E'
+                    }
+                },
+                {
+                    'name': 'Dunkerque',
+                    'itemStyle': {
+                        'color': '#881798',
+                        'borderColor': '#881798'
+                    }
+                },
+                {
+                    'name': 'Colomiers',
+                    'itemStyle': {
+                        'color': '#efa835',
+                        'borderColor': '#efa835'
+                    }
+                },
+                {
+                    'name': 'Oxford',
+                    'itemStyle': {
+                        'color': '#D8B25C',
+                        'borderColor': '#D8B25C'
+                    }
+                },
+                {
+                    'name': 'Bury',
+                    'itemStyle': {
+                        'color': '#FEB80A',
+                        'borderColor': '#FEB80A'
+                    }
+                },
+                {
+                    'name': 'Royal Oak',
+                    'itemStyle': {
+                        'color': '#009DD9',
+                        'borderColor': '#009DD9'
+                    }
+                },
+                {
+                    'name': 'Shawnee',
+                    'itemStyle': {
+                        'color': '#F07F09',
+                        'borderColor': '#F07F09'
+                    }
+                },
+                {
+                    'name': 'Lancaster',
+                    'itemStyle': {
+                        'color': '#D34817',
+                        'borderColor': '#D34817'
+                    }
+                },
+                {
+                    'name': 'DEM',
+                    'itemStyle': {
+                        'color': '#4E342E',
+                        'borderColor': '#4E342E'
+                    }
+                },
+                {
+                    'name': 'Grevenbroich',
+                    'itemStyle': {
+                        'color': '#FFA836',
+                        'borderColor': '#FFA836'
+                    }
+                },
+                {
+                    'name': 'Distinguish',
+                    'itemStyle': {
+                        'color': 'rgba(159,65,62,255)',
+                        'borderColor': 'rgba(159,65,62,255)'
+                    }
+                },
+                {
+                    'name': 'Cheltenham',
+                    'itemStyle': {
+                        'color': '#FF6551',
+                        'borderColor': '#FF6551'
+                    }
+                },
+                {
+                    'name': 'Reading',
+                    'itemStyle': {
+                        'color': '#72A376',
+                        'borderColor': '#72A376'
+                    }
+                },
+                {
+                    'name': 'Pantin',
+                    'itemStyle': {
+                        'color': '#69797E',
+                        'borderColor': '#69797E'
+                    }
+                },
+                {
+                    'name': 'Kassel',
+                    'itemStyle': {
+                        'color': '#e65e20',
+                        'borderColor': '#e65e20'
+                    }
+                },
+                {
+                    'name': 'Orly',
+                    'itemStyle': {
+                        'color': '#6E6A68',
+                        'borderColor': '#6E6A68'
+                    }
+                },
+                {
+                    'name': 'FRF',
+                    'itemStyle': {
+                        'color': '#5ba33b',
+                        'borderColor': '#5ba33b'
+                    }
+                },
+                {
+                    'name': 'Cergy',
+                    'itemStyle': {
+                        'color': '#B4009E',
+                        'borderColor': '#B4009E'
+                    }
+                },
+                {
+                    'name': 'Paris',
+                    'itemStyle': {
+                        'color': '#666666',
+                        'borderColor': '#666666'
+                    }
+                }
+            ],
+            links: [
+                {
+                    'source': 'FRF',
+                    'target': 'Colomiers',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'SuperiorCard',
+                    'target': 'FRF',
+                    'value': 894.5999908447266
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'München',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Reading',
+                    'value': 188.52999836206436
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Shawnee',
+                    'value': 2346.919983509928
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Kirkby',
+                    'value': 753.4000000059605
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Roncq',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Peterborough',
+                    'value': 999.159998036921
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Frankfurt am Main',
+                    'value': 536.7599945068359
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Oxford',
+                    'value': 1831.3799968883395
+                },
+                {
+                    'source': 'Vista',
+                    'target': 'FRF',
+                    'value': 1789.1999816894531
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Langley',
+                    'value': 1274.8199949413538
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Offenbach',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Villeneuve-d\'Ascq',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Dunkerque',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Eilenburg',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Paris',
+                    'value': 1073.5199890136719
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Maidenhead',
+                    'value': 549.8400026857853
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Sooke',
+                    'value': 1764.499989286065
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Vancouver',
+                    'value': 1528.580000281334
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Hamburg',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'London',
+                    'value': 8619.309983983636
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Oak Bay',
+                    'value': 1565.109990529716
+                },
+                {
+                    'source': 'Distinguish',
+                    'target': 'FRF',
+                    'value': 2683.7999725341797
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Neunkirchen',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Cergy',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Hof',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Paris La Defense',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Westminster',
+                    'value': 1149.7999994903803
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Ingolstadt',
+                    'value': 536.7599945068359
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Saint Ouen',
+                    'value': 0.5899999737739563
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Lille',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Leeds',
+                    'value': 1356.6899970173836
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Morangis',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Orly',
+                    'value': 0.5899999737739563
+                },
+                {
+                    'source': 'SuperiorCard',
+                    'target': 'DEM',
+                    'value': 1431.3599853515625
+                },
+                {
+                    'source': 'Vista',
+                    'target': 'CAD',
+                    'value': 5369.929964579642
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Paris',
+                    'value': 0.6399999856948853
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Liverpool',
+                    'value': 857.1999968588352
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Stoke-on-Trent',
+                    'value': 1131.7099939212203
+                },
+                {
+                    'source': 'Distinguish',
+                    'target': 'DEM',
+                    'value': 2504.8799743652344
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Langford',
+                    'value': 2343.4599857851863
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Kassel',
+                    'value': 536.7599945068359
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'High Wycombe',
+                    'value': 216.83999809622765
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Port Hammond',
+                    'value': 1711.1399984136224
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Duesseldorf',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Gloucestershire',
+                    'value': 422.28999888151884
+                },
+                {
+                    'source': 'Distinguish',
+                    'target': 'GBP',
+                    'value': 10384.949975416064
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Roissy en Brie',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'West Sussex',
+                    'value': 592.1700052022934
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Cliffside',
+                    'value': 2906.2699892893434
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Newcastle upon Tyne',
+                    'value': 1448.2899911925197
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Runcorn',
+                    'value': 1120.4800013303757
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'W. York',
+                    'value': 612.1199932694435
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Kiel',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Woolston',
+                    'value': 833.3199937939644
+                },
+                {
+                    'source': 'Distinguish',
+                    'target': 'CAD',
+                    'value': 6950.059956334531
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Frankfurt',
+                    'value': 715.6799926757812
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Colma',
+                    'value': 0.2199999988079071
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Essen',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Chatou',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Cheltenham',
+                    'value': 573.0499979257584
+                },
+                {
+                    'source': 'SuperiorCard',
+                    'target': 'GBP',
+                    'value': 8228.39999615401
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Haney',
+                    'value': 2310.4499812424183
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Saint Ouen',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Chalk Riber',
+                    'value': 0.9200000166893005
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Salzgitter',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'ColonialVoice',
+                    'target': 'FRF',
+                    'value': 1610.2799835205078
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Stuttgart',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Saint-Denis',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Royal Oak',
+                    'value': 2128.459992274642
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Les Ulis',
+                    'value': 715.6799926757812
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Drancy',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Esher-Molesey',
+                    'value': 911.4700058028102
+                },
+                {
+                    'source': 'SuperiorCard',
+                    'target': 'CAD',
+                    'value': 7388.099954992533
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Bury',
+                    'value': 903.9400005489588
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Watford',
+                    'value': 1326.5300009772182
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Victoria',
+                    'value': 827.3899968340993
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Saarbrücken',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Lancaster',
+                    'value': 685.6899967193604
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Pantin',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Newton',
+                    'value': 1781.909985654056
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Oxon',
+                    'value': 493.6499986946583
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Calgary',
+                    'value': 361.3899962902069
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Münster',
+                    'value': 715.6799926757812
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Grevenbroich',
+                    'value': 536.7599945068359
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Paderborn',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'York',
+                    'value': 3172.9999914616346
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Metchosin',
+                    'value': 1750.7899813987315
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Suresnes',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Versailles',
+                    'value': 894.5999908447266
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Erlangen',
+                    'value': 536.7599945068359
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'Lebanon',
+                    'value': 0.8700000047683716
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Wokingham',
+                    'value': 812.6600027084351
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Cambridge',
+                    'value': 500.36999743431807
+                },
+                {
+                    'source': 'ColonialVoice',
+                    'target': 'GBP',
+                    'value': 8040.7799860313535
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Saint Germain en Laye',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Metz',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'FRF',
+                    'target': 'Orleans',
+                    'value': 357.8399963378906
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Milton Keynes',
+                    'value': 1648.2200061008334
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Warrington',
+                    'value': 2162.8300000429153
+                },
+                {
+                    'source': 'CAD',
+                    'target': 'N. Vancouver',
+                    'value': 1862.4599857926369
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Hannover',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'Vista',
+                    'target': 'GBP',
+                    'value': 9497.539981640875
+                },
+                {
+                    'source': 'DEM',
+                    'target': 'Werne',
+                    'value': 178.9199981689453
+                },
+                {
+                    'source': 'ColonialVoice',
+                    'target': 'DEM',
+                    'value': 1789.1999816894531
+                },
+                {
+                    'source': 'ColonialVoice',
+                    'target': 'CAD',
+                    'value': 7907.36997512728
+                },
+                {
+                    'source': 'GBP',
+                    'target': 'Gateshead',
+                    'value': 1425.7099913656712
+                },
+                {
+                    'source': 'Vista',
+                    'target': 'DEM',
+                    'value': 1968.1199798583984
+                }
+            ],
+            lineStyle: {
+                color: 'source',
+                curveness: 0.5
+            },
+            itemStyle: {
+                color: '#1f77b4',
+                borderColor: '#1f77b4'
+            },
+            label: {
+                color: 'rgba(0,0,0,0.7)',
+                fontFamily: 'Arial',
+                fontSize: 10
+            }
+        }],
+    tooltip: {
+        trigger: 'item'
+    }
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/sankey-levels.ts b/public/examples/ts/sankey-levels.ts
new file mode 100644
index 0000000..57e63d0
--- /dev/null
+++ b/public/examples/ts/sankey-levels.ts
@@ -0,0 +1,72 @@
+/*
+title: Sankey with Levels Setting
+category: sankey
+titleCN: 桑基图层级自定义样式
+difficulty: 2
+*/
+
+myChart.showLoading();
+$.get(ROOT_PATH + '/data/asset/data/product.json', function (data) {
+    myChart.hideLoading();
+
+    myChart.setOption(option = {
+        title: {
+            text: 'Sankey Diagram'
+        },
+        tooltip: {
+            trigger: 'item',
+            triggerOn: 'mousemove'
+        },
+        series: [
+            {
+                type: 'sankey',
+                data: data.nodes,
+                links: data.links,
+                emphasis: {
+                    focus: 'adjacency'
+                },
+                levels: [{
+                    depth: 0,
+                    itemStyle: {
+                        color: '#fbb4ae'
+                    },
+                    lineStyle: {
+                        color: 'source',
+                        opacity: 0.6
+                    }
+                }, {
+                    depth: 1,
+                    itemStyle: {
+                        color: '#b3cde3'
+                    },
+                    lineStyle: {
+                        color: 'source',
+                        opacity: 0.6
+                    }
+                }, {
+                    depth: 2,
+                    itemStyle: {
+                        color: '#ccebc5'
+                    },
+                    lineStyle: {
+                        color: 'source',
+                        opacity: 0.6
+                    }
+                }, {
+                    depth: 3,
+                    itemStyle: {
+                        color: '#decbe4'
+                    },
+                    lineStyle: {
+                        color: 'source',
+                        opacity: 0.6
+                    }
+                }],
+                lineStyle: {
+                    curveness: 0.5
+                }
+            }
+        ]
+    });
+});
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/sankey-nodeAlign-left.ts b/public/examples/ts/sankey-nodeAlign-left.ts
new file mode 100644
index 0000000..1121b1d
--- /dev/null
+++ b/public/examples/ts/sankey-nodeAlign-left.ts
@@ -0,0 +1,38 @@
+/*
+title: Node Align Left in Sankey
+category: sankey
+titleCN: 桑基图左对齐布局
+difficulty: 3
+*/
+
+myChart.showLoading();
+$.get(ROOT_PATH + '/data/asset/data/energy.json', function (data) {
+    myChart.hideLoading();
+
+    myChart.setOption(option = {
+        title: {
+            text: 'Node Align Right'
+        },
+        tooltip: {
+            trigger: 'item',
+            triggerOn: 'mousemove'
+        },
+        series: [
+            {
+                type: 'sankey',
+                emphasis: {
+                    focus: 'adjacency'
+                },
+                nodeAlign: 'left',
+                data: data.nodes,
+                links: data.links,
+                lineStyle: {
+                    color: 'source',
+                    curveness: 0.5
+                }
+            }
+        ]
+    });
+});
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/sankey-nodeAlign-right.ts b/public/examples/ts/sankey-nodeAlign-right.ts
new file mode 100644
index 0000000..0c19ce1
--- /dev/null
+++ b/public/examples/ts/sankey-nodeAlign-right.ts
@@ -0,0 +1,40 @@
+/*
+title: Node Align Right in Sankey
+category: sankey
+titleCN: 桑基图右对齐布局
+difficulty: 3
+*/
+
+myChart.showLoading();
+$.get(ROOT_PATH + '/data/asset/data/energy.json', function (data) {
+    myChart.hideLoading();
+
+    myChart.setOption(option = {
+        title: {
+            text: 'Node Align Left'
+        },
+        tooltip: {
+            trigger: 'item',
+            triggerOn: 'mousemove'
+        },
+        animation: false,
+        series: [
+            {
+                type: 'sankey',
+                emphasis: {
+                    focus: 'adjacency'
+                },
+                nodeAlign: 'right',
+                data: data.nodes,
+                links: data.links,
+                lineStyle: {
+                    color: 'source',
+                    curveness: 0.5
+                }
+            }
+        ]
+    });
+});
+
+export {};
+
diff --git a/public/examples/ts/sankey-simple.ts b/public/examples/ts/sankey-simple.ts
new file mode 100644
index 0000000..00520bb
--- /dev/null
+++ b/public/examples/ts/sankey-simple.ts
@@ -0,0 +1,56 @@
+/*
+title: Basic Sankey
+category: sankey
+titleCN: 基础桑基图
+difficulty: 0
+*/
+
+option = {
+    series: {
+        type: 'sankey',
+        layout: 'none',
+        emphasis: {
+            focus: 'adjacency'
+        },
+        data: [{
+            name: 'a'
+        }, {
+            name: 'b'
+        }, {
+            name: 'a1'
+        }, {
+            name: 'a2'
+        }, {
+            name: 'b1'
+        }, {
+            name: 'c'
+        }],
+        links: [{
+            source: 'a',
+            target: 'a1',
+            value: 5
+        }, {
+            source: 'a',
+            target: 'a2',
+            value: 3
+        }, {
+            source: 'b',
+            target: 'b1',
+            value: 8
+        }, {
+            source: 'a',
+            target: 'b1',
+            value: 3
+        }, {
+            source: 'b1',
+            target: 'a1',
+            value: 1
+        }, {
+            source: 'b1',
+            target: 'c',
+            value: 2
+        }]
+    }
+};
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/sankey-vertical.ts b/public/examples/ts/sankey-vertical.ts
new file mode 100644
index 0000000..24917c4
--- /dev/null
+++ b/public/examples/ts/sankey-vertical.ts
@@ -0,0 +1,49 @@
+/*
+title: Sankey Orient Vertical
+category: sankey
+titleCN: 垂直方向的桑基图
+difficulty: 1
+*/
+
+option = {
+    tooltip: {
+        trigger: 'item',
+        triggerOn: 'mousemove'
+    },
+    animation: false,
+    series: [
+        {
+            type: 'sankey',
+            bottom: '10%',
+            emphasis: {
+                focus: 'adjacency'
+            },
+            data: [
+                {name: 'a'},
+                {name: 'b'},
+                {name: 'a1'},
+                {name: 'b1'},
+                {name: 'c'},
+                {name: 'e'}
+            ],
+            links: [
+                {source: 'a', target: 'a1', value: 5},
+                {source: 'e', target: 'b', value: 3},
+                {source: 'a', target: 'b1', value: 3},
+                {source: 'b1', target: 'a1', value: 1},
+                {source: 'b1', target: 'c', value: 2},
+                {source: 'b', target: 'c', value: 1}
+            ],
+            orient: 'vertical',
+            label: {
+                position: 'top'
+            },
+            lineStyle: {
+                color: 'source',
+                curveness: 0.5
+            }
+        }
+    ]
+}
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/scatter-aggregate-bar.ts b/public/examples/ts/scatter-aggregate-bar.ts
new file mode 100644
index 0000000..ed14b7a
--- /dev/null
+++ b/public/examples/ts/scatter-aggregate-bar.ts
@@ -0,0 +1,189 @@
+/*
+title: Aggregate Scatter to Bar
+category: scatter, animation
+titleCN: 散点图聚合为柱状图动画
+difficulty: 4
+videoStart: 2000
+videoEnd: 6000
+*/
+
+const femaleData = [[161.2, 51.6], [167.5, 59.0], [159.5, 49.2], [157.0, 63.0], [155.8, 53.6],
+    [170.0, 59.0], [159.1, 47.6], [166.0, 69.8], [176.2, 66.8], [160.2, 75.2],
+    [172.5, 55.2], [170.9, 54.2], [172.9, 62.5], [153.4, 42.0], [160.0, 50.0],
+    [147.2, 49.8], [168.2, 49.2], [175.0, 73.2], [157.0, 47.8], [167.6, 68.8],
+    [159.5, 50.6], [175.0, 82.5], [166.8, 57.2], [176.5, 87.8], [170.2, 72.8],
+    [174.0, 54.5], [173.0, 59.8], [179.9, 67.3], [170.5, 67.8], [160.0, 47.0],
+    [154.4, 46.2], [162.0, 55.0], [176.5, 83.0], [160.0, 54.4], [152.0, 45.8],
+    [162.1, 53.6], [170.0, 73.2], [160.2, 52.1], [161.3, 67.9], [166.4, 56.6],
+    [168.9, 62.3], [163.8, 58.5], [167.6, 54.5], [160.0, 50.2], [161.3, 60.3],
+    [167.6, 58.3], [165.1, 56.2], [160.0, 50.2], [170.0, 72.9], [157.5, 59.8],
+    [167.6, 61.0], [160.7, 69.1], [163.2, 55.9], [152.4, 46.5], [157.5, 54.3],
+    [168.3, 54.8], [180.3, 60.7], [165.5, 60.0], [165.0, 62.0], [164.5, 60.3],
+    [156.0, 52.7], [160.0, 74.3], [163.0, 62.0], [165.7, 73.1], [161.0, 80.0],
+    [162.0, 54.7], [166.0, 53.2], [174.0, 75.7], [172.7, 61.1], [167.6, 55.7],
+    [151.1, 48.7], [164.5, 52.3], [163.5, 50.0], [152.0, 59.3], [169.0, 62.5],
+    [164.0, 55.7], [161.2, 54.8], [155.0, 45.9], [170.0, 70.6], [176.2, 67.2],
+    [170.0, 69.4], [162.5, 58.2], [170.3, 64.8], [164.1, 71.6], [169.5, 52.8],
+    [163.2, 59.8], [154.5, 49.0], [159.8, 50.0], [173.2, 69.2], [170.0, 55.9],
+    [161.4, 63.4], [169.0, 58.2], [166.2, 58.6], [159.4, 45.7], [162.5, 52.2],
+    [159.0, 48.6], [162.8, 57.8], [159.0, 55.6], [179.8, 66.8], [162.9, 59.4],
+    [161.0, 53.6], [151.1, 73.2], [168.2, 53.4], [168.9, 69.0], [173.2, 58.4],
+    [171.8, 56.2], [178.0, 70.6], [164.3, 59.8], [163.0, 72.0], [168.5, 65.2],
+    [166.8, 56.6], [172.7, 105.2], [163.5, 51.8], [169.4, 63.4], [167.8, 59.0],
+    [159.5, 47.6], [167.6, 63.0], [161.2, 55.2], [160.0, 45.0], [163.2, 54.0],
+    [162.2, 50.2], [161.3, 60.2], [149.5, 44.8], [157.5, 58.8], [163.2, 56.4],
+    [172.7, 62.0], [155.0, 49.2], [156.5, 67.2], [164.0, 53.8], [160.9, 54.4],
+    [162.8, 58.0], [167.0, 59.8], [160.0, 54.8], [160.0, 43.2], [168.9, 60.5],
+    [158.2, 46.4], [156.0, 64.4], [160.0, 48.8], [167.1, 62.2], [158.0, 55.5],
+    [167.6, 57.8], [156.0, 54.6], [162.1, 59.2], [173.4, 52.7], [159.8, 53.2],
+    [170.5, 64.5], [159.2, 51.8], [157.5, 56.0], [161.3, 63.6], [162.6, 63.2],
+    [160.0, 59.5], [168.9, 56.8], [165.1, 64.1], [162.6, 50.0], [165.1, 72.3],
+    [166.4, 55.0], [160.0, 55.9], [152.4, 60.4], [170.2, 69.1], [162.6, 84.5],
+    [170.2, 55.9], [158.8, 55.5], [172.7, 69.5], [167.6, 76.4], [162.6, 61.4],
+    [167.6, 65.9], [156.2, 58.6], [175.2, 66.8], [172.1, 56.6], [162.6, 58.6],
+    [160.0, 55.9], [165.1, 59.1], [182.9, 81.8], [166.4, 70.7], [165.1, 56.8],
+    [177.8, 60.0], [165.1, 58.2], [175.3, 72.7], [154.9, 54.1], [158.8, 49.1],
+    [172.7, 75.9], [168.9, 55.0], [161.3, 57.3], [167.6, 55.0], [165.1, 65.5],
+    [175.3, 65.5], [157.5, 48.6], [163.8, 58.6], [167.6, 63.6], [165.1, 55.2],
+    [165.1, 62.7], [168.9, 56.6], [162.6, 53.9], [164.5, 63.2], [176.5, 73.6],
+    [168.9, 62.0], [175.3, 63.6], [159.4, 53.2], [160.0, 53.4], [170.2, 55.0],
+    [162.6, 70.5], [167.6, 54.5], [162.6, 54.5], [160.7, 55.9], [160.0, 59.0],
+    [157.5, 63.6], [162.6, 54.5], [152.4, 47.3], [170.2, 67.7], [165.1, 80.9],
+    [172.7, 70.5], [165.1, 60.9], [170.2, 63.6], [170.2, 54.5], [170.2, 59.1],
+    [161.3, 70.5], [167.6, 52.7], [167.6, 62.7], [165.1, 86.3], [162.6, 66.4],
+    [152.4, 67.3], [168.9, 63.0], [170.2, 73.6], [175.2, 62.3], [175.2, 57.7],
+    [160.0, 55.4], [165.1, 104.1], [174.0, 55.5], [170.2, 77.3], [160.0, 80.5],
+    [167.6, 64.5], [167.6, 72.3], [167.6, 61.4], [154.9, 58.2], [162.6, 81.8],
+    [175.3, 63.6], [171.4, 53.4], [157.5, 54.5], [165.1, 53.6], [160.0, 60.0],
+    [174.0, 73.6], [162.6, 61.4], [174.0, 55.5], [162.6, 63.6], [161.3, 60.9],
+    [156.2, 60.0], [149.9, 46.8], [169.5, 57.3], [160.0, 64.1], [175.3, 63.6],
+    [169.5, 67.3], [160.0, 75.5], [172.7, 68.2], [162.6, 61.4], [157.5, 76.8],
+    [176.5, 71.8], [164.4, 55.5], [160.7, 48.6], [174.0, 66.4], [163.8, 67.3]
+];
+var maleDeta = [[174.0, 65.6], [175.3, 71.8], [193.5, 80.7], [186.5, 72.6], [187.2, 78.8],
+    [181.5, 74.8], [184.0, 86.4], [184.5, 78.4], [175.0, 62.0], [184.0, 81.6],
+    [180.0, 76.6], [177.8, 83.6], [192.0, 90.0], [176.0, 74.6], [174.0, 71.0],
+    [184.0, 79.6], [192.7, 93.8], [171.5, 70.0], [173.0, 72.4], [176.0, 85.9],
+    [176.0, 78.8], [180.5, 77.8], [172.7, 66.2], [176.0, 86.4], [173.5, 81.8],
+    [178.0, 89.6], [180.3, 82.8], [180.3, 76.4], [164.5, 63.2], [173.0, 60.9],
+    [183.5, 74.8], [175.5, 70.0], [188.0, 72.4], [189.2, 84.1], [172.8, 69.1],
+    [170.0, 59.5], [182.0, 67.2], [170.0, 61.3], [177.8, 68.6], [184.2, 80.1],
+    [186.7, 87.8], [171.4, 84.7], [172.7, 73.4], [175.3, 72.1], [180.3, 82.6],
+    [182.9, 88.7], [188.0, 84.1], [177.2, 94.1], [172.1, 74.9], [167.0, 59.1],
+    [169.5, 75.6], [174.0, 86.2], [172.7, 75.3], [182.2, 87.1], [164.1, 55.2],
+    [163.0, 57.0], [171.5, 61.4], [184.2, 76.8], [174.0, 86.8], [174.0, 72.2],
+    [177.0, 71.6], [186.0, 84.8], [167.0, 68.2], [171.8, 66.1], [182.0, 72.0],
+    [167.0, 64.6], [177.8, 74.8], [164.5, 70.0], [192.0, 101.6], [175.5, 63.2],
+    [171.2, 79.1], [181.6, 78.9], [167.4, 67.7], [181.1, 66.0], [177.0, 68.2],
+    [174.5, 63.9], [177.5, 72.0], [170.5, 56.8], [182.4, 74.5], [197.1, 90.9],
+    [180.1, 93.0], [175.5, 80.9], [180.6, 72.7], [184.4, 68.0], [175.5, 70.9],
+    [180.6, 72.5], [177.0, 72.5], [177.1, 83.4], [181.6, 75.5], [176.5, 73.0],
+    [175.0, 70.2], [174.0, 73.4], [165.1, 70.5], [177.0, 68.9], [192.0, 102.3],
+    [176.5, 68.4], [169.4, 65.9], [182.1, 75.7], [179.8, 84.5], [175.3, 87.7],
+    [184.9, 86.4], [177.3, 73.2], [167.4, 53.9], [178.1, 72.0], [168.9, 55.5],
+    [157.2, 58.4], [180.3, 83.2], [170.2, 72.7], [177.8, 64.1], [172.7, 72.3],
+    [165.1, 65.0], [186.7, 86.4], [165.1, 65.0], [174.0, 88.6], [175.3, 84.1],
+    [185.4, 66.8], [177.8, 75.5], [180.3, 93.2], [180.3, 82.7], [177.8, 58.0],
+    [177.8, 79.5], [177.8, 78.6], [177.8, 71.8], [177.8, 116.4], [163.8, 72.2],
+    [188.0, 83.6], [198.1, 85.5], [175.3, 90.9], [166.4, 85.9], [190.5, 89.1],
+    [166.4, 75.0], [177.8, 77.7], [179.7, 86.4], [172.7, 90.9], [190.5, 73.6],
+    [185.4, 76.4], [168.9, 69.1], [167.6, 84.5], [175.3, 64.5], [170.2, 69.1],
+    [190.5, 108.6], [177.8, 86.4], [190.5, 80.9], [177.8, 87.7], [184.2, 94.5],
+    [176.5, 80.2], [177.8, 72.0], [180.3, 71.4], [171.4, 72.7], [172.7, 84.1],
+    [172.7, 76.8], [177.8, 63.6], [177.8, 80.9], [182.9, 80.9], [170.2, 85.5],
+    [167.6, 68.6], [175.3, 67.7], [165.1, 66.4], [185.4, 102.3], [181.6, 70.5],
+    [172.7, 95.9], [190.5, 84.1], [179.1, 87.3], [175.3, 71.8], [170.2, 65.9],
+    [193.0, 95.9], [171.4, 91.4], [177.8, 81.8], [177.8, 96.8], [167.6, 69.1],
+    [167.6, 82.7], [180.3, 75.5], [182.9, 79.5], [176.5, 73.6], [186.7, 91.8],
+    [188.0, 84.1], [188.0, 85.9], [177.8, 81.8], [174.0, 82.5], [177.8, 80.5],
+    [171.4, 70.0], [185.4, 81.8], [185.4, 84.1], [188.0, 90.5], [188.0, 91.4],
+    [182.9, 89.1], [176.5, 85.0], [175.3, 69.1], [175.3, 73.6], [188.0, 80.5],
+    [188.0, 82.7], [175.3, 86.4], [170.5, 67.7], [179.1, 92.7], [177.8, 93.6],
+    [175.3, 70.9], [182.9, 75.0], [170.8, 93.2], [188.0, 93.2], [180.3, 77.7],
+    [177.8, 61.4], [185.4, 94.1], [168.9, 75.0], [185.4, 83.6], [180.3, 85.5],
+    [174.0, 73.9], [167.6, 66.8], [182.9, 87.3], [160.0, 72.3], [180.3, 88.6],
+    [167.6, 75.5], [186.7, 101.4], [175.3, 91.1], [175.3, 67.3], [175.9, 77.7],
+    [175.3, 81.8], [179.1, 75.5], [181.6, 84.5], [177.8, 76.6], [182.9, 85.0],
+    [177.8, 102.5], [184.2, 77.3], [179.1, 71.8], [176.5, 87.9], [188.0, 94.3],
+    [174.0, 70.9], [167.6, 64.5], [170.2, 77.3], [167.6, 72.3], [188.0, 87.3],
+    [174.0, 80.0], [176.5, 82.3], [180.3, 73.6], [167.6, 74.1], [188.0, 85.9],
+    [180.3, 73.2], [167.6, 76.3], [183.0, 65.9], [183.0, 90.9], [179.1, 89.1],
+    [170.2, 62.3], [177.8, 82.7], [179.1, 79.1], [190.5, 98.2], [177.8, 84.1],
+    [180.3, 83.2], [180.3, 83.2]
+];
+
+function calculateAverage(data: number[][], dim: number) {
+    let total = 0;
+    for (var i = 0; i < data.length; i++) {
+        total += data[i][dim];
+    }
+    return total /= data.length;
+}
+
+
+const scatterOption: echarts.EChartsOption = option = {
+    xAxis: {
+        scale: true
+    },
+    yAxis: {
+        scale: true
+    },
+    series: [{
+        type: 'scatter',
+        id: 'female',
+        dataGroupId: 'female',
+        universalTransition: {
+            enabled: true,
+            delay: function (idx, count) {
+                return Math.random() * 400;
+            }
+        },
+        data: femaleData
+    }, {
+        type: 'scatter',
+        id: 'male',
+        dataGroupId: 'male',
+        universalTransition: {
+            enabled: true,
+            delay: function (idx, count) {
+                return Math.random() * 400;
+            }
+        },
+        data: maleDeta
+    }]
+};
+
+const barOption: echarts.EChartsOption = {
+    xAxis: {
+        type: 'category',
+        data: ['Female', 'Male']
+    },
+    yAxis: {},
+    series: [{
+        type: 'bar',
+        id: 'total',
+        data: [{
+            value: calculateAverage(maleDeta, 0),
+            groupId: 'male'
+        }, {
+            value: calculateAverage(femaleData, 0),
+            groupId: 'female'
+        }],
+        universalTransition: {
+            enabled: true,
+            seriesKey: ['female', 'male'],
+            delay: function (idx, count) {
+                return Math.random() * 400;
+            }
+        }
+    }]
+};
+
+let currentOption = scatterOption;
+
+setInterval(function () {
+    currentOption = currentOption === scatterOption ? barOption : scatterOption;
+    myChart.setOption(currentOption, true);
+}, 2000);
+
+export {};
\ No newline at end of file
diff --git a/public/examples/ts/scatter-anscombe-quartet.ts b/public/examples/ts/scatter-anscombe-quartet.ts
new file mode 100644
index 0000000..eeac7f6
--- /dev/null
+++ b/public/examples/ts/scatter-anscombe-quartet.ts
@@ -0,0 +1,147 @@
+/*
+title: Anscomb's quartet
+category: scatter
+titleCN: Anscomb's quartet
+difficulty: 1
+*/
+
+const dataAll = [
+    [
+        [10.0, 8.04],
+        [8.0, 6.95],
+        [13.0, 7.58],
+        [9.0, 8.81],
+        [11.0, 8.33],
+        [14.0, 9.96],
+        [6.0, 7.24],
+        [4.0, 4.26],
+        [12.0, 10.84],
+        [7.0, 4.82],
+        [5.0, 5.68]
+    ],
+    [
+        [10.0, 9.14],
+        [8.0, 8.14],
+        [13.0, 8.74],
+        [9.0, 8.77],
+        [11.0, 9.26],
+        [14.0, 8.10],
+        [6.0, 6.13],
+        [4.0, 3.10],
+        [12.0, 9.13],
+        [7.0, 7.26],
+        [5.0, 4.74]
+    ],
+    [
+        [10.0, 7.46],
+        [8.0, 6.77],
+        [13.0, 12.74],
+        [9.0, 7.11],
+        [11.0, 7.81],
+        [14.0, 8.84],
+        [6.0, 6.08],
+        [4.0, 5.39],
+        [12.0, 8.15],
+        [7.0, 6.42],
+        [5.0, 5.73]
+    ],
+    [
+        [8.0, 6.58],
+        [8.0, 5.76],
+        [8.0, 7.71],
+        [8.0, 8.84],
+        [8.0, 8.47],
+        [8.0, 7.04],
+        [8.0, 5.25],
+        [19.0, 12.50],
+        [8.0, 5.56],
+        [8.0, 7.91],
+        [8.0, 6.89]
+    ]
+];
+
+const markLineOpt: echarts.MarkLineComponentOption = {
+    animation: false,
+    label: {
+        formatter: 'y = 0.5 * x + 3',
+        align: 'right'
+    },
+    lineStyle: {
+        type: 'solid'
+    },
+    tooltip: {
+        formatter: 'y = 0.5 * x + 3'
+    },
+    data: [[{
+        coord: [0, 3],
+        symbol: 'none'
+    }, {
+        coord: [20, 13],
+        symbol: 'none'
+    }]]
+};
+
+option = {
+    title: {
+        text: 'Anscombe\'s quartet',
+        left: 'center',
+        top: 0
+    },
+    grid: [
+        {left: '7%', top: '7%', width: '38%', height: '38%'},
+        {right: '7%', top: '7%', width: '38%', height: '38%'},
+        {left: '7%', bottom: '7%', width: '38%', height: '38%'},
+        {right: '7%', bottom: '7%', width: '38%', height: '38%'}
+    ],
+    tooltip: {
+        formatter: 'Group {a}: ({c})'
+    },
+    xAxis: [
+        {gridIndex: 0, min: 0, max: 20},
+        {gridIndex: 1, min: 0, max: 20},
+        {gridIndex: 2, min: 0, max: 20},
+        {gridIndex: 3, min: 0, max: 20}
+    ],
+    yAxis: [
+        {gridIndex: 0, min: 0, max: 15},
+        {gridIndex: 1, min: 0, max: 15},
+        {gridIndex: 2, min: 0, max: 15},
+        {gridIndex: 3, min: 0, max: 15}
+    ],
+    series: [
+        {
+            name: 'I',
+            type: 'scatter',
+            xAxisIndex: 0,
+            yAxisIndex: 0,
+            data: dataAll[0],
+            markLine: markLineOpt
+        },
+        {
+            name: 'II',
+            type: 'scatter',
+            xAxisIndex: 1,
+            yAxisIndex: 1,
+            data: dataAll[1],
+            markLine: markLineOpt
+        },
+        {
+            name: 'III',
+            type: 'scatter',
+            xAxisIndex: 2,
+            yAxisIndex: 2,
+            data: dataAll[2],
+            markLine: markLineOpt
+        },
+        {
+            name: 'IV',
+            type: 'scatter',
+            xAxisIndex: 3,
+            yAxisIndex: 3,
+            data: dataAll[3],
+            markLine: markLineOpt
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-aqi-color.ts b/public/examples/ts/scatter-aqi-color.ts
new file mode 100644
index 0000000..a9a5131
--- /dev/null
+++ b/public/examples/ts/scatter-aqi-color.ts
@@ -0,0 +1,262 @@
+/*
+title: Scatter Aqi Color
+category: scatter
+titleCN: AQI 气泡图
+difficulty: 7
+*/
+
+const dataBJ = [
+    [1,55,9,56,0.46,18,6,"良"],
+    [2,25,11,21,0.65,34,9,"优"],
+    [3,56,7,63,0.3,14,5,"良"],
+    [4,33,7,29,0.33,16,6,"优"],
+    [5,42,24,44,0.76,40,16,"优"],
+    [6,82,58,90,1.77,68,33,"良"],
+    [7,74,49,77,1.46,48,27,"良"],
+    [8,78,55,80,1.29,59,29,"良"],
+    [9,267,216,280,4.8,108,64,"重度污染"],
+    [10,185,127,216,2.52,61,27,"中度污染"],
+    [11,39,19,38,0.57,31,15,"优"],
+    [12,41,11,40,0.43,21,7,"优"],
+    [13,64,38,74,1.04,46,22,"良"],
+    [14,108,79,120,1.7,75,41,"轻度污染"],
+    [15,108,63,116,1.48,44,26,"轻度污染"],
+    [16,33,6,29,0.34,13,5,"优"],
+    [17,94,66,110,1.54,62,31,"良"],
+    [18,186,142,192,3.88,93,79,"中度污染"],
+    [19,57,31,54,0.96,32,14,"良"],
+    [20,22,8,17,0.48,23,10,"优"],
+    [21,39,15,36,0.61,29,13,"优"],
+    [22,94,69,114,2.08,73,39,"良"],
+    [23,99,73,110,2.43,76,48,"良"],
+    [24,31,12,30,0.5,32,16,"优"],
+    [25,42,27,43,1,53,22,"优"],
+    [26,154,117,157,3.05,92,58,"中度污染"],
+    [27,234,185,230,4.09,123,69,"重度污染"],
+    [28,160,120,186,2.77,91,50,"中度污染"],
+    [29,134,96,165,2.76,83,41,"轻度污染"],
+    [30,52,24,60,1.03,50,21,"良"],
+    [31,46,5,49,0.28,10,6,"优"]
+];
+
+const dataGZ = [
+    [1,26,37,27,1.163,27,13,"优"],
+    [2,85,62,71,1.195,60,8,"良"],
+    [3,78,38,74,1.363,37,7,"良"],
+    [4,21,21,36,0.634,40,9,"优"],
+    [5,41,42,46,0.915,81,13,"优"],
+    [6,56,52,69,1.067,92,16,"良"],
+    [7,64,30,28,0.924,51,2,"良"],
+    [8,55,48,74,1.236,75,26,"良"],
+    [9,76,85,113,1.237,114,27,"良"],
+    [10,91,81,104,1.041,56,40,"良"],
+    [11,84,39,60,0.964,25,11,"良"],
+    [12,64,51,101,0.862,58,23,"良"],
+    [13,70,69,120,1.198,65,36,"良"],
+    [14,77,105,178,2.549,64,16,"良"],
+    [15,109,68,87,0.996,74,29,"轻度污染"],
+    [16,73,68,97,0.905,51,34,"良"],
+    [17,54,27,47,0.592,53,12,"良"],
+    [18,51,61,97,0.811,65,19,"良"],
+    [19,91,71,121,1.374,43,18,"良"],
+    [20,73,102,182,2.787,44,19,"良"],
+    [21,73,50,76,0.717,31,20,"良"],
+    [22,84,94,140,2.238,68,18,"良"],
+    [23,93,77,104,1.165,53,7,"良"],
+    [24,99,130,227,3.97,55,15,"良"],
+    [25,146,84,139,1.094,40,17,"轻度污染"],
+    [26,113,108,137,1.481,48,15,"轻度污染"],
+    [27,81,48,62,1.619,26,3,"良"],
+    [28,56,48,68,1.336,37,9,"良"],
+    [29,82,92,174,3.29,0,13,"良"],
+    [30,106,116,188,3.628,101,16,"轻度污染"],
+    [31,118,50,0,1.383,76,11,"轻度污染"]
+];
+
+const dataSH = [
+    [1,91,45,125,0.82,34,23,"良"],
+    [2,65,27,78,0.86,45,29,"良"],
+    [3,83,60,84,1.09,73,27,"良"],
+    [4,109,81,121,1.28,68,51,"轻度污染"],
+    [5,106,77,114,1.07,55,51,"轻度污染"],
+    [6,109,81,121,1.28,68,51,"轻度污染"],
+    [7,106,77,114,1.07,55,51,"轻度污染"],
+    [8,89,65,78,0.86,51,26,"良"],
+    [9,53,33,47,0.64,50,17,"良"],
+    [10,80,55,80,1.01,75,24,"良"],
+    [11,117,81,124,1.03,45,24,"轻度污染"],
+    [12,99,71,142,1.1,62,42,"良"],
+    [13,95,69,130,1.28,74,50,"良"],
+    [14,116,87,131,1.47,84,40,"轻度污染"],
+    [15,108,80,121,1.3,85,37,"轻度污染"],
+    [16,134,83,167,1.16,57,43,"轻度污染"],
+    [17,79,43,107,1.05,59,37,"良"],
+    [18,71,46,89,0.86,64,25,"良"],
+    [19,97,71,113,1.17,88,31,"良"],
+    [20,84,57,91,0.85,55,31,"良"],
+    [21,87,63,101,0.9,56,41,"良"],
+    [22,104,77,119,1.09,73,48,"轻度污染"],
+    [23,87,62,100,1,72,28,"良"],
+    [24,168,128,172,1.49,97,56,"中度污染"],
+    [25,65,45,51,0.74,39,17,"良"],
+    [26,39,24,38,0.61,47,17,"优"],
+    [27,39,24,39,0.59,50,19,"优"],
+    [28,93,68,96,1.05,79,29,"良"],
+    [29,188,143,197,1.66,99,51,"中度污染"],
+    [30,174,131,174,1.55,108,50,"中度污染"],
+    [31,187,143,201,1.39,89,53,"中度污染"]
+];
+
+const schema = [
+    {name: 'date', index: 0, text: '日'},
+    {name: 'AQIindex', index: 1, text: 'AQI指数'},
+    {name: 'PM25', index: 2, text: 'PM2.5'},
+    {name: 'PM10', index: 3, text: 'PM10'},
+    {name: 'CO', index: 4, text: '一氧化碳(CO)'},
+    {name: 'NO2', index: 5, text: '二氧化氮(NO2)'},
+    {name: 'SO2', index: 6, text: '二氧化硫(SO2)'}
+];
+
+
+const itemStyle = {
+    opacity: 0.8,
+    shadowBlur: 10,
+    shadowOffsetX: 0,
+    shadowOffsetY: 0,
+    shadowColor: 'rgba(0,0,0,0.3)'
+};
+
+option = {
+    color: [
+        '#dd4444', '#fec42c', '#80F1BE'
+    ],
+    legend: {
+        top: 10,
+        data: ['北京', '上海', '广州'],
+        textStyle: {
+            fontSize: 16
+        }
+    },
+    grid: {
+        left: '10%',
+        right: 150,
+        top: '18%',
+        bottom: '10%'
+    },
+    tooltip: {
+        backgroundColor: 'rgba(255,255,255,0.7)',
+        formatter: function (param: any) {
+            var value = param.value;
+            return '<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">'
+                + param.seriesName + ' ' + value[0] + '日:'
+                + value[7]
+                + '</div>'
+                + schema[1].text + ':' + value[1] + '<br>'
+                + schema[2].text + ':' + value[2] + '<br>'
+                + schema[3].text + ':' + value[3] + '<br>'
+                + schema[4].text + ':' + value[4] + '<br>'
+                + schema[5].text + ':' + value[5] + '<br>'
+                + schema[6].text + ':' + value[6] + '<br>';
+        }
+    },
+    xAxis: {
+        type: 'value',
+        name: '日期',
+        nameGap: 16,
+        nameTextStyle: {
+            fontSize: 16
+        },
+        max: 31,
+        splitLine: {
+            show: false
+        },
+    },
+    yAxis: {
+        type: 'value',
+        name: 'AQI指数',
+        nameLocation: 'end',
+        nameGap: 20,
+        nameTextStyle: {
+            fontSize: 16
+        },
+        splitLine: {
+            show: false
+        }
+    },
+    visualMap: [
+        {
+            left: 'right',
+            top: '10%',
+            dimension: 2,
+            min: 0,
+            max: 250,
+            itemWidth: 30,
+            itemHeight: 120,
+            calculable: true,
+            precision: 0.1,
+            text: ['圆形大小:PM2.5'],
+            textGap: 30,
+            inRange: {
+                symbolSize: [10, 70]
+            },
+            outOfRange: {
+                symbolSize: [10, 70],
+                color: ['rgba(255,255,255,0.4)']
+            },
+            controller: {
+                inRange: {
+                    color: ['#c23531']
+                },
+                outOfRange: {
+                    color: ['#999']
+                }
+            }
+        },
+        {
+            left: 'right',
+            bottom: '5%',
+            dimension: 6,
+            min: 0,
+            max: 50,
+            itemHeight: 120,
+            text: ['明暗:二氧化硫'],
+            textGap: 30,
+            inRange: {
+                colorLightness: [0.9, 0.5]
+            },
+            outOfRange: {
+                color: ['rgba(255,255,255,0.4)']
+            },
+            controller: {
+                inRange: {
+                    color: ['#c23531']
+                },
+                outOfRange: {
+                    color: ['#999']
+                }
+            }
+        }
+    ],
+    series: [
+        {
+            name: '北京',
+            type: 'scatter',
+            itemStyle: itemStyle,
+            data: dataBJ
+        },
+        {
+            name: '上海',
+            type: 'scatter',
+            itemStyle: itemStyle,
+            data: dataSH
+        },
+        {
+            name: '广州',
+            type: 'scatter',
+            itemStyle: itemStyle,
+            data: dataGZ
+        }
+    ]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-clustering.ts b/public/examples/ts/scatter-clustering.ts
new file mode 100644
index 0000000..6e65962
--- /dev/null
+++ b/public/examples/ts/scatter-clustering.ts
@@ -0,0 +1,133 @@
+/*
+title: Clustering Process
+category: scatter
+titleCN: 数据聚合
+difficulty: 1
+*/
+
+// See https://github.com/ecomfe/echarts-stat
+echarts.registerTransform(ecStat.transform.clustering);
+
+const data = [
+    [3.275154, 2.957587],
+    [-3.344465, 2.603513],
+    [0.355083, -3.376585],
+    [1.852435, 3.547351],
+    [-2.078973, 2.552013],
+    [-0.993756, -0.884433],
+    [2.682252, 4.007573],
+    [-3.087776, 2.878713],
+    [-1.565978, -1.256985],
+    [2.441611, 0.444826],
+    [-0.659487, 3.111284],
+    [-0.459601, -2.618005],
+    [2.17768, 2.387793],
+    [-2.920969, 2.917485],
+    [-0.028814, -4.168078],
+    [3.625746, 2.119041],
+    [-3.912363, 1.325108],
+    [-0.551694, -2.814223],
+    [2.855808, 3.483301],
+    [-3.594448, 2.856651],
+    [0.421993, -2.372646],
+    [1.650821, 3.407572],
+    [-2.082902, 3.384412],
+    [-0.718809, -2.492514],
+    [4.513623, 3.841029],
+    [-4.822011, 4.607049],
+    [-0.656297, -1.449872],
+    [1.919901, 4.439368],
+    [-3.287749, 3.918836],
+    [-1.576936, -2.977622],
+    [3.598143, 1.97597],
+    [-3.977329, 4.900932],
+    [-1.79108, -2.184517],
+    [3.914654, 3.559303],
+    [-1.910108, 4.166946],
+    [-1.226597, -3.317889],
+    [1.148946, 3.345138],
+    [-2.113864, 3.548172],
+    [0.845762, -3.589788],
+    [2.629062, 3.535831],
+    [-1.640717, 2.990517],
+    [-1.881012, -2.485405],
+    [4.606999, 3.510312],
+    [-4.366462, 4.023316],
+    [0.765015, -3.00127],
+    [3.121904, 2.173988],
+    [-4.025139, 4.65231],
+    [-0.559558, -3.840539],
+    [4.376754, 4.863579],
+    [-1.874308, 4.032237],
+    [-0.089337, -3.026809],
+    [3.997787, 2.518662],
+    [-3.082978, 2.884822],
+    [0.845235, -3.454465],
+    [1.327224, 3.358778],
+    [-2.889949, 3.596178],
+    [-0.966018, -2.839827],
+    [2.960769, 3.079555],
+    [-3.275518, 1.577068],
+    [0.639276, -3.41284]
+];
+
+var CLUSTER_COUNT = 6;
+var DIENSIION_CLUSTER_INDEX = 2;
+var COLOR_ALL = [
+    '#37A2DA', '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF'
+];
+var pieces = [];
+for (var i = 0; i < CLUSTER_COUNT; i++) {
+    pieces.push({
+        value: i,
+        label: 'cluster ' + i,
+        color: COLOR_ALL[i]
+    });
+}
+
+option = {
+    dataset: [{
+        source: data
+    }, {
+        transform: {
+            type: 'ecStat:clustering',
+            // print: true,
+            config: {
+                clusterCount: CLUSTER_COUNT,
+                outputType: 'single',
+                outputClusterIndexDimension: DIENSIION_CLUSTER_INDEX
+            }
+        }
+    }],
+    tooltip: {
+        position: 'top'
+    },
+    visualMap: {
+        type: 'piecewise',
+        top: 'middle',
+        min: 0,
+        max: CLUSTER_COUNT,
+        left: 10,
+        splitNumber: CLUSTER_COUNT,
+        dimension: DIENSIION_CLUSTER_INDEX,
+        pieces: pieces
+    },
+    grid: {
+        left: 120
+    },
+    xAxis: {
+    },
+    yAxis: {
+    },
+    series: {
+        type: 'scatter',
+        encode: { tooltip: [0, 1] },
+        symbolSize: 15,
+        itemStyle: {
+            borderColor: '#555'
+        },
+        datasetIndex: 1
+    }
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-effect.ts b/public/examples/ts/scatter-effect.ts
new file mode 100644
index 0000000..1ba7518
--- /dev/null
+++ b/public/examples/ts/scatter-effect.ts
@@ -0,0 +1,80 @@
+/*
+title: Effect Scatter Chart
+category: scatter
+titleCN: 涟漪特效散点图
+difficulty: 2
+*/
+
+option = {
+    xAxis: {
+        scale: true
+    },
+    yAxis: {
+        scale: true
+    },
+    series: [{
+        type: 'effectScatter',
+        symbolSize: 20,
+        data: [
+            [172.7, 105.2],
+            [153.4, 42]
+        ]
+    }, {
+        type: 'scatter',
+        data: [[161.2, 51.6], [167.5, 59.0], [159.5, 49.2], [157.0, 63.0], [155.8, 53.6],
+            [170.0, 59.0], [159.1, 47.6], [166.0, 69.8], [176.2, 66.8], [160.2, 75.2],
+            [172.5, 55.2], [170.9, 54.2], [172.9, 62.5], [153.4, 42.0], [160.0, 50.0],
+            [147.2, 49.8], [168.2, 49.2], [175.0, 73.2], [157.0, 47.8], [167.6, 68.8],
+            [159.5, 50.6], [175.0, 82.5], [166.8, 57.2], [176.5, 87.8], [170.2, 72.8],
+            [174.0, 54.5], [173.0, 59.8], [179.9, 67.3], [170.5, 67.8], [160.0, 47.0],
+            [154.4, 46.2], [162.0, 55.0], [176.5, 83.0], [160.0, 54.4], [152.0, 45.8],
+            [162.1, 53.6], [170.0, 73.2], [160.2, 52.1], [161.3, 67.9], [166.4, 56.6],
+            [168.9, 62.3], [163.8, 58.5], [167.6, 54.5], [160.0, 50.2], [161.3, 60.3],
+            [167.6, 58.3], [165.1, 56.2], [160.0, 50.2], [170.0, 72.9], [157.5, 59.8],
+            [167.6, 61.0], [160.7, 69.1], [163.2, 55.9], [152.4, 46.5], [157.5, 54.3],
+            [168.3, 54.8], [180.3, 60.7], [165.5, 60.0], [165.0, 62.0], [164.5, 60.3],
+            [156.0, 52.7], [160.0, 74.3], [163.0, 62.0], [165.7, 73.1], [161.0, 80.0],
+            [162.0, 54.7], [166.0, 53.2], [174.0, 75.7], [172.7, 61.1], [167.6, 55.7],
+            [151.1, 48.7], [164.5, 52.3], [163.5, 50.0], [152.0, 59.3], [169.0, 62.5],
+            [164.0, 55.7], [161.2, 54.8], [155.0, 45.9], [170.0, 70.6], [176.2, 67.2],
+            [170.0, 69.4], [162.5, 58.2], [170.3, 64.8], [164.1, 71.6], [169.5, 52.8],
+            [163.2, 59.8], [154.5, 49.0], [159.8, 50.0], [173.2, 69.2], [170.0, 55.9],
+            [161.4, 63.4], [169.0, 58.2], [166.2, 58.6], [159.4, 45.7], [162.5, 52.2],
+            [159.0, 48.6], [162.8, 57.8], [159.0, 55.6], [179.8, 66.8], [162.9, 59.4],
+            [161.0, 53.6], [151.1, 73.2], [168.2, 53.4], [168.9, 69.0], [173.2, 58.4],
+            [171.8, 56.2], [178.0, 70.6], [164.3, 59.8], [163.0, 72.0], [168.5, 65.2],
+            [166.8, 56.6], [172.7, 105.2], [163.5, 51.8], [169.4, 63.4], [167.8, 59.0],
+            [159.5, 47.6], [167.6, 63.0], [161.2, 55.2], [160.0, 45.0], [163.2, 54.0],
+            [162.2, 50.2], [161.3, 60.2], [149.5, 44.8], [157.5, 58.8], [163.2, 56.4],
+            [172.7, 62.0], [155.0, 49.2], [156.5, 67.2], [164.0, 53.8], [160.9, 54.4],
+            [162.8, 58.0], [167.0, 59.8], [160.0, 54.8], [160.0, 43.2], [168.9, 60.5],
+            [158.2, 46.4], [156.0, 64.4], [160.0, 48.8], [167.1, 62.2], [158.0, 55.5],
+            [167.6, 57.8], [156.0, 54.6], [162.1, 59.2], [173.4, 52.7], [159.8, 53.2],
+            [170.5, 64.5], [159.2, 51.8], [157.5, 56.0], [161.3, 63.6], [162.6, 63.2],
+            [160.0, 59.5], [168.9, 56.8], [165.1, 64.1], [162.6, 50.0], [165.1, 72.3],
+            [166.4, 55.0], [160.0, 55.9], [152.4, 60.4], [170.2, 69.1], [162.6, 84.5],
+            [170.2, 55.9], [158.8, 55.5], [172.7, 69.5], [167.6, 76.4], [162.6, 61.4],
+            [167.6, 65.9], [156.2, 58.6], [175.2, 66.8], [172.1, 56.6], [162.6, 58.6],
+            [160.0, 55.9], [165.1, 59.1], [182.9, 81.8], [166.4, 70.7], [165.1, 56.8],
+            [177.8, 60.0], [165.1, 58.2], [175.3, 72.7], [154.9, 54.1], [158.8, 49.1],
+            [172.7, 75.9], [168.9, 55.0], [161.3, 57.3], [167.6, 55.0], [165.1, 65.5],
+            [175.3, 65.5], [157.5, 48.6], [163.8, 58.6], [167.6, 63.6], [165.1, 55.2],
+            [165.1, 62.7], [168.9, 56.6], [162.6, 53.9], [164.5, 63.2], [176.5, 73.6],
+            [168.9, 62.0], [175.3, 63.6], [159.4, 53.2], [160.0, 53.4], [170.2, 55.0],
+            [162.6, 70.5], [167.6, 54.5], [162.6, 54.5], [160.7, 55.9], [160.0, 59.0],
+            [157.5, 63.6], [162.6, 54.5], [152.4, 47.3], [170.2, 67.7], [165.1, 80.9],
+            [172.7, 70.5], [165.1, 60.9], [170.2, 63.6], [170.2, 54.5], [170.2, 59.1],
+            [161.3, 70.5], [167.6, 52.7], [167.6, 62.7], [165.1, 86.3], [162.6, 66.4],
+            [152.4, 67.3], [168.9, 63.0], [170.2, 73.6], [175.2, 62.3], [175.2, 57.7],
+            [160.0, 55.4], [165.1, 104.1], [174.0, 55.5], [170.2, 77.3], [160.0, 80.5],
+            [167.6, 64.5], [167.6, 72.3], [167.6, 61.4], [154.9, 58.2], [162.6, 81.8],
+            [175.3, 63.6], [171.4, 53.4], [157.5, 54.5], [165.1, 53.6], [160.0, 60.0],
+            [174.0, 73.6], [162.6, 61.4], [174.0, 55.5], [162.6, 63.6], [161.3, 60.9],
+            [156.2, 60.0], [149.9, 46.8], [169.5, 57.3], [160.0, 64.1], [175.3, 63.6],
+            [169.5, 67.3], [160.0, 75.5], [172.7, 68.2], [162.6, 61.4], [157.5, 76.8],
+            [176.5, 71.8], [164.4, 55.5], [160.7, 48.6], [174.0, 66.4], [163.8, 67.3]
+        ],
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-exponential-regression.ts b/public/examples/ts/scatter-exponential-regression.ts
new file mode 100644
index 0000000..959dcf8
--- /dev/null
+++ b/public/examples/ts/scatter-exponential-regression.ts
@@ -0,0 +1,86 @@
+/*
+title: Exponential Regression
+category: scatter
+titleCN: 指数回归(使用统计插件)
+difficulty: 1
+*/
+
+// See https://github.com/ecomfe/echarts-stat
+echarts.registerTransform(ecStat.transform.regression);
+
+option = {
+    dataset: [{
+        source: [
+            [1, 4862.4],
+            [2, 5294.7],
+            [3, 5934.5],
+            [4, 7171.0],
+            [5, 8964.4],
+            [6, 10202.2],
+            [7, 11962.5],
+            [8, 14928.3],
+            [9, 16909.2],
+            [10, 18547.9],
+            [11, 21617.8],
+            [12, 26638.1],
+            [13, 34634.4],
+            [14, 46759.4],
+            [15, 58478.1],
+            [16, 67884.6],
+            [17, 74462.6],
+            [18, 79395.7]
+        ]
+    }, {
+        transform: {
+            type: 'ecStat:regression',
+            config: {
+                method: 'exponential',
+                // 'end' by default
+                // formulaOn: 'start'
+            }
+        }
+    }],
+    title: {
+        text: '1981 - 1998 gross domestic product GDP (trillion yuan)',
+        subtext: 'By ecStat.regression',
+        sublink: 'https://github.com/ecomfe/echarts-stat',
+        left: 'center'
+    },
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'cross'
+        }
+    },
+    xAxis: {
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        }
+    },
+    yAxis: {
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        }
+    },
+    series: [{
+        name: 'scatter',
+        type: 'scatter',
+        datasetIndex: 0
+    },{
+        name: 'line',
+        type: 'line',
+        smooth: true,
+        datasetIndex: 1,
+        symbolSize: 0.1,
+        symbol: 'circle',
+        label: { show: true, fontSize: 16 },
+        labelLayout: { dx: -20 },
+        encode: { label: 2, tooltip: 1 }
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-label-align-right.ts b/public/examples/ts/scatter-label-align-right.ts
new file mode 100644
index 0000000..ed9d3d2
--- /dev/null
+++ b/public/examples/ts/scatter-label-align-right.ts
@@ -0,0 +1,58 @@
+/*
+title: Align Label on the Top
+category: scatter
+titleCN: 散点图标签顶部对齐
+difficulty: 4
+*/
+
+const 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,42 [...]
+    [[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],[643 [...]
+];
+
+option = {
+    xAxis: {
+        splitLine: { show: false }
+    },
+    yAxis: {
+        splitLine: { show: false },
+        scale: true
+    },
+    grid: {
+        left: 40,
+        right: 130
+    },
+    series: [{
+        name: '1990',
+        data: data[0],
+        type: 'scatter',
+        symbolSize: function (data) {
+            return Math.sqrt(data[2]) / 5e2;
+        },
+        emphasis: {
+            focus: 'self'
+        },
+        labelLayout: function () {
+            return {
+                x: myChart.getWidth() - 100,
+                moveOverlap: 'shiftY'
+            };
+        },
+        labelLine: {
+            show: true,
+            length2: 5,
+            lineStyle: {
+                color: '#bbb'
+            }
+        },
+        label: {
+            show: true,
+            formatter: function (param: any) {
+                return param.data[3];
+            },
+            position: 'right',
+            minMargin: 2
+        }
+    }]
+};
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-label-align-top.ts b/public/examples/ts/scatter-label-align-top.ts
new file mode 100644
index 0000000..5b62763
--- /dev/null
+++ b/public/examples/ts/scatter-label-align-top.ts
@@ -0,0 +1,53 @@
+/*
+title: Align Label on the Top
+category: scatter
+titleCN: 散点图标签顶部对齐
+difficulty: 4
+*/
+
+
+const 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,42 [...]
+    [[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],[643 [...]
+];
+
+option = {
+    xAxis: {},
+    yAxis: {
+        scale: true
+    },
+    series: [{
+        name: '1990',
+        data: data[0],
+        type: 'scatter',
+        symbolSize: function (data) {
+            return Math.sqrt(data[2]) / 5e2;
+        },
+        emphasis: {
+            focus: 'self'
+        },
+        labelLayout: {
+            y: 20,
+            align: 'center',
+            hideOverlap: true,
+            moveOverlap: 'shiftX'
+        },
+        labelLine: {
+            show: true,
+            length2: 5,
+            lineStyle: {
+                color: '#bbb'
+            }
+        },
+        label: {
+            show: true,
+            formatter: function (param: any) {
+                return param.data[3];
+            },
+            minMargin: 10,
+            position: 'top'
+        }
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-large.ts b/public/examples/ts/scatter-large.ts
new file mode 100644
index 0000000..349a0d0
--- /dev/null
+++ b/public/examples/ts/scatter-large.ts
@@ -0,0 +1,72 @@
+/*
+title: Large Scatter
+category: scatter
+titleCN: 大规模散点图
+difficulty: 5
+*/
+
+function genData(len: number, offset?: number) {
+    let arr = new Float32Array(len * 2);
+    let off = 0;
+
+    for (let i = 0; i < len; i++) {
+        let x = +Math.random() * 10;
+        let y = +Math.sin(x) - x * (len % 2 ? 0.1 : -0.1) * Math.random() + (offset || 0) / 10;
+        arr[off++] = x;
+        arr[off++] = y;
+    }
+    return arr;
+}
+
+const data1 = genData(5e5);
+const data2 = genData(5e5, 10);
+
+option = {
+    title: {
+        text: echarts.format.addCommas(data1.length / 2 + data2.length / 2) + ' Points'
+    },
+    tooltip: {},
+    toolbox: {
+        left: 'center',
+        feature: {
+            dataZoom: {}
+        }
+    },
+    legend: {
+        orient: 'vertical',
+        right: 10
+    },
+    xAxis: [{
+    }],
+    yAxis: [{
+    }],
+    dataZoom: [{
+        type: 'inside'
+    }, {
+        type: 'slider'
+    }],
+    animation: false,
+    series: [{
+        name: 'A',
+        type: 'scatter',
+        data: data1,
+        dimensions: ['x', 'y'],
+        symbolSize: 3,
+        itemStyle: {
+            opacity: 0.4
+        },
+        large: true
+    }, {
+        name: 'B',
+        type: 'scatter',
+        data: data2,
+        dimensions: ['x', 'y'],
+        symbolSize: 3,
+        itemStyle: {
+            opacity: 0.4
+        },
+        large: true
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-linear-regression.ts b/public/examples/ts/scatter-linear-regression.ts
new file mode 100644
index 0000000..cc64fcd
--- /dev/null
+++ b/public/examples/ts/scatter-linear-regression.ts
@@ -0,0 +1,269 @@
+/*
+title: Linear Regression
+category: scatter
+titleCN: 线性回归(使用统计插件)
+difficulty: 2
+*/
+
+// See https://github.com/ecomfe/echarts-stat
+echarts.registerTransform(ecStat.transform.regression);
+
+const data = [
+    [0.067732, 3.176513],
+    [0.42781, 3.816464],
+    [0.995731, 4.550095],
+    [0.738336, 4.256571],
+    [0.981083, 4.560815],
+    [0.526171, 3.929515],
+    [0.378887, 3.52617],
+    [0.033859, 3.156393],
+    [0.132791, 3.110301],
+    [0.138306, 3.149813],
+    [0.247809, 3.476346],
+    [0.64827, 4.119688],
+    [0.731209, 4.282233],
+    [0.236833, 3.486582],
+    [0.969788, 4.655492],
+    [0.607492, 3.965162],
+    [0.358622, 3.5149],
+    [0.147846, 3.125947],
+    [0.63782, 4.094115],
+    [0.230372, 3.476039],
+    [0.070237, 3.21061],
+    [0.067154, 3.190612],
+    [0.925577, 4.631504],
+    [0.717733, 4.29589],
+    [0.015371, 3.085028],
+    [0.33507, 3.44808],
+    [0.040486, 3.16744],
+    [0.212575, 3.364266],
+    [0.617218, 3.993482],
+    [0.541196, 3.891471],
+    [0.045353, 3.143259],
+    [0.126762, 3.114204],
+    [0.556486, 3.851484],
+    [0.901144, 4.621899],
+    [0.958476, 4.580768],
+    [0.274561, 3.620992],
+    [0.394396, 3.580501],
+    [0.87248, 4.618706],
+    [0.409932, 3.676867],
+    [0.908969, 4.641845],
+    [0.166819, 3.175939],
+    [0.665016, 4.26498],
+    [0.263727, 3.558448],
+    [0.231214, 3.436632],
+    [0.552928, 3.831052],
+    [0.047744, 3.182853],
+    [0.365746, 3.498906],
+    [0.495002, 3.946833],
+    [0.493466, 3.900583],
+    [0.792101, 4.238522],
+    [0.76966, 4.23308],
+    [0.251821, 3.521557],
+    [0.181951, 3.203344],
+    [0.808177, 4.278105],
+    [0.334116, 3.555705],
+    [0.33863, 3.502661],
+    [0.452584, 3.859776],
+    [0.69477, 4.275956],
+    [0.590902, 3.916191],
+    [0.307928, 3.587961],
+    [0.148364, 3.183004],
+    [0.70218, 4.225236],
+    [0.721544, 4.231083],
+    [0.666886, 4.240544],
+    [0.124931, 3.222372],
+    [0.618286, 4.021445],
+    [0.381086, 3.567479],
+    [0.385643, 3.56258],
+    [0.777175, 4.262059],
+    [0.116089, 3.208813],
+    [0.115487, 3.169825],
+    [0.66351, 4.193949],
+    [0.254884, 3.491678],
+    [0.993888, 4.533306],
+    [0.295434, 3.550108],
+    [0.952523, 4.636427],
+    [0.307047, 3.557078],
+    [0.277261, 3.552874],
+    [0.279101, 3.494159],
+    [0.175724, 3.206828],
+    [0.156383, 3.195266],
+    [0.733165, 4.221292],
+    [0.848142, 4.413372],
+    [0.771184, 4.184347],
+    [0.429492, 3.742878],
+    [0.162176, 3.201878],
+    [0.917064, 4.648964],
+    [0.315044, 3.510117],
+    [0.201473, 3.274434],
+    [0.297038, 3.579622],
+    [0.336647, 3.489244],
+    [0.666109, 4.237386],
+    [0.583888, 3.913749],
+    [0.085031, 3.22899],
+    [0.687006, 4.286286],
+    [0.949655, 4.628614],
+    [0.189912, 3.239536],
+    [0.844027, 4.457997],
+    [0.333288, 3.513384],
+    [0.427035, 3.729674],
+    [0.466369, 3.834274],
+    [0.550659, 3.811155],
+    [0.278213, 3.598316],
+    [0.918769, 4.692514],
+    [0.886555, 4.604859],
+    [0.569488, 3.864912],
+    [0.066379, 3.184236],
+    [0.335751, 3.500796],
+    [0.426863, 3.743365],
+    [0.395746, 3.622905],
+    [0.694221, 4.310796],
+    [0.27276, 3.583357],
+    [0.503495, 3.901852],
+    [0.067119, 3.233521],
+    [0.038326, 3.105266],
+    [0.599122, 3.865544],
+    [0.947054, 4.628625],
+    [0.671279, 4.231213],
+    [0.434811, 3.791149],
+    [0.509381, 3.968271],
+    [0.749442, 4.25391],
+    [0.058014, 3.19471],
+    [0.482978, 3.996503],
+    [0.466776, 3.904358],
+    [0.357767, 3.503976],
+    [0.949123, 4.557545],
+    [0.41732, 3.699876],
+    [0.920461, 4.613614],
+    [0.156433, 3.140401],
+    [0.656662, 4.206717],
+    [0.616418, 3.969524],
+    [0.853428, 4.476096],
+    [0.133295, 3.136528],
+    [0.693007, 4.279071],
+    [0.178449, 3.200603],
+    [0.199526, 3.299012],
+    [0.073224, 3.209873],
+    [0.286515, 3.632942],
+    [0.182026, 3.248361],
+    [0.621523, 3.995783],
+    [0.344584, 3.563262],
+    [0.398556, 3.649712],
+    [0.480369, 3.951845],
+    [0.15335, 3.145031],
+    [0.171846, 3.181577],
+    [0.867082, 4.637087],
+    [0.223855, 3.404964],
+    [0.528301, 3.873188],
+    [0.890192, 4.633648],
+    [0.106352, 3.154768],
+    [0.917886, 4.623637],
+    [0.014855, 3.078132],
+    [0.567682, 3.913596],
+    [0.068854, 3.221817],
+    [0.603535, 3.938071],
+    [0.53205, 3.880822],
+    [0.651362, 4.176436],
+    [0.901225, 4.648161],
+    [0.204337, 3.332312],
+    [0.696081, 4.240614],
+    [0.963924, 4.532224],
+    [0.98139, 4.557105],
+    [0.987911, 4.610072],
+    [0.990947, 4.636569],
+    [0.736021, 4.229813],
+    [0.253574, 3.50086],
+    [0.674722, 4.245514],
+    [0.939368, 4.605182],
+    [0.235419, 3.45434],
+    [0.110521, 3.180775],
+    [0.218023, 3.38082],
+    [0.869778, 4.56502],
+    [0.19683, 3.279973],
+    [0.958178, 4.554241],
+    [0.972673, 4.63352],
+    [0.745797, 4.281037],
+    [0.445674, 3.844426],
+    [0.470557, 3.891601],
+    [0.549236, 3.849728],
+    [0.335691, 3.492215],
+    [0.884739, 4.592374],
+    [0.918916, 4.632025],
+    [0.441815, 3.75675],
+    [0.116598, 3.133555],
+    [0.359274, 3.567919],
+    [0.814811, 4.363382],
+    [0.387125, 3.560165],
+    [0.982243, 4.564305],
+    [0.78088, 4.215055],
+    [0.652565, 4.174999],
+    [0.87003, 4.58664],
+    [0.604755, 3.960008],
+    [0.255212, 3.529963],
+    [0.730546, 4.213412],
+    [0.493829, 3.908685],
+    [0.257017, 3.585821],
+    [0.833735, 4.374394],
+    [0.070095, 3.213817],
+    [0.52707, 3.952681],
+    [0.116163, 3.129283]
+];
+
+
+option = {
+    dataset: [{
+        source: data
+    }, {
+        transform: {
+            type: 'ecStat:regression'
+            // 'linear' by default.
+            // config: { method: 'linear', formulaOn: 'end'}
+        }
+    }],
+    title: {
+        text: 'Linear Regression',
+        subtext: 'By ecStat.regression',
+        sublink: 'https://github.com/ecomfe/echarts-stat',
+        left: 'center'
+    },
+    legend: {
+        bottom: 5
+    },
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'cross'
+        }
+    },
+    xAxis: {
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        },
+    },
+    yAxis: {
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        },
+    },
+    series: [{
+        name: 'scatter',
+        type: 'scatter'
+    }, {
+        name: 'line',
+        type: 'line',
+        datasetIndex: 1,
+        symbolSize: 0.1,
+        symbol: 'circle',
+        label: { show: true, fontSize: 16 },
+        labelLayout: { dx: -20 },
+        encode: { label: 2, tooltip: 1 }
+    }]
+};
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-logarithmic-regression.ts b/public/examples/ts/scatter-logarithmic-regression.ts
new file mode 100644
index 0000000..86d7e8f
--- /dev/null
+++ b/public/examples/ts/scatter-logarithmic-regression.ts
@@ -0,0 +1,135 @@
+/*
+title: Logarithmic Regression
+category: scatter
+titleCN: 对数回归(使用统计插件)
+difficulty: 16
+*/
+
+
+// See https://github.com/ecomfe/echarts-stat
+echarts.registerTransform(ecStat.transform.regression);
+
+option = {
+    dataset: [{
+        source: [
+            [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]
+        ]
+    }, {
+        transform: {
+            type: 'filter',
+            config: { dimension: 4, eq: 1990 }
+        }
+    }, {
+        transform: {
+            type: 'filter',
+            config: { dimension: 4, eq: 2015 }
+        }
+    }, {
+        transform: {
+            type: 'ecStat:regression',
+            config: {
+                method: 'logarithmic'
+            }
+        }
+    }],
+    title: {
+        text: '1990 and 2015 per capita life expectancy and GDP',
+        subtext: 'By ecStat.regression',
+        sublink: 'https://github.com/ecomfe/echarts-stat',
+        left: 'center'
+    },
+    legend: {
+        data: ['1990', '2015'],
+        bottom: 10
+    },
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+            type: 'cross'
+        }
+    },
+    xAxis: {
+        type: 'value',
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        },
+    },
+    yAxis: {
+        type: 'value',
+        splitLine: {
+            lineStyle: {
+                type: 'dashed'
+            }
+        },
+    },
+    visualMap: {
+        show: false,
+        dimension: 2,
+        min: 20000,
+        max: 1500000000,
+        seriesIndex: [0, 1],
+        inRange: {
+            symbolSize: [10, 70]
+        }
+    },
+    series: [{
+        name: '1990',
+        type: 'scatter',
+        datasetIndex: 1
+        },{
+        name: '2015',
+        type: 'scatter',
+        datasetIndex: 2
+        }, {
+        name: 'line',
+        type: 'line',
+        smooth: true,
+        datasetIndex: 3,
+        symbolSize: 0.1,
+        symbol: 'circle',
+        label: { show: true, fontSize: 16 },
+        labelLayout: { dx: -20 },
+        encode: { label: 2, tooltip: 1 }
+    }]
+}
+
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-map-brush.ts b/public/examples/ts/scatter-map-brush.ts
new file mode 100644
index 0000000..51a5586
--- /dev/null
+++ b/public/examples/ts/scatter-map-brush.ts
@@ -0,0 +1,647 @@
+/*
+title: Scatter Map Brush
+category: scatter
+titleCN: Scatter Map Brush
+*/
+
+interface DataItem {
+    name: string
+    value: number
+}
+const geoCoordMap: Record<string, number[]> = {
+    "海门":[121.15,31.89],
+    "鄂尔多斯":[109.781327,39.608266],
+    "招远":[120.38,37.35],
+    "舟山":[122.207216,29.985295],
+    "齐齐哈尔":[123.97,47.33],
+    "盐城":[120.13,33.38],
+    "赤峰":[118.87,42.28],
+    "青岛":[120.33,36.07],
+    "乳山":[121.52,36.89],
+    "金昌":[102.188043,38.520089],
+    "泉州":[118.58,24.93],
+    "莱西":[120.53,36.86],
+    "日照":[119.46,35.42],
+    "胶南":[119.97,35.88],
+    "南通":[121.05,32.08],
+    "拉萨":[91.11,29.97],
+    "云浮":[112.02,22.93],
+    "梅州":[116.1,24.55],
+    "文登":[122.05,37.2],
+    "上海":[121.48,31.22],
+    "攀枝花":[101.718637,26.582347],
+    "威海":[122.1,37.5],
+    "承德":[117.93,40.97],
+    "厦门":[118.1,24.46],
+    "汕尾":[115.375279,22.786211],
+    "潮州":[116.63,23.68],
+    "丹东":[124.37,40.13],
+    "太仓":[121.1,31.45],
+    "曲靖":[103.79,25.51],
+    "烟台":[121.39,37.52],
+    "福州":[119.3,26.08],
+    "瓦房店":[121.979603,39.627114],
+    "即墨":[120.45,36.38],
+    "抚顺":[123.97,41.97],
+    "玉溪":[102.52,24.35],
+    "张家口":[114.87,40.82],
+    "阳泉":[113.57,37.85],
+    "莱州":[119.942327,37.177017],
+    "湖州":[120.1,30.86],
+    "汕头":[116.69,23.39],
+    "昆山":[120.95,31.39],
+    "宁波":[121.56,29.86],
+    "湛江":[110.359377,21.270708],
+    "揭阳":[116.35,23.55],
+    "荣成":[122.41,37.16],
+    "连云港":[119.16,34.59],
+    "葫芦岛":[120.836932,40.711052],
+    "常熟":[120.74,31.64],
+    "东莞":[113.75,23.04],
+    "河源":[114.68,23.73],
+    "淮安":[119.15,33.5],
+    "泰州":[119.9,32.49],
+    "南宁":[108.33,22.84],
+    "营口":[122.18,40.65],
+    "惠州":[114.4,23.09],
+    "江阴":[120.26,31.91],
+    "蓬莱":[120.75,37.8],
+    "韶关":[113.62,24.84],
+    "嘉峪关":[98.289152,39.77313],
+    "广州":[113.23,23.16],
+    "延安":[109.47,36.6],
+    "太原":[112.53,37.87],
+    "清远":[113.01,23.7],
+    "中山":[113.38,22.52],
+    "昆明":[102.73,25.04],
+    "寿光":[118.73,36.86],
+    "盘锦":[122.070714,41.119997],
+    "长治":[113.08,36.18],
+    "深圳":[114.07,22.62],
+    "珠海":[113.52,22.3],
+    "宿迁":[118.3,33.96],
+    "咸阳":[108.72,34.36],
+    "铜川":[109.11,35.09],
+    "平度":[119.97,36.77],
+    "佛山":[113.11,23.05],
+    "海口":[110.35,20.02],
+    "江门":[113.06,22.61],
+    "章丘":[117.53,36.72],
+    "肇庆":[112.44,23.05],
+    "大连":[121.62,38.92],
+    "临汾":[111.5,36.08],
+    "吴江":[120.63,31.16],
+    "石嘴山":[106.39,39.04],
+    "沈阳":[123.38,41.8],
+    "苏州":[120.62,31.32],
+    "茂名":[110.88,21.68],
+    "嘉兴":[120.76,30.77],
+    "长春":[125.35,43.88],
+    "胶州":[120.03336,36.264622],
+    "银川":[106.27,38.47],
+    "张家港":[120.555821,31.875428],
+    "三门峡":[111.19,34.76],
+    "锦州":[121.15,41.13],
+    "南昌":[115.89,28.68],
+    "柳州":[109.4,24.33],
+    "三亚":[109.511909,18.252847],
+    "自贡":[104.778442,29.33903],
+    "吉林":[126.57,43.87],
+    "阳江":[111.95,21.85],
+    "泸州":[105.39,28.91],
+    "西宁":[101.74,36.56],
+    "宜宾":[104.56,29.77],
+    "呼和浩特":[111.65,40.82],
+    "成都":[104.06,30.67],
+    "大同":[113.3,40.12],
+    "镇江":[119.44,32.2],
+    "桂林":[110.28,25.29],
+    "张家界":[110.479191,29.117096],
+    "宜兴":[119.82,31.36],
+    "北海":[109.12,21.49],
+    "西安":[108.95,34.27],
+    "金坛":[119.56,31.74],
+    "东营":[118.49,37.46],
+    "牡丹江":[129.58,44.6],
+    "遵义":[106.9,27.7],
+    "绍兴":[120.58,30.01],
+    "扬州":[119.42,32.39],
+    "常州":[119.95,31.79],
+    "潍坊":[119.1,36.62],
+    "重庆":[106.54,29.59],
+    "台州":[121.420757,28.656386],
+    "南京":[118.78,32.04],
+    "滨州":[118.03,37.36],
+    "贵阳":[106.71,26.57],
+    "无锡":[120.29,31.59],
+    "本溪":[123.73,41.3],
+    "克拉玛依":[84.77,45.59],
+    "渭南":[109.5,34.52],
+    "马鞍山":[118.48,31.56],
+    "宝鸡":[107.15,34.38],
+    "焦作":[113.21,35.24],
+    "句容":[119.16,31.95],
+    "北京":[116.46,39.92],
+    "徐州":[117.2,34.26],
+    "衡水":[115.72,37.72],
+    "包头":[110,40.58],
+    "绵阳":[104.73,31.48],
+    "乌鲁木齐":[87.68,43.77],
+    "枣庄":[117.57,34.86],
+    "杭州":[120.19,30.26],
+    "淄博":[118.05,36.78],
+    "鞍山":[122.85,41.12],
+    "溧阳":[119.48,31.43],
+    "库尔勒":[86.06,41.68],
+    "安阳":[114.35,36.1],
+    "开封":[114.35,34.79],
+    "济南":[117,36.65],
+    "德阳":[104.37,31.13],
+    "温州":[120.65,28.01],
+    "九江":[115.97,29.71],
+    "邯郸":[114.47,36.6],
+    "临安":[119.72,30.23],
+    "兰州":[103.73,36.03],
+    "沧州":[116.83,38.33],
+    "临沂":[118.35,35.05],
+    "南充":[106.110698,30.837793],
+    "天津":[117.2,39.13],
+    "富阳":[119.95,30.07],
+    "泰安":[117.13,36.18],
+    "诸暨":[120.23,29.71],
+    "郑州":[113.65,34.76],
+    "哈尔滨":[126.63,45.75],
+    "聊城":[115.97,36.45],
+    "芜湖":[118.38,31.33],
+    "唐山":[118.02,39.63],
+    "平顶山":[113.29,33.75],
+    "邢台":[114.48,37.05],
+    "德州":[116.29,37.45],
+    "济宁":[116.59,35.38],
+    "荆州":[112.239741,30.335165],
+    "宜昌":[111.3,30.7],
+    "义乌":[120.06,29.32],
+    "丽水":[119.92,28.45],
+    "洛阳":[112.44,34.7],
+    "秦皇岛":[119.57,39.95],
+    "株洲":[113.16,27.83],
+    "石家庄":[114.48,38.03],
+    "莱芜":[117.67,36.19],
+    "常德":[111.69,29.05],
+    "保定":[115.48,38.85],
+    "湘潭":[112.91,27.87],
+    "金华":[119.64,29.12],
+    "岳阳":[113.09,29.37],
+    "长沙":[113,28.21],
+    "衢州":[118.88,28.97],
+    "廊坊":[116.7,39.53],
+    "菏泽":[115.480656,35.23375],
+    "合肥":[117.27,31.86],
+    "武汉":[114.31,30.52],
+    "大庆":[125.03,46.58]
+};
+
+const data: DataItem[] = [
+    {name: "海门", value: 9},
+    {name: "鄂尔多斯", value: 12},
+    {name: "招远", value: 12},
+    {name: "舟山", value: 12},
+    {name: "齐齐哈尔", value: 14},
+    {name: "盐城", value: 15},
+    {name: "赤峰", value: 16},
+    {name: "青岛", value: 18},
+    {name: "乳山", value: 18},
+    {name: "金昌", value: 19},
+    {name: "泉州", value: 21},
+    {name: "莱西", value: 21},
+    {name: "日照", value: 21},
+    {name: "胶南", value: 22},
+    {name: "南通", value: 23},
+    {name: "拉萨", value: 24},
+    {name: "云浮", value: 24},
+    {name: "梅州", value: 25},
+    {name: "文登", value: 25},
+    {name: "上海", value: 25},
+    {name: "攀枝花", value: 25},
+    {name: "威海", value: 25},
+    {name: "承德", value: 25},
+    {name: "厦门", value: 26},
+    {name: "汕尾", value: 26},
+    {name: "潮州", value: 26},
+    {name: "丹东", value: 27},
+    {name: "太仓", value: 27},
+    {name: "曲靖", value: 27},
+    {name: "烟台", value: 28},
+    {name: "福州", value: 29},
+    {name: "瓦房店", value: 30},
+    {name: "即墨", value: 30},
+    {name: "抚顺", value: 31},
+    {name: "玉溪", value: 31},
+    {name: "张家口", value: 31},
+    {name: "阳泉", value: 31},
+    {name: "莱州", value: 32},
+    {name: "湖州", value: 32},
+    {name: "汕头", value: 32},
+    {name: "昆山", value: 33},
+    {name: "宁波", value: 33},
+    {name: "湛江", value: 33},
+    {name: "揭阳", value: 34},
+    {name: "荣成", value: 34},
+    {name: "连云港", value: 35},
+    {name: "葫芦岛", value: 35},
+    {name: "常熟", value: 36},
+    {name: "东莞", value: 36},
+    {name: "河源", value: 36},
+    {name: "淮安", value: 36},
+    {name: "泰州", value: 36},
+    {name: "南宁", value: 37},
+    {name: "营口", value: 37},
+    {name: "惠州", value: 37},
+    {name: "江阴", value: 37},
+    {name: "蓬莱", value: 37},
+    {name: "韶关", value: 38},
+    {name: "嘉峪关", value: 38},
+    {name: "广州", value: 38},
+    {name: "延安", value: 38},
+    {name: "太原", value: 39},
+    {name: "清远", value: 39},
+    {name: "中山", value: 39},
+    {name: "昆明", value: 39},
+    {name: "寿光", value: 40},
+    {name: "盘锦", value: 40},
+    {name: "长治", value: 41},
+    {name: "深圳", value: 41},
+    {name: "珠海", value: 42},
+    {name: "宿迁", value: 43},
+    {name: "咸阳", value: 43},
+    {name: "铜川", value: 44},
+    {name: "平度", value: 44},
+    {name: "佛山", value: 44},
+    {name: "海口", value: 44},
+    {name: "江门", value: 45},
+    {name: "章丘", value: 45},
+    {name: "肇庆", value: 46},
+    {name: "大连", value: 47},
+    {name: "临汾", value: 47},
+    {name: "吴江", value: 47},
+    {name: "石嘴山", value: 49},
+    {name: "沈阳", value: 50},
+    {name: "苏州", value: 50},
+    {name: "茂名", value: 50},
+    {name: "嘉兴", value: 51},
+    {name: "长春", value: 51},
+    {name: "胶州", value: 52},
+    {name: "银川", value: 52},
+    {name: "张家港", value: 52},
+    {name: "三门峡", value: 53},
+    {name: "锦州", value: 54},
+    {name: "南昌", value: 54},
+    {name: "柳州", value: 54},
+    {name: "三亚", value: 54},
+    {name: "自贡", value: 56},
+    {name: "吉林", value: 56},
+    {name: "阳江", value: 57},
+    {name: "泸州", value: 57},
+    {name: "西宁", value: 57},
+    {name: "宜宾", value: 58},
+    {name: "呼和浩特", value: 58},
+    {name: "成都", value: 58},
+    {name: "大同", value: 58},
+    {name: "镇江", value: 59},
+    {name: "桂林", value: 59},
+    {name: "张家界", value: 59},
+    {name: "宜兴", value: 59},
+    {name: "北海", value: 60},
+    {name: "西安", value: 61},
+    {name: "金坛", value: 62},
+    {name: "东营", value: 62},
+    {name: "牡丹江", value: 63},
+    {name: "遵义", value: 63},
+    {name: "绍兴", value: 63},
+    {name: "扬州", value: 64},
+    {name: "常州", value: 64},
+    {name: "潍坊", value: 65},
+    {name: "重庆", value: 66},
+    {name: "台州", value: 67},
+    {name: "南京", value: 67},
+    {name: "滨州", value: 70},
+    {name: "贵阳", value: 71},
+    {name: "无锡", value: 71},
+    {name: "本溪", value: 71},
+    {name: "克拉玛依", value: 72},
+    {name: "渭南", value: 72},
+    {name: "马鞍山", value: 72},
+    {name: "宝鸡", value: 72},
+    {name: "焦作", value: 75},
+    {name: "句容", value: 75},
+    {name: "北京", value: 79},
+    {name: "徐州", value: 79},
+    {name: "衡水", value: 80},
+    {name: "包头", value: 80},
+    {name: "绵阳", value: 80},
+    {name: "乌鲁木齐", value: 84},
+    {name: "枣庄", value: 84},
+    {name: "杭州", value: 84},
+    {name: "淄博", value: 85},
+    {name: "鞍山", value: 86},
+    {name: "溧阳", value: 86},
+    {name: "库尔勒", value: 86},
+    {name: "安阳", value: 90},
+    {name: "开封", value: 90},
+    {name: "济南", value: 92},
+    {name: "德阳", value: 93},
+    {name: "温州", value: 95},
+    {name: "九江", value: 96},
+    {name: "邯郸", value: 98},
+    {name: "临安", value: 99},
+    {name: "兰州", value: 99},
+    {name: "沧州", value: 100},
+    {name: "临沂", value: 103},
+    {name: "南充", value: 104},
+    {name: "天津", value: 105},
+    {name: "富阳", value: 106},
+    {name: "泰安", value: 112},
+    {name: "诸暨", value: 112},
+    {name: "郑州", value: 113},
+    {name: "哈尔滨", value: 114},
+    {name: "聊城", value: 116},
+    {name: "芜湖", value: 117},
+    {name: "唐山", value: 119},
+    {name: "平顶山", value: 119},
+    {name: "邢台", value: 119},
+    {name: "德州", value: 120},
+    {name: "济宁", value: 120},
+    {name: "荆州", value: 127},
+    {name: "宜昌", value: 130},
+    {name: "义乌", value: 132},
+    {name: "丽水", value: 133},
+    {name: "洛阳", value: 134},
+    {name: "秦皇岛", value: 136},
+    {name: "株洲", value: 143},
+    {name: "石家庄", value: 147},
+    {name: "莱芜", value: 148},
+    {name: "常德", value: 152},
+    {name: "保定", value: 153},
+    {name: "湘潭", value: 154},
+    {name: "金华", value: 157},
+    {name: "岳阳", value: 169},
+    {name: "长沙", value: 175},
+    {name: "衢州", value: 177},
+    {name: "廊坊", value: 193},
+    {name: "菏泽", value: 194},
+    {name: "合肥", value: 229},
+    {name: "武汉", value: 273},
+    {name: "大庆", value: 279}
+];
+
+var convertData = function (data: DataItem[]) {
+    var res = [];
+    for (var i = 0; i < data.length; i++) {
+        var geoCoord = geoCoordMap[data[i].name];
+        if (geoCoord) {
+            res.push({
+                name: data[i].name,
+                value: geoCoord.concat(data[i].value)
+            });
+        }
+    }
+    return res;
+};
+
+var convertedData = [
+    convertData(data),
+    convertData(data.sort(function (a, b) {
+        return b.value - a.value;
+    }).slice(0, 6))
+];
+
+
+option = {
+    backgroundColor: '#404a59',
+    animation: true,
+    animationDuration: 1000,
+    animationEasing: 'cubicInOut',
+    animationDurationUpdate: 1000,
+    animationEasingUpdate: 'cubicInOut',
+    title: [
+        {
+            text: '全国主要城市 PM 2.5',
+            subtext: 'data from PM25.in',
+            sublink: 'http://www.pm25.in',
+            left: 'center',
+            textStyle: {
+                color: '#fff'
+            }
+        },
+        {
+            id: 'statistic',
+            right: 120,
+            top: 40,
+            width: 100,
+            textStyle: {
+                color: '#fff',
+                fontSize: 16
+            }
+        }
+    ],
+    toolbox: {
+        iconStyle: {
+            borderColor: '#fff'
+        },
+        emphasis: {
+            iconStyle: {
+                borderColor: '#b1e4ff'
+            }
+        }
+    },
+    brush: {
+        outOfBrush: {
+            color: '#abc'
+        },
+        brushStyle: {
+            borderWidth: 2,
+            color: 'rgba(0,0,0,0.2)',
+            borderColor: 'rgba(0,0,0,0.5)',
+        },
+        seriesIndex: [0, 1],
+        throttleType: 'debounce',
+        throttleDelay: 300,
+        geoIndex: 0
+    },
+    geo: {
+        map: 'china',
+        left: '10',
+        right: '35%',
+        center: [117.98561551896913, 31.205000490896193],
+        zoom: 2.5,
+        emphasis: {
+            itemStyle: {
+                areaColor: '#2a333d'
+            },
+            label: {
+                show: false
+            }
+        },
+        roam: true,
+        itemStyle: {
+            areaColor: '#323c48',
+            borderColor: '#111'
+        }
+    },
+    tooltip : {
+        trigger: 'item'
+    },
+    grid: {
+        right: 40,
+        top: 100,
+        bottom: 40,
+        width: '30%'
+    },
+    xAxis: {
+        type: 'value',
+        scale: true,
+        position: 'top',
+        boundaryGap: false,
+        splitLine: {show: false},
+        axisLine: {show: false},
+        axisTick: {show: false},
+        axisLabel: {margin: 2, color: '#aaa'},
+    },
+    yAxis: {
+        type: 'category',
+        name: 'TOP 20',
+        nameGap: 16,
+        axisLine: {show: false, lineStyle: {color: '#ddd'}},
+        axisTick: {show: false, lineStyle: {color: '#ddd'}},
+        axisLabel: {interval: 0, color: '#ddd'},
+        data: []
+    },
+    series : [
+        {
+            name: 'pm2.5',
+            type: 'scatter',
+            coordinateSystem: 'geo',
+            data: convertedData[0],
+            symbolSize: function (val) {
+                return Math.max(val[2] / 10, 8);
+            },
+            label: {
+                formatter: '{b}',
+                position: 'right',
+                show: false
+            },
+            itemStyle: {
+                color: '#ddb926'
+            },
+            emphasis: {
+                label: {
+                    show: true
+                }
+            }
+        },
+        {
+            name: 'Top 5',
+            type: 'effectScatter',
+            coordinateSystem: 'geo',
+            data: convertedData[1],
+            symbolSize: function (val) {
+                return Math.max(val[2] / 10, 8);
+            },
+            showEffectOn: 'emphasis',
+            rippleEffect: {
+                brushType: 'stroke'
+            },
+            emphasis: {
+                scale: true
+            },
+            label: {
+                formatter: '{b}',
+                position: 'right',
+                show: true
+            },
+            itemStyle: {
+                color: '#f4e925',
+                shadowBlur: 10,
+                shadowColor: '#333'
+            },
+            zlevel: 1
+        },
+        {
+            id: 'bar',
+            zlevel: 2,
+            type: 'bar',
+            itemStyle: {
+                color: '#ddb926'
+            },
+            data: []
+        }
+    ]
+};
+
+
+myChart.on('brushselected', renderBrushed);
+
+// myChart.setOption(option);
+
+setTimeout(function () {
+    myChart.dispatchAction({
+        type: 'brush',
+        areas: [
+            {
+                geoIndex: 0,
+                brushType: 'polygon',
+                coordRange: [[119.72,34.85],[119.68,34.85],[119.5,34.84],[119.19,34.77],[118.76,34.63],[118.6,34.6],[118.46,34.6],[118.33,34.57],[118.05,34.56],[117.6,34.56],[117.41,34.56],[117.25,34.56],[117.11,34.56],[117.02,34.56],[117,34.56],[116.94,34.56],[116.94,34.55],[116.9,34.5],[116.88,34.44],[116.88,34.37],[116.88,34.33],[116.88,34.24],[116.92,34.15],[116.98,34.09],[117.05,34.06],[117.19,33.96],[117.29,33.9],[117.43,33.8],[117.49,33.75],[117.54,33.68],[117.6,33.65],[117.62,33. [...]
+            }
+        ]
+    });
+}, 0);
+
+
+function renderBrushed(params: any) {
+    const mainSeries = params.batch[0].selected[0];
+
+    const selectedItems = [];
+    const categoryData = [];
+    const barData = [];
+    const maxBar = 30;
+    let sum = 0;
+    let count = 0;
+
+    for (var i = 0; i < mainSeries.dataIndex.length; i++) {
+        var rawIndex = mainSeries.dataIndex[i];
+        var dataItem = convertedData[0][rawIndex];
+        var pmValue = dataItem.value[2];
+
+        sum += pmValue;
+        count++;
+
+        selectedItems.push(dataItem);
+    }
+
+    selectedItems.sort(function (a, b) {
+        return a.value[2] - b.value[2];
+    });
+
+    for (var i = 0; i < Math.min(selectedItems.length, maxBar); i++) {
+        categoryData.push(selectedItems[i].name);
+        barData.push(selectedItems[i].value[2]);
+    }
+
+    myChart.setOption<echarts.EChartsOption>({
+        yAxis: {
+            data: categoryData
+        },
+        xAxis: {
+            axisLabel: {show: !!count}
+        },
+        title: {
+            id: 'statistic',
+            text: count ? '平均: ' + (sum / count).toFixed(4) : ''
+        },
+        series: {
+            id: 'bar',
+            data: barData
+        }
+    });
+}
+export {}
\ No newline at end of file
diff --git a/public/examples/ts/scatter-matrix.ts b/public/examples/ts/scatter-matrix.ts
new file mode 100644
index 0000000..f49a383
--- /dev/null
+++ b/public/examples/ts/scatter-matrix.ts
@@ -0,0 +1,302 @@
+/*
+title: Scatter Matrix
+category: 'parallel, scatter'
+titleCN: 散点矩阵和平行坐标
+difficulty: 10
+*/
+
+// Schema:
+// date,AQIindex,PM2.5,PM10,CO,NO2,SO2
+const schema = [
+    {name: 'AQIindex', index: 1, text: 'AQI'},
+    {name: 'PM25', index: 2, text: 'PM 2.5'},
+    {name: 'PM10', index: 3, text: 'PM 10'},
+    {name: 'CO', index: 4, text: 'CO'},
+    {name: 'NO2', index: 5, text: 'NO₂'},
+    {name: 'SO2', index: 6, text: 'SO₂'},
+    {name: '等级', index: 7, text: '等级'}
+];
+
+const rawData = [
+    [55,9,56,0.46,18,6,"良", "北京"],
+    [25,11,21,0.65,34,9,"优", "北京"],
+    [56,7,63,0.3,14,5,"良", "北京"],
+    [33,7,29,0.33,16,6,"优", "北京"],
+    [42,24,44,0.76,40,16,"优", "北京"],
+    [82,58,90,1.77,68,33,"良", "北京"],
+    [74,49,77,1.46,48,27,"良", "北京"],
+    [78,55,80,1.29,59,29,"良", "北京"],
+    [267,216,280,4.8,108,64,"重度", "北京"],
+    [185,127,216,2.52,61,27,"中度", "北京"],
+    [39,19,38,0.57,31,15,"优", "北京"],
+    [41,11,40,0.43,21,7,"优", "北京"],
+    [64,38,74,1.04,46,22,"良", "北京"],
+    [108,79,120,1.7,75,41,"轻度", "北京"],
+    [108,63,116,1.48,44,26,"轻度", "北京"],
+    [33,6,29,0.34,13,5,"优", "北京"],
+    [94,66,110,1.54,62,31,"良", "北京"],
+    [186,142,192,3.88,93,79,"中度", "北京"],
+    [57,31,54,0.96,32,14,"良", "北京"],
+    [22,8,17,0.48,23,10,"优", "北京"],
+    [39,15,36,0.61,29,13,"优", "北京"],
+    [94,69,114,2.08,73,39,"良", "北京"],
+    [99,73,110,2.43,76,48,"良", "北京"],
+    [31,12,30,0.5,32,16,"优", "北京"],
+    [42,27,43,1,53,22,"优", "北京"],
+    [154,117,157,3.05,92,58,"中度", "北京"],
+    [234,185,230,4.09,123,69,"重度", "北京"],
+    [160,120,186,2.77,91,50,"中度", "北京"],
+    [134,96,165,2.76,83,41,"轻度", "北京"],
+    [52,24,60,1.03,50,21,"良", "北京"],
+    [46,5,49,0.28,10,6,"优", "北京"],
+
+    [26,37,27,1.163,27,13,"优", "广州"],
+    [85,62,71,1.195,60,8,"良", "广州"],
+    [78,38,74,1.363,37,7,"良", "广州"],
+    [21,21,36,0.634,40,9,"优", "广州"],
+    [41,42,46,0.915,81,13,"优", "广州"],
+    [56,52,69,1.067,92,16,"良", "广州"],
+    [64,30,28,0.924,51,2,"良", "广州"],
+    [55,48,74,1.236,75,26,"良", "广州"],
+    [76,85,113,1.237,114,27,"良", "广州"],
+    [91,81,104,1.041,56,40,"良", "广州"],
+    [84,39,60,0.964,25,11,"良", "广州"],
+    [64,51,101,0.862,58,23,"良", "广州"],
+    [70,69,120,1.198,65,36,"良", "广州"],
+    [77,105,178,2.549,64,16,"良", "广州"],
+    [109,68,87,0.996,74,29,"轻度", "广州"],
+    [73,68,97,0.905,51,34,"良", "广州"],
+    [54,27,47,0.592,53,12,"良", "广州"],
+    [51,61,97,0.811,65,19,"良", "广州"],
+    [91,71,121,1.374,43,18,"良", "广州"],
+    [73,102,182,2.787,44,19,"良", "广州"],
+    [73,50,76,0.717,31,20,"良", "广州"],
+    [84,94,140,2.238,68,18,"良", "广州"],
+    [93,77,104,1.165,53,7,"良", "广州"],
+    [99,130,227,3.97,55,15,"良", "广州"],
+    [146,84,139,1.094,40,17,"轻度", "广州"],
+    [113,108,137,1.481,48,15,"轻度", "广州"],
+    [81,48,62,1.619,26,3,"良", "广州"],
+    [56,48,68,1.336,37,9,"良", "广州"],
+    [82,92,174,3.29,0,13,"良", "广州"],
+    [106,116,188,3.628,101,16,"轻度", "广州"],
+    [118,50,0,1.383,76,11,"轻度", "广州"],
+
+    [91,45,125,0.82,34,23,"良", "上海"],
+    [65,27,78,0.86,45,29,"良", "上海"],
+    [83,60,84,1.09,73,27,"良", "上海"],
+    [109,81,121,1.28,68,51,"轻度", "上海"],
+    [106,77,114,1.07,55,51,"轻度", "上海"],
+    [109,81,121,1.28,68,51,"轻度", "上海"],
+    [106,77,114,1.07,55,51,"轻度", "上海"],
+    [89,65,78,0.86,51,26,"良", "上海"],
+    [53,33,47,0.64,50,17,"良", "上海"],
+    [80,55,80,1.01,75,24,"良", "上海"],
+    [117,81,124,1.03,45,24,"轻度", "上海"],
+    [99,71,142,1.1,62,42,"良", "上海"],
+    [95,69,130,1.28,74,50,"良", "上海"],
+    [116,87,131,1.47,84,40,"轻度", "上海"],
+    [108,80,121,1.3,85,37,"轻度", "上海"],
+    [134,83,167,1.16,57,43,"轻度", "上海"],
+    [79,43,107,1.05,59,37,"良", "上海"],
+    [71,46,89,0.86,64,25,"良", "上海"],
+    [97,71,113,1.17,88,31,"良", "上海"],
+    [84,57,91,0.85,55,31,"良", "上海"],
+    [87,63,101,0.9,56,41,"良", "上海"],
+    [104,77,119,1.09,73,48,"轻度", "上海"],
+    [87,62,100,1,72,28,"良", "上海"],
+    [168,128,172,1.49,97,56,"中度", "上海"],
+    [65,45,51,0.74,39,17,"良", "上海"],
+    [39,24,38,0.61,47,17,"优", "上海"],
+    [39,24,39,0.59,50,19,"优", "上海"],
+    [93,68,96,1.05,79,29,"良", "上海"],
+    [188,143,197,1.66,99,51,"中度", "上海"],
+    [174,131,174,1.55,108,50,"中度", "上海"],
+    [187,143,201,1.39,89,53,"中度", "上海"]
+];
+
+const CATEGORY_DIM_COUNT = 6;
+const GAP = 2;
+const BASE_LEFT = 5;
+const BASE_TOP = 10;
+// const GRID_WIDTH = 220;
+// const GRID_HEIGHT = 220;
+const GRID_WIDTH = (100 - BASE_LEFT - GAP) / CATEGORY_DIM_COUNT - GAP;
+const GRID_HEIGHT = (100 - BASE_TOP - GAP) / CATEGORY_DIM_COUNT - GAP;
+const CATEGORY_DIM = 7;
+const SYMBOL_SIZE = 4;
+
+function retrieveScatterData(data, dimX, dimY) {
+    var result = [];
+    for (var i = 0; i < data.length; i++) {
+        var item = [data[i][dimX], data[i][dimY]];
+        item[CATEGORY_DIM] = data[i][CATEGORY_DIM];
+        result.push(item);
+    }
+    return result;
+}
+
+function generateGrids(option) {
+    var index = 0;
+
+    for (var i = 0; i < CATEGORY_DIM_COUNT; i++) {
+        for (var j = 0; j < CATEGORY_DIM_COUNT; j++) {
+            if (CATEGORY_DIM_COUNT - i + j >= CATEGORY_DIM_COUNT) {
+                continue;
+            }
+
+            option.grid.push({
+                left: BASE_LEFT + i * (GRID_WIDTH + GAP) + '%',
+                top: BASE_TOP + j * (GRID_HEIGHT + GAP) + '%',
+                width: GRID_WIDTH + '%',
+                height: GRID_HEIGHT + '%'
+            });
+
+            option.brush.xAxisIndex && option.brush.xAxisIndex.push(index);
+            option.brush.yAxisIndex && option.brush.yAxisIndex.push(index);
+
+            option.xAxis.push({
+                splitNumber: 3,
+                position: 'top',
+                axisLine: {
+                    show: j === 0,
+                    onZero: false
+                },
+                axisTick: {
+                    show: j === 0,
+                    inside: true
+                },
+                axisLabel: {
+                    show: j === 0
+                },
+                type: 'value',
+                gridIndex: index,
+                scale: true
+            });
+
+            option.yAxis.push({
+                splitNumber: 3,
+                position: 'right',
+                axisLine: {
+                    show: i === CATEGORY_DIM_COUNT - 1,
+                    onZero: false
+                },
+                axisTick: {
+                    show: i === CATEGORY_DIM_COUNT - 1,
+                    inside: true
+                },
+                axisLabel: {
+                    show: i === CATEGORY_DIM_COUNT - 1
+                },
+                type: 'value',
+                gridIndex: index,
+                scale: true
+            });
+
+            option.series.push({
+                type: 'scatter',
+                symbolSize: SYMBOL_SIZE,
+                xAxisIndex: index,
+                yAxisIndex: index,
+                data: retrieveScatterData(rawData, i, j)
+            });
+
+            option.visualMap.seriesIndex.push(option.series.length - 1);
+
+            index++;
+        }
+    }
+}
+
+
+var option = {
+    animation: false,
+    brush: {
+        brushLink: 'all',
+        xAxisIndex: [],
+        yAxisIndex: [],
+        inBrush: {
+            opacity: 1
+        }
+    },
+    visualMap: {
+        type: 'piecewise',
+        categories: ["北京", "上海", "广州"],
+        dimension: CATEGORY_DIM,
+        orient: 'horizontal',
+        top: 0,
+        left: 'center',
+        inRange: {
+            color: ['#51689b', '#ce5c5c', '#fbc357']
+        },
+        outOfRange: {
+            color: '#ddd'
+        },
+        seriesIndex: [0]
+    },
+    tooltip: {
+        trigger: 'item'
+    },
+    parallelAxis: [
+        {dim: 0, name: schema[0].text},
+        {dim: 1, name: schema[1].text},
+        {dim: 2, name: schema[2].text},
+        {dim: 3, name: schema[3].text},
+        {dim: 4, name: schema[4].text},
+        {dim: 5, name: schema[5].text},
+        {dim: 6, name: schema[6].text,
+            type: 'category', data: ['优', '良', '轻度', '中度', '重度', '严重']
+        }
+    ],
+    parallel: {
+        bottom: '5%',
+        left: '2%',
+        height: '30%',
+        width: '55%',
+        parallelAxisDefault: {
+            type: 'value',
+            name: 'AQI指数',
+            nameLocation: 'end',
+            nameGap: 20,
+            splitNumber: 3,
+            nameTextStyle: {
+                fontSize: 14
+            },
+            axisLine: {
+                lineStyle: {
+                    color: '#555'
+                }
+            },
+            axisTick: {
+                lineStyle: {
+                    color: '#555'
+                }
+            },
+            splitLine: {
+                show: false
+            },
+            axisLabel: {
+                color: '#555'
+            }
+        }
+    },
+    grid: [],
+    xAxis: [],
+    yAxis: [],
+    series: [
+        {
+            name: 'parallel',
+            type: 'parallel',
+            smooth: true,
+            lineStyle: {
+                width: 1,
+                opacity: 0.3
+            },
+            data: rawData
+        }
+    ]
+};
+
+generateGrids(option);
+
+export {}
\ No newline at end of file
diff --git a/src/common/store.js b/src/common/store.js
index 36206f8..95a0d0f 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -49,7 +49,7 @@ export function parseSourceCode(code) {
         // remove front matter
         .replace(/\/\*[\w\W]*?\*\//, '').trim()
         // ts code needs add `export {}` to be a module. remove it.
-        .replace(/export\s+\{\s*\}$/g, '');
+        .replace(/export\s+\{\s*\}\s*;?$/g, '');
 }
 
 let hashId = 123;

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org