| <!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> |