|  | <!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="lib/facePrint.js"></script> | 
|  | <script src="lib/testHelper.js"></script> | 
|  | <link rel="stylesheet" href="lib/reset.css"> | 
|  | </head> | 
|  | <body> | 
|  | <style> | 
|  | </style> | 
|  |  | 
|  |  | 
|  | <div id="main1"></div> | 
|  | <div id="main2_source_format_original"></div> | 
|  | <div id="main2_dataset"></div> | 
|  | <div id="main3"></div> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  |  | 
|  | require([ | 
|  | 'echarts' | 
|  | ], function (echarts) { | 
|  |  | 
|  | var option = { | 
|  | "tooltip": { | 
|  | "trigger": "axis" | 
|  | }, | 
|  | "xAxis": { | 
|  | "data": [ | 
|  | "", | 
|  | "Good", | 
|  | "Slightly polluted", | 
|  | "Excellent", | 
|  | "Medially polluted", | 
|  | "Severely polluted" | 
|  | ] | 
|  | }, | 
|  | "yAxis": { | 
|  | }, | 
|  | grid: { | 
|  | right: 200 | 
|  | }, | 
|  | "series": [ | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Clear", | 
|  | "data": [ | 
|  | [ | 
|  | "", | 
|  | 48 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 41.38805970149254 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 58.78378378378378 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 21.5 | 
|  | ], | 
|  | [ | 
|  | "Medially polluted", | 
|  | 64.66666666666667 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Cloudy", | 
|  | "data": [ | 
|  | [ | 
|  | "Good", | 
|  | 41.49246231155779 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 62.5 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 22.38888888888889 | 
|  | ], | 
|  | [ | 
|  | "Medially polluted", | 
|  | 63.25 | 
|  | ], | 
|  | [ | 
|  | "Severely polluted", | 
|  | 85.66666666666667 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Overcast", | 
|  | "data": [ | 
|  | [ | 
|  | "Good", | 
|  | 39.73170731707317 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 22.93548387096774 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 64.75 | 
|  | ], | 
|  | [ | 
|  | "Medially polluted", | 
|  | 121.5 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Light rain", | 
|  | "data": [ | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 60.09090909090909 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 39.15277777777778 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 19.822222222222223 | 
|  | ], | 
|  | [ | 
|  | "Severely polluted", | 
|  | 82 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Moderate to heavy rain", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 20.2 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 33.875 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Fog", | 
|  | "data": [ | 
|  | [ | 
|  | "Medially polluted", | 
|  | 123.5 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 105.5 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 71 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Moderate rain", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 19.125 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 30.071428571428573 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Shower", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 21.571428571428573 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 37.523809523809526 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 69.33333333333333 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Thundershower", | 
|  | "data": [ | 
|  | [ | 
|  | "Good", | 
|  | 31.17241379310345 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 20.6 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 43.75 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Heavy rain", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 23.142857142857142 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 30.285714285714285 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Rainstorm", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 19.142857142857142 | 
|  | ], | 
|  | [ | 
|  | "Good", | 
|  | 31.083333333333332 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Slight to moderate rain", | 
|  | "data": [ | 
|  | [ | 
|  | "Good", | 
|  | 33.23529411764706 | 
|  | ], | 
|  | [ | 
|  | "Excellent", | 
|  | 18.857142857142858 | 
|  | ], | 
|  | [ | 
|  | "Slightly polluted", | 
|  | 53 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | }, | 
|  | { | 
|  | "type": "bar", | 
|  | "stack": "WEATHER1", | 
|  | "name": "Heavy rain to rainstorm", | 
|  | "data": [ | 
|  | [ | 
|  | "Excellent", | 
|  | 18 | 
|  | ] | 
|  | ], | 
|  | "encode": { | 
|  | "x": [ | 
|  | 0 | 
|  | ], | 
|  | "y": [ | 
|  | 1 | 
|  | ] | 
|  | } | 
|  | } | 
|  | ], | 
|  | "legend": { | 
|  | orient: 'vertical', | 
|  | right: 10 | 
|  | } | 
|  | } | 
|  |  | 
|  | testHelper.create(echarts, 'main1', { | 
|  | title: 'Check bars should not be overflow the Y extent. (#9346)', | 
|  | option: option, | 
|  | height: 500 | 
|  | }); | 
|  | }); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  |  | 
|  | require([ | 
|  | 'echarts' | 
|  | ], function (echarts) { | 
|  |  | 
|  | var option = { | 
|  | xAxis: { | 
|  | type: 'category', | 
|  | data: ['a', 'b', 'c'] | 
|  | }, | 
|  | yAxis: { | 
|  | }, | 
|  | legend: { | 
|  | }, | 
|  | series: [{ | 
|  | name: 'a', | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | data: [10, 20, 30], | 
|  | label: {show: true} | 
|  | }, { | 
|  | name: 'b', | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | label: {show: true}, | 
|  | data: [7, 17, 27] | 
|  | }, { | 
|  | name: 'c', | 
|  | type: 'bar', | 
|  | label: {show: true}, | 
|  | data: [9, 19, 29] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main2_source_format_original', { | 
|  | title: 'data in series', | 
|  | option: option, | 
|  | height: 300, | 
|  | buttons: [{ | 
|  | text: 'stack: b+c', | 
|  | onclick: function () { | 
|  | var option2 = { | 
|  | series: [ | 
|  | {name: 'a', stack: undefined}, | 
|  | {name: 'b', stack: 'all'}, | 
|  | {name: 'c', stack: 'all'} | 
|  | ] | 
|  | }; | 
|  | chart.setOption(option2); | 
|  | commonAsserts(false, true, true); | 
|  | } | 
|  | }, { | 
|  | text: 'stack: a+b', | 
|  | onclick: function () { | 
|  | var option2 = { | 
|  | series: [ | 
|  | {name: 'a', stack: 'all'}, | 
|  | {name: 'b', stack: 'all'}, | 
|  | {name: 'c', stack: undefined} | 
|  | ] | 
|  | }; | 
|  | chart.setOption(option2); | 
|  | commonAsserts(true, true, false); | 
|  | } | 
|  | }] | 
|  | }); | 
|  |  | 
|  | commonAsserts(true, true, false); | 
|  |  | 
|  | // After click, chunks count should be the same. | 
|  | function commonAsserts(aIsStack, bIsStack, cIsStack) { | 
|  | testHelper.printAssert(chart, function (assert) { | 
|  | var ecModel = chart.getModel(); | 
|  | var storageA = ecModel.getSeriesByIndex(0).getData().getStore(); | 
|  | var storageB = ecModel.getSeriesByIndex(1).getData().getStore(); | 
|  | var storageC = ecModel.getSeriesByIndex(2).getData().getStore(); | 
|  | assert( | 
|  | storageA !== storageB | 
|  | && storageB !== storageC | 
|  | && storageC !== storageA | 
|  | ); | 
|  | // 2 more dimension for data stack calculation for each series. | 
|  | function getExpectedChunkCount(isStack) { | 
|  | var dimIndexMax = 1; | 
|  | if (isStack) { | 
|  | return dimIndexMax + 1 + 2; | 
|  | } | 
|  | else { | 
|  | return dimIndexMax + 1; | 
|  | } | 
|  | } | 
|  | assert(storageA._chunks.length === getExpectedChunkCount(aIsStack)); | 
|  | assert(storageB._chunks.length === getExpectedChunkCount(bIsStack)); | 
|  | assert(storageC._chunks.length === getExpectedChunkCount(cIsStack)); | 
|  | }); | 
|  | } | 
|  |  | 
|  | }); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  |  | 
|  | require([ | 
|  | 'echarts' | 
|  | ], function (echarts) { | 
|  |  | 
|  | var option = { | 
|  | dataset: { | 
|  | source: [ | 
|  | ['a', 'b', 'c'], | 
|  | [10, 20, 30], | 
|  | [7, 17, 27], | 
|  | [9, 19, 29] | 
|  | ] | 
|  | }, | 
|  | xAxis: { | 
|  | type: 'category' | 
|  | }, | 
|  | yAxis: { | 
|  | }, | 
|  | legend: { | 
|  | }, | 
|  | series: [{ | 
|  | name: 'a', | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | seriesLayoutBy: 'row', | 
|  | encode: {x: 0, y: 1}, | 
|  | label: {show: true} | 
|  | }, { | 
|  | name: 'b', | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | seriesLayoutBy: 'row', | 
|  | encode: {x: 0, y: 2}, | 
|  | label: {show: true}, | 
|  | }, { | 
|  | name: 'c', | 
|  | type: 'bar', | 
|  | seriesLayoutBy: 'row', | 
|  | encode: {x: 0, y: 3}, | 
|  | label: {show: true} | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main2_dataset', { | 
|  | title: 'data in dataset', | 
|  | option: option, | 
|  | height: 300, | 
|  | buttons: [{ | 
|  | text: 'stack: b+c', | 
|  | onclick: function () { | 
|  | var option2 = { | 
|  | series: [ | 
|  | {name: 'a', stack: undefined}, | 
|  | {name: 'b', stack: 'all'}, | 
|  | {name: 'c', stack: 'all'} | 
|  | ] | 
|  | }; | 
|  | chart.setOption(option2); | 
|  | commonAsserts([false, true, true]); | 
|  | } | 
|  | }, { | 
|  | text: 'stack: a+b', | 
|  | onclick: function () { | 
|  | var option2 = { | 
|  | series: [ | 
|  | {name: 'a', stack: 'all'}, | 
|  | {name: 'b', stack: 'all'}, | 
|  | {name: 'c', stack: undefined} | 
|  | ] | 
|  | }; | 
|  | chart.setOption(option2); | 
|  | commonAsserts([true, true, false]); | 
|  | } | 
|  | }] | 
|  | }); | 
|  |  | 
|  | var sharedStoreStacks = []; | 
|  | commonAsserts([true, true, false]); | 
|  |  | 
|  | // After click, chunks count should be the same. | 
|  | function commonAsserts(isStackArr) { | 
|  | for (var i = 0; i < isStackArr.length; i++) { | 
|  | sharedStoreStacks[i] |= isStackArr[i]; | 
|  | } | 
|  | testHelper.printAssert(chart, function (assert) { | 
|  | var ecModel = chart.getModel(); | 
|  | var storageA = ecModel.getSeriesByIndex(0).getData().getStore(); | 
|  | var storageB = ecModel.getSeriesByIndex(1).getData().getStore(); | 
|  | var storageC = ecModel.getSeriesByIndex(2).getData().getStore(); | 
|  | assert( | 
|  | storageA === storageB | 
|  | && storageB === storageC | 
|  | ); | 
|  | var stackSeriesCount = 0; | 
|  | for (var i = 0; i < sharedStoreStacks.length; i++) { | 
|  | if (sharedStoreStacks[i]) { | 
|  | stackSeriesCount++; | 
|  | } | 
|  | } | 
|  | var dimIndexMax = 3; | 
|  | console.log(storageA._chunks.length); | 
|  | // 2 more dimension for data stack calculation for each series. | 
|  | assert(storageA._chunks.length === dimIndexMax + 1 + 2 * stackSeriesCount); | 
|  | }); | 
|  | } | 
|  |  | 
|  | }); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  |  | 
|  | require([ | 
|  | 'echarts' | 
|  | ], function (echarts) { | 
|  |  | 
|  | var option = { | 
|  | xAxis: { | 
|  | type: 'category', | 
|  | data: ['a', 'b', 'c'] | 
|  | }, | 
|  | yAxis: { | 
|  | inverse: true | 
|  | }, | 
|  | legend: { | 
|  | }, | 
|  | series: [{ | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | data: [ | 
|  | 10, 20, 30 | 
|  | ], | 
|  | label: { | 
|  | show: true, | 
|  | fontSize: 30 | 
|  | }, | 
|  | name: 'positive' | 
|  | }, { | 
|  | type: 'bar', | 
|  | stack: 'all', | 
|  | label: { | 
|  | show: true, | 
|  | fontSize: 30 | 
|  | }, | 
|  | data: [ | 
|  | -10, 0, -15 | 
|  | ], | 
|  | name: 'negative' | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main3', { | 
|  | title: 'Check 0 label should be at the correct place', | 
|  | option: option, | 
|  | height: 300 | 
|  | }); | 
|  |  | 
|  | }); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | </body> | 
|  | </html> |