|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | Licensed to the Apache Software Foundation (ASF) under one | 
|  | or more contributor license agreements.  See the NOTICE file | 
|  | distributed with this work for additional information | 
|  | regarding copyright ownership.  The ASF licenses this file | 
|  | to you under the Apache License, Version 2.0 (the | 
|  | "License"); you may not use this file except in compliance | 
|  | with the License.  You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, | 
|  | software distributed under the License is distributed on an | 
|  | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | KIND, either express or implied.  See the License for the | 
|  | specific language governing permissions and limitations | 
|  | under the License. | 
|  | --> | 
|  |  | 
|  | <html> | 
|  | <head> | 
|  | <meta charset='utf-8'> | 
|  | <meta name="viewport" content="width=device-width, initial-scale=1" /> | 
|  | <script src="lib/simpleRequire.js"></script> | 
|  | <script src="lib/config.js"></script> | 
|  | <script src='lib/jquery.min.js'></script> | 
|  | <script src="../dist/echarts.js"></script> | 
|  | <script src="lib/testHelper.js"></script> | 
|  | <link rel="stylesheet" href="lib/reset.css" /> | 
|  | </head> | 
|  | <body> | 
|  | <style> | 
|  | </style> | 
|  |  | 
|  | <div id="main0"></div> | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  |  | 
|  | require([ | 
|  | 'echarts', 'ecStat', 'ecSimpleTransform', 'ecSimpleOptionPlayer', | 
|  | 'data/life-expectancy-table.json' | 
|  | ], function (echarts, ecStat, ecSimpleTransform, ecSimpleOptionPlayer, rawData) { | 
|  |  | 
|  | echarts.registerTransform(ecSimpleTransform.aggregate); | 
|  | echarts.registerTransform(ecSimpleTransform.id); | 
|  |  | 
|  | const COLORS = [ | 
|  | '#37A2DA', '#e06343', '#37a354', '#b55dba', '#b5bd48', '#8378EA', '#96BFFF' | 
|  | ]; | 
|  | var COUNTRY_A = 'Germany'; | 
|  | var COUNTRY_B = 'France'; | 
|  | const CONTENT_COLORS = { | 
|  | [COUNTRY_A]: '#37a354', | 
|  | [COUNTRY_B]: '#e06343' | 
|  | }; | 
|  | const Z2 = { | 
|  | [COUNTRY_A]: 1, | 
|  | [COUNTRY_B]: 2 | 
|  | } | 
|  |  | 
|  | // const COLORS = [ | 
|  | //     {name: 'Income', index: 0, text: '人均收入', unit: '美元'}, | 
|  | //     {name: 'LifeExpectancy', index: 1, text: '人均寿命', unit: '岁'}, | 
|  | //     {name: 'Population', index: 2, text: '总人口', unit: ''}, | 
|  | //     {name: 'Country', index: 3, text: '国家', unit: ''} | 
|  | // ]; | 
|  |  | 
|  | var RAW_DATA_DIMENSIONS = ['Income', 'Life Expectancy', 'Population', 'Country', 'Year']; | 
|  | var ID_RAW_DATA_DIMENSIONS = ['Income', 'Life Expectancy', 'Population', 'Country', 'Year', 'Id']; | 
|  | var SUM_INCOME_DIMENSIONS = ['Income', 'Country']; | 
|  | var ANIMATION_DURATION_UPDATE = 1000; | 
|  | var AXIS_NAME_STYLE = { | 
|  | nameGap: 25, | 
|  | nameTextStyle: { | 
|  | fontSize: 20 | 
|  | }, | 
|  | }; | 
|  |  | 
|  | var baseOption = { | 
|  | animationDurationUpdate: ANIMATION_DURATION_UPDATE, | 
|  | dataset: [{ | 
|  | id: 'RawData', | 
|  | source: rawData | 
|  | }, { | 
|  | id: 'IdRawData', | 
|  | fromDatasetId: 'RawData', | 
|  | transform: [{ | 
|  | type: 'filter', | 
|  | config: { | 
|  | dimension: 'Year', gte: 1950 | 
|  | } | 
|  | }, { | 
|  | type: 'ecSimpleTransform:id', | 
|  | config: { | 
|  | dimensionIndex: ID_RAW_DATA_DIMENSIONS.indexOf('Id'), | 
|  | dimensionName: 'Id' | 
|  | } | 
|  | }] | 
|  | }, { | 
|  | id: 'CountryABData', | 
|  | fromDatasetId: 'IdRawData', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { | 
|  | or: [{ | 
|  | dimension: 'Country', '=': COUNTRY_A | 
|  | }, { | 
|  | dimension: 'Country', '=': COUNTRY_B | 
|  | }] | 
|  | } | 
|  | } | 
|  | }, { | 
|  | id: 'CountryABSumIncome', | 
|  | fromDatasetId: 'CountryABData', | 
|  | transform: { | 
|  | type: 'ecSimpleTransform:aggregate', | 
|  | config: { | 
|  | resultDimensions: [ | 
|  | { from: 'Income', method: 'sum' }, | 
|  | { from: 'Country' } | 
|  | ], | 
|  | groupBy: 'Country' | 
|  | } | 
|  | } | 
|  | }], | 
|  | tooltip: {} | 
|  | }; | 
|  |  | 
|  | var optionCreators = { | 
|  |  | 
|  | 'CountryAB_Year_Income_Bar': function (datasetId, onlyCountry) { | 
|  | return { | 
|  | xAxis: { | 
|  | type: 'category' | 
|  | }, | 
|  | yAxis: { | 
|  | name: 'Income', | 
|  | ...AXIS_NAME_STYLE | 
|  | }, | 
|  | series: { | 
|  | type: 'custom', | 
|  | coordinateSystem: 'cartesian2d', | 
|  | datasetId: datasetId, | 
|  | encode: { | 
|  | x: 'Year', | 
|  | y: 'Income', | 
|  | itemName: 'Year', | 
|  | tooltip: ['Income'], | 
|  | }, | 
|  | renderItem: function (params, api) { | 
|  | var valPos = api.coord([api.value('Year'), api.value('Income')]); | 
|  | var basePos = api.coord([api.value('Year'), 0]); | 
|  | var width = api.size([1, 0])[0] * 0.9; | 
|  |  | 
|  | var country = api.value('Country'); | 
|  | if (onlyCountry != null && onlyCountry !== country) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | return { | 
|  | type: 'group', | 
|  | children: [{ | 
|  | type: 'rect', | 
|  | transition: ['shape', 'style'], | 
|  | shape: { | 
|  | x: basePos[0], | 
|  | y: basePos[1], | 
|  | width: width, | 
|  | height: valPos[1] - basePos[1] | 
|  | }, | 
|  | z2: Z2[country], | 
|  | style: { | 
|  | fill: CONTENT_COLORS[country], | 
|  | opacity: 0.8 | 
|  | } | 
|  | }] | 
|  | }; | 
|  | } | 
|  | } | 
|  | }; | 
|  | }, | 
|  |  | 
|  | 'CountryAB_Year_Population_Bar': function (datasetId, onlyCountry) { | 
|  | return { | 
|  | xAxis: { | 
|  | type: 'category' | 
|  | }, | 
|  | yAxis: { | 
|  | name: 'Population', | 
|  | ...AXIS_NAME_STYLE | 
|  | }, | 
|  | series: { | 
|  | type: 'custom', | 
|  | coordinateSystem: 'cartesian2d', | 
|  | datasetId: datasetId, | 
|  | encode: { | 
|  | x: 'Year', | 
|  | y: 'Population', | 
|  | itemName: 'Year', | 
|  | tooltip: ['Population'], | 
|  | }, | 
|  | renderItem: function (params, api) { | 
|  | var valPos = api.coord([api.value('Year'), api.value('Population')]); | 
|  | var basePos = api.coord([api.value('Year'), 0]); | 
|  | var width = api.size([1, 0])[0] * 0.9; | 
|  |  | 
|  | var country = api.value('Country'); | 
|  | if (onlyCountry != null && onlyCountry !== country) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | return { | 
|  | type: 'group', | 
|  | children: [{ | 
|  | type: 'rect', | 
|  | transition: ['shape', 'style'], | 
|  | shape: { | 
|  | x: basePos[0], | 
|  | y: basePos[1], | 
|  | width: width, | 
|  | height: valPos[1] - basePos[1] | 
|  | }, | 
|  | style: { | 
|  | fill: CONTENT_COLORS[country] | 
|  | } | 
|  | }] | 
|  | }; | 
|  | } | 
|  | } | 
|  | }; | 
|  | }, | 
|  |  | 
|  | 'CountryAB_Income_Population_Scatter': function (datasetId, onlyCountry) { | 
|  | return { | 
|  | xAxis: { | 
|  | name: 'Income', | 
|  | ...AXIS_NAME_STYLE, | 
|  | scale: true | 
|  | }, | 
|  | yAxis: { | 
|  | name: 'Population', | 
|  | ...AXIS_NAME_STYLE, | 
|  | scale: true | 
|  | }, | 
|  | series: { | 
|  | type: 'custom', | 
|  | coordinateSystem: 'cartesian2d', | 
|  | datasetId: datasetId, | 
|  | encode: { | 
|  | x: 'Income', | 
|  | y: 'Population', | 
|  | itemName: ['Year'], | 
|  | tooltip: ['Income', 'Population', 'Country'] | 
|  | }, | 
|  | renderItem: function (params, api) { | 
|  | var pos = api.coord([api.value('Income'), api.value('Population')]); | 
|  |  | 
|  | var country = api.value('Country'); | 
|  | if (onlyCountry != null && onlyCountry !== country) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | return { | 
|  | type: 'group', | 
|  | children: [{ | 
|  | type: 'circle', | 
|  | transition: ['shape', 'style'], | 
|  | shape: { | 
|  | cx: pos[0], | 
|  | cy: pos[1], | 
|  | r: 10 | 
|  | }, | 
|  | style: { | 
|  | fill: CONTENT_COLORS[country], | 
|  | lineWidth: 1, | 
|  | stroke: '#333', | 
|  | opacity: 1, | 
|  | enterFrom: { | 
|  | opacity: 0 | 
|  | } | 
|  | } | 
|  | }] | 
|  | }; | 
|  | } | 
|  | } | 
|  | }; | 
|  | }, | 
|  |  | 
|  |  | 
|  | 'CountryAB_Income_Sum_Bar': function (datasetId) { | 
|  | return { | 
|  | xAxis: { | 
|  | name: 'Income', | 
|  | ...AXIS_NAME_STYLE | 
|  | }, | 
|  | yAxis: { | 
|  | type: 'category' | 
|  | }, | 
|  | series: { | 
|  | type: 'custom', | 
|  | coordinateSystem: 'cartesian2d', | 
|  | datasetId: datasetId, | 
|  | encode: { | 
|  | x: 'Income', | 
|  | y: 'Country', | 
|  | itemName: ['Country'], | 
|  | tooltip: ['Income'] | 
|  | }, | 
|  | renderItem: function (params, api) { | 
|  | var country = api.ordinalRawValue('Country'); | 
|  | var valPos = api.coord([api.value('Income'), country]); | 
|  | var basePos = api.coord([0, country]); | 
|  | var height = api.size([0, 1])[1] * 0.4; | 
|  |  | 
|  | return { | 
|  | type: 'group', | 
|  | children: [{ | 
|  | type: 'rect', | 
|  | transition: ['shape', 'style'], | 
|  | shape: { | 
|  | x: basePos[0], | 
|  | y: valPos[1] - height / 2, | 
|  | width: valPos[0] - basePos[0], | 
|  | height: height | 
|  | }, | 
|  | style: { | 
|  | fill: CONTENT_COLORS[country] | 
|  | // lineWidth: 0, | 
|  | // stroke: '#333', | 
|  | // opacity: 1, | 
|  | // enterFrom: { | 
|  | //     opacity: 0 | 
|  | // } | 
|  | } | 
|  | }] | 
|  | }; | 
|  | } | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | }; | 
|  |  | 
|  | var player = ecSimpleOptionPlayer.create({ | 
|  | chart: function () { | 
|  | return chart; | 
|  | }, | 
|  | seriesIndex: 0, | 
|  | replaceMerge: ['xAxis', 'yAxis'], | 
|  | dataMeta: { | 
|  | 'IdRawData': { | 
|  | dimensions: ID_RAW_DATA_DIMENSIONS, | 
|  | uniqueDimension: 'Id' | 
|  | }, | 
|  | 'CountryABData': { | 
|  | dimensions: ID_RAW_DATA_DIMENSIONS, | 
|  | uniqueDimension: 'Id' | 
|  | }, | 
|  | 'CountryABSumIncome': { | 
|  | dimensions: SUM_INCOME_DIMENSIONS, | 
|  | uniqueDimension: 'Country' | 
|  | } | 
|  | }, | 
|  | optionList: [{ | 
|  | dataMetaKey: 'CountryABData', | 
|  | option: optionCreators['CountryAB_Year_Income_Bar']('CountryABData', COUNTRY_A) | 
|  | }, { | 
|  | dataMetaKey: 'CountryABData', | 
|  | option: optionCreators['CountryAB_Year_Population_Bar']('CountryABData', COUNTRY_A) | 
|  | }, { | 
|  | dataMetaKey: 'CountryABData', | 
|  | option: optionCreators['CountryAB_Income_Population_Scatter']('CountryABData', COUNTRY_A) | 
|  | }, { | 
|  | dataMetaKey: 'CountryABData', | 
|  | option: optionCreators['CountryAB_Income_Population_Scatter']('CountryABData') | 
|  | }, { | 
|  | dataMetaKey: 'CountryABSumIncome', | 
|  | option: optionCreators['CountryAB_Income_Sum_Bar']('CountryABSumIncome') | 
|  | }, { | 
|  | dataMetaKey: 'CountryABData', | 
|  | option: optionCreators['CountryAB_Year_Income_Bar']('CountryABData') | 
|  | }] | 
|  | }); | 
|  |  | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main0', { | 
|  | title: [ | 
|  | 'Test: buttons, should morph animation merge/split.', | 
|  | 'Test: click buttons **before animation finished**, should no blink.', | 
|  | 'Test: click buttons **twice**, should no blink.' | 
|  | ], | 
|  | option: baseOption, | 
|  | lazyUpdate: true, | 
|  | height: 600, | 
|  | buttons: [{ | 
|  | text: 'next', | 
|  | onclick: function () { | 
|  | player.next(); | 
|  | } | 
|  | }, { | 
|  | text: 'previous', | 
|  | onclick: function () { | 
|  | player.previous(); | 
|  | } | 
|  | }] | 
|  | }); | 
|  |  | 
|  | player.next(); | 
|  |  | 
|  | }); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  | </body> | 
|  | </html> |