blob: cef12cb201d3477f899d4abebbb2856f37784ad0 [file] [log] [blame]
<!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/esl.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>
<!-- <script src="ut/lib/canteen.js"></script> -->
<link rel="stylesheet" href="lib/reset.css" />
</head>
<body>
<style>
</style>
<div id="main_simplest_pies"></div>
<div id="main_pies_encode_price"></div>
<div id="main_cartesian_parse_trim_time_reg"></div>
<div id="main_cartesian_sort"></div>
<div id="main_update_condition"></div>
<div id="main_update_source_no_dim_inside_data"></div>
<div id="main_no_dimension_defined"></div>
<div id="main_fromTransformResult"></div>
<script>
var FOOD_SALES_PRICE_HEADER =
['Product', 'Sales', 'Price', 'Year'];
var FOOD_SALES_PRICE_NO_HEADER = [
['Cake', 123, 32.12, 2011],
['Cereal', 231, 14.41, 2011],
['Tofu', 235, 5.14, 2011],
['Dumpling', 341, 25.53, 2011],
['Biscuit', 122, 29.36, 2011],
['Cake', 143, 30.21, 2012],
['Cereal', 201, 19.85, 2012],
['Tofu', 255, 7.61, 2012],
['Dumpling', 241, 27.89, 2012],
['Biscuit', 102, 34.53, 2012],
['Cake', 153, 28.82, 2013],
['Cereal', 181, 21.16, 2013],
['Tofu', 295, 4.24, 2013],
['Dumpling', 281, 31.66, 2013],
['Biscuit', 92, 39.82, 2013],
['Cake', 223, 29.22, 2014],
['Cereal', 211, 17.88, 2014],
['Tofu', 345, 3.09, 2014],
['Dumpling', 211, 35.05, 2014],
['Biscuit', 72, 24.19, 2014]
];
var FOOD_SALES_PRICE_WITH_HEADER =
[FOOD_SALES_PRICE_HEADER]
.concat(FOOD_SALES_PRICE_NO_HEADER);
var NAME_SCORE_DIM = {
Name: 0,
Age: 1,
Profession: 2,
Score: 3,
Date: 4,
DirtyNumber: 5,
Numeric: 6,
HasEmpty: 7,
Percent: 8
};
var NAME_SCORE_DIRTY_DATA_HEADER =
['Name', 'Age', 'Profession', 'Score', 'Date', 'DirtyNumber', 'Numeric', 'HasEmpty', 'Percent'];
var NAME_SCORE_DIRTY_DATA_NO_HEADER = [
// This is for trim testing.
[' Jobs Mat ', 41, 'Designer', 314, '2011-02-12', '13', ' 91000 ', 45, ' 12% ' ],
// This is for edge testing (03-01, 20)
['Hottlyuipe Xu ', 20, 'Engineer', 351, '2011-03-01', 44, ' 83000 ', 13, '44%' ],
[' Jone Mat ', 52, 'Designer', 287, '2011-02-14', null, ' 43000 ', null, '15%' ],
['Uty Xu', 19, 'Designer', 219, '2011-02-18', undefined, ' 63000 ', 81, '94%' ],
['Tatum von Godden', 25, null, 301, '2011-04-02', '-', ' 13000 ', undefined, '61%' ],
['Must Godden', 31, 'Engineer', 235, '2011-03-19', ' 454', '-', 32, '' ],
['Caoas Xu', 71, 'Designer', 318, '2011-02-24', NaN, ' 73000 ', '-', '76%' ],
['Malise Mat', 67, 'Engineer', 366, '2011-03-12', '232a', ' 23000 ', 19, '26%' ]
];
var NAME_SCORE_DIRTY_DATA_WITH_HEADER =
[NAME_SCORE_DIRTY_DATA_HEADER]
.concat(NAME_SCORE_DIRTY_DATA_NO_HEADER);
</script>
<!-- ------------------------------- -->
<!-- ------------------------------- -->
<!-- ------------------------------- -->
<!-- ------------------------------- -->
<script>
require(['echarts'], function (echarts) {
var option = {
dataset: [{
source: FOOD_SALES_PRICE_WITH_HEADER
}, {
transform: {
type: 'filter',
config: { dimension: 'Year', value: 2011 }
}
}, {
transform: {
type: 'filter',
config: { dimension: 'Year', value: 2012 }
}
}, {
transform: {
type: 'filter',
config: { dimension: 'Year', value: 2013 }
}
}],
tooltip: {},
series: [{
type: 'pie',
datasetIndex: 1,
radius: 50,
center: ['25%', '50%']
}, {
type: 'pie',
datasetIndex: 2,
radius: 50,
center: ['50%', '50%']
}, {
type: 'pie',
datasetIndex: 3,
radius: 50,
center: ['75%', '50%']
}]
};
var chart = testHelper.create(echarts, 'main_simplest_pies', {
title: [
'**3 pies** should shoud **Sales data** (interger about hundreds)',
'Pie by "Year", Sector by "Product"'
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var option = {
dataset: [{
source: FOOD_SALES_PRICE_WITH_HEADER
}, {
transform: {
type: 'filter',
config: { dimension: 'Product', value: 'Tofu' }
}
}, {
transform: {
type: 'filter',
config: { dimension: 'Product', value: 'Biscuit' }
}
}, {
transform: {
type: 'filter',
config: { dimension: 'Product', value: 'Dumpling' }
}
}],
series: [{
type: 'pie',
datasetIndex: 1,
center: ['25%', '50%'],
radius: 50,
encode: { itemName: 'Year', value: 'Price' },
}, {
type: 'pie',
datasetIndex: 2,
center: ['50%', '50%'],
radius: 50,
encode: { itemName: 'Year', value: 'Price' }
}, {
type: 'pie',
datasetIndex: 3,
center: ['75%', '50%'],
radius: 50,
encode: { itemName: 'Year', value: 'Price' }
}]
};
var chart = testHelper.create(echarts, 'main_pies_encode_price', {
title: [
'**3 pies** should shoud **Prices data** (float like xx.xx)',
'Pie by "Product", Sector by "Year"'
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var option = {
dataset: [{ source: NAME_SCORE_DIRTY_DATA_WITH_HEADER }],
tooltip: {},
grid: [],
xAxis: [],
yAxis: [],
series: []
};
var leftStart = 50;
var leftBase = leftStart;
var topBase = 30;
var gridWidth = 100;
var gridHeight = 100;
var gapWidth = 70;
var gapHeight = 80;
var chartWidth = 800;
function addCartesian(opt) {
option.grid.push({
left: leftBase,
top: topBase,
width: gridWidth,
height: gridHeight
});
leftBase += gridWidth + gapWidth;
if (leftBase + gridWidth > chartWidth) {
leftBase = leftStart;
topBase += gridHeight + gapHeight;
}
option.xAxis.push({
name: opt.xAxis.name,
type: 'category',
nameLocation: 'middle',
nameGap: 30,
gridIndex: option.grid.length - 1
});
option.yAxis.push({
gridIndex: option.grid.length - 1
});
var series = opt.series;
series.type = 'scatter';
series.xAxisIndex = option.xAxis.length - 1;
series.yAxisIndex = option.yAxis.length - 1;
series.label = { show: true, position: 'bottom' };
series.encode = {
x: NAME_SCORE_DIM.Date,
y: NAME_SCORE_DIM.Score,
label: series.encode && series.encode.label || [NAME_SCORE_DIM.Name],
tooltip: [
NAME_SCORE_DIM.Name,
NAME_SCORE_DIM.Date,
NAME_SCORE_DIM.Score,
NAME_SCORE_DIM.Profession,
NAME_SCORE_DIM.Age,
NAME_SCORE_DIM.DirtyNumber
]
};
option.series.push(series);
}
option.dataset.push({
id: 'a',
transform: {
type: 'filter',
// print: true,
config: { dimension: NAME_SCORE_DIM.Name, eq: 'Jobs Mat', parser: 'trim' }
}
});
addCartesian({
series: {
datasetId: 'a'
},
xAxis: { name: 'Only show "Jobs Mat"' }
});
option.dataset.push({
id: 'b',
transform: {
type: 'filter',
// print: true,
config: { dimension: NAME_SCORE_DIM.Date, lt: '2011-03', gte: '2011-02', parser: 'time' }
}
});
addCartesian({
series: {
datasetId: 'b'
},
xAxis: { name: 'Show four points\nDate in 2011-02' }
});
option.dataset.push({
id: 'c',
transform: {
type: 'filter',
// print: true,
config: { dimension: NAME_SCORE_DIM.Date, lte: '2011-03', gte: '2011-02-29', parser: 'time' }
}
});
addCartesian({
series: {
datasetId: 'c'
},
xAxis: { name: 'Show "Hottlyuipe Xu"' }
});
option.dataset.push({
id: 'd',
transform: {
type: 'filter',
// print: true,
config: { dimension: NAME_SCORE_DIM.Name, reg: /\sXu$/, parser: 'trim' }
}
});
addCartesian({
series: {
datasetId: 'd'
},
xAxis: { name: 'Show three points\nname reg /sXu$/' }
});
option.dataset.push({
id: 'e',
transform: {
type: 'filter',
// print: true,
config: { dimension: NAME_SCORE_DIM.Profession, ne: 'Designer', parser: 'trim' }
}
});
addCartesian({
series: {
datasetId: 'e',
encode: { label: [NAME_SCORE_DIM.Profession] }
},
xAxis: { name: 'Show four points\n!Designer' }
});
option.dataset.push({
id: 'f',
transform: {
type: 'filter',
// print: true,
config: {
and: [
{ dimension: NAME_SCORE_DIM.Profession, eq: 'Designer', parser: 'trim' },
{ dimension: NAME_SCORE_DIM.Score, '>': 300 }
]
}
}
});
addCartesian({
series: {
datasetId: 'f',
encode: { label: [NAME_SCORE_DIM.Profession] }
},
xAxis: { name: 'Show two points\nDesigner > 300' }
});
option.dataset.push({
id: 'g',
transform: {
type: 'filter',
// print: true,
config: {
and: [
{ dimension: NAME_SCORE_DIM.Profession, eq: 'Engineer' },
{
or: [
{ dimension: NAME_SCORE_DIM.Age, '>=': 20, '<=': 30 },
{ dimension: NAME_SCORE_DIM.Age, '>=': 60 }
]
}
]
}
}
});
addCartesian({
series: {
datasetId: 'g',
encode: { label: [NAME_SCORE_DIM.Profession] }
},
xAxis: { name: 'Show three points\nEngineer && (20-30 || 60)' }
});
option.dataset.push({
id: 'h',
transform: {
type: 'filter',
// print: true,
config: {
not: {
and: [
{ dimension: NAME_SCORE_DIM.Profession, eq: 'Engineer' },
{
or: [
{ dimension: NAME_SCORE_DIM.Age, '>=': 20, '<=': 30 },
{ dimension: NAME_SCORE_DIM.Age, '>=': 60 }
]
}
]
}
}
}
});
addCartesian({
series: {
datasetId: 'h',
encode: { label: [NAME_SCORE_DIM.Profession] }
},
xAxis: { name: 'Show six points\n!(Engineer && (20-30 || 60))' }
});
option.dataset.push({
id: 'i',
transform: {
type: 'filter',
// print: true,
config: true
}
});
addCartesian({
series: {
datasetId: 'i',
encode: { label: [NAME_SCORE_DIM.Profession] }
},
xAxis: { name: 'Show all eight points\nconfig: true' }
});
option.dataset.push({
id: 'j',
transform: {
type: 'filter',
// print: true,
config: {
or: [{
dimension: NAME_SCORE_DIM.DirtyNumber,
eq: 454
}, {
dimension: NAME_SCORE_DIM.DirtyNumber,
eq: 232
}]
}
}
});
addCartesian({
series: {
datasetId: 'j',
encode: { label: [NAME_SCORE_DIM.DirtyNumber] }
},
xAxis: { name: 'Show only "Must Godden"' }
});
var chart = testHelper.create(echarts, 'main_cartesian_parse_trim_time_reg', {
title: [
'Check each cartesians.',
'The expectationa are below each cartesian.'
],
width: chartWidth,
height: 600,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var option = {
dataset: [{ source: NAME_SCORE_DIRTY_DATA_WITH_HEADER }],
tooltip: {},
grid: [],
xAxis: [],
yAxis: [],
series: []
};
var leftStart = 50;
var leftBase = leftStart;
var topBase = 30;
var gridWidth = 200;
var gridHeight = 100;
var gapWidth = 70;
var gapHeight = 80;
var chartWidth = 800;
function addCartesian(opt) {
option.grid.push({
left: leftBase,
top: topBase,
width: gridWidth,
height: gridHeight
});
leftBase += gridWidth + gapWidth;
if (leftBase + gridWidth > chartWidth) {
leftBase = leftStart;
topBase += gridHeight + gapHeight;
}
option.xAxis.push({
name: opt.xAxis.name,
type: 'category',
nameLocation: 'middle',
nameGap: 30,
gridIndex: option.grid.length - 1
});
option.yAxis.push({
gridIndex: option.grid.length - 1
});
var series = opt.series;
series.type = 'bar';
series.xAxisIndex = option.xAxis.length - 1;
series.yAxisIndex = option.yAxis.length - 1;
series.label = {
show: true,
position: 'insideBottom',
rotate: 90,
align: 'left',
verticalAlign: 'middle'
};
series.encode = {
x: NAME_SCORE_DIM.Date,
y: NAME_SCORE_DIM.Score,
label: series.encode && series.encode.label || [NAME_SCORE_DIM.Name],
tooltip: [
NAME_SCORE_DIM.Name,
NAME_SCORE_DIM.Date,
NAME_SCORE_DIM.Score,
NAME_SCORE_DIM.Profession,
NAME_SCORE_DIM.Age,
NAME_SCORE_DIM.DirtyNumber,
NAME_SCORE_DIM.Numeric,
NAME_SCORE_DIM.HasEmpty,
NAME_SCORE_DIM.Percent,
]
};
option.series.push(series);
}
option.dataset.push({
id: 'a',
transform: {
type: 'sort',
// print: true,
config: { dimension: NAME_SCORE_DIM.Score, order: 'asc' }
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.Score },
datasetId: 'a'
},
xAxis: { name: 'Show all eight bars\norder by Score asc' }
});
option.dataset.push({
id: 'b',
transform: {
type: 'sort',
// print: true,
config: { dimension: NAME_SCORE_DIM.Age, order: 'desc' }
}
});
addCartesian({
series: {
datasetId: 'b',
encode: { label: NAME_SCORE_DIM.Age }
},
xAxis: { name: 'Show all eight bars\norder by Age desc' }
});
option.dataset.push({
id: 'c',
transform: {
type: 'sort',
// print: true,
config: [
{ dimension: NAME_SCORE_DIM.Profession, order: 'asc' },
{ dimension: NAME_SCORE_DIM.Score, order: 'desc' }
]
}
});
addCartesian({
series: {
datasetId: 'c',
encode: { label: [NAME_SCORE_DIM.Profession, NAME_SCORE_DIM.Score] }
},
xAxis: {
name: [
'Show eight bars (empty Profession last)',
'Profession asc (all Engineer left)',
'Score desc in each Profession'
].join('\n')
}
});
option.dataset.push({
id: 'd',
transform: {
type: 'sort',
// print: true,
config: [
{ dimension: NAME_SCORE_DIM.Date, order: 'asc', parser: 'time' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.Date },
datasetId: 'd'
},
xAxis: { name: 'Show all eight bars\nDate asc' }
});
option.dataset.push({
id: 'e',
transform: [{
type: 'filter',
config: { dimension: NAME_SCORE_DIM.Age, lte: 40, gte: 20 }
}, {
type: 'sort',
config: { dimension: NAME_SCORE_DIM.Score, order: 'asc' }
}]
});
addCartesian({
series: {
encode: { label: [NAME_SCORE_DIM.Age, NAME_SCORE_DIM.Score] },
datasetId: 'e'
},
xAxis: { name: 'Show three bars\nFilter by Age 20-40\nOrder by Score asc' }
});
option.dataset.push({
id: 'f',
transform: {
type: 'sort',
config: [
{ dimension: NAME_SCORE_DIM.DirtyNumber, order: 'desc', parser: 'number' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.DirtyNumber },
datasetId: 'f'
},
xAxis: { name: 'Show all eight bars\nOrder by DirtyNumber desc' }
});
option.dataset.push({
id: 'g',
transform: {
type: 'sort',
config: [
{ dimension: NAME_SCORE_DIM.Numeric, order: 'asc' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.Numeric },
datasetId: 'g'
},
xAxis: { name: 'Show all eight bars\nOrder by Numeric asc\nOnly one empty at right' }
});
option.dataset.push({
id: 'h',
transform: {
type: 'sort',
config: [
{ dimension: NAME_SCORE_DIM.HasEmpty, order: 'desc' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.HasEmpty },
datasetId: 'h'
},
xAxis: { name: 'Show all eight bars\nOrder by HasEmpty desc\nempty at right' }
});
option.dataset.push({
id: 'i',
transform: {
type: 'sort',
config: [
{ dimension: NAME_SCORE_DIM.HasEmpty, order: 'desc', incomparable: 'max' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.HasEmpty },
datasetId: 'i'
},
xAxis: { name: 'Show all eight bars\nOrder by HasEmpty desc\nempty at left' }
});
option.dataset.push({
id: 'j',
transform: {
type: 'sort',
config: [
{ dimension: NAME_SCORE_DIM.Percent, order: 'desc', parse: 'number' }
]
}
});
addCartesian({
series: {
encode: { label: NAME_SCORE_DIM.Percent },
datasetId: 'j'
},
xAxis: { name: 'Show all eight bars\nOrder by Percent desc\nempty at right' }
});
var chart = testHelper.create(echarts, 'main_cartesian_sort', {
title: [
'Test sort transform. Check each cartesians.',
'The expectationa are below each cartesian.',
'Ordered dimension is on **bar label **'
],
width: chartWidth,
height: 800,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var currentYear = 2011
var option = {
title: {
text: currentYear,
left: 'center'
},
dataset: [{
source: FOOD_SALES_PRICE_WITH_HEADER
}, {
id: 'one_year',
transform: {
type: 'filter',
config: { dimension: 'Year', value: currentYear }
}
}],
tooltip: {},
xAxis: { type: 'category' },
yAxis: {},
series: [{
name: 'one year',
type: 'bar',
datasetIndex: 1,
}]
};
var chart = testHelper.create(echarts, 'main_update_condition', {
title: [
'click "next year", check the bar change.'
],
height: 300,
option: option,
buttons: [{
text: 'next year',
onclick: function () {
currentYear++;
if (currentYear >= 2014) {
currentYear = 2011
}
chart.setOption({
title: {
text: currentYear
},
dataset: {
id: 'one_year',
transform: {
type: 'filter',
config: { dimension: 'Year', value: currentYear }
}
}
});
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var currData = FOOD_SALES_PRICE_NO_HEADER;
var option = {
dataset: [{
id: 'all_data',
dimensions: FOOD_SALES_PRICE_HEADER,
source: currData
}, {
transform: {
type: 'filter',
print: true,
config: { dimension: 'Price', '<': 40 }
}
}],
tooltip: {},
legend: {},
xAxis: { type: 'category' },
yAxis: { scale: true },
series: [{
name: 'all data',
type: 'scatter',
symbolSize: 15,
encode: {
itemId: 'Product',
y: 'Price',
label: [0, 1, 2, 3]
},
itemStyle: {
color: '#999'
}
}, {
name: 'Price < 40',
type: 'scatter',
encode: {
itemId: 'Product',
x: 0,
y: 'Price',
label: [0, 1, 2, 3]
},
datasetIndex: 1
}]
};
var chart = testHelper.create(echarts, 'main_update_source_no_dim_inside_data', {
title: [
'Init: all items that Price < 40',
'click "add price 10", check the bar change.'
],
height: 300,
option: option,
buttons: [{
text: 'add price 10',
onclick: function () {
currData = echarts.util.clone(currData);
echarts.util.each(currData, function (line) {
line[2] += 10;
});
chart.setOption({
dataset: {
id: 'all_data',
source: currData
}
});
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var option = {
dataset: [{
source: FOOD_SALES_PRICE_NO_HEADER
}, {
transform: {
type: 'filter',
config: { dimension: 3, value: 2011 }
}
}, {
transform: [{
type: 'filter',
config: { dimension: 3, value: 2012 }
}, {
type: 'sort',
config: { dimension: 2, order: 'asc' }
}]
}],
tooltip: {},
series: [{
type: 'pie',
datasetIndex: 1,
radius: 50,
center: ['35%', '50%']
}, {
type: 'pie',
datasetIndex: 2,
radius: 50,
center: ['65%', '50%']
}]
};
var chart = testHelper.create(echarts, 'main_no_dimension_defined', {
title: [
'**2 pies** should shoud **Sales data** (interger about hundreds)',
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts', 'data/Michelson-Morley.json'], function (echarts, rawData) {
var option = {
dataset: [{
source: rawData
}, {
transform: {
type: 'boxplot',
config: { itemNameFormatter: 'expr {value}' }
}
}, {
fromDatasetIndex: 1,
fromTransformResult: 1
}, {
fromDatasetIndex: 1,
fromTransformResult: 1,
transform: {
type: 'sort',
config: { dimension: 0, order: 'desc' }
}
}],
tooltip: {},
xAxis: {
type: 'category'
},
yAxis: {
},
series: [{
type: 'boxplot',
datasetIndex: 1
}, {
type: 'scatter',
symbolSize: 30,
datasetIndex: 2
}, {
type: 'line',
z: 100,
datasetIndex: 3
}]
};
var chart = testHelper.create(echarts, 'main_fromTransformResult', {
title: [
'**boxplot** and **outlier scatter (green)** and **line** (yellow) should be displayed.',
],
height: 400,
option: option
});
});
</script>
</body>
</html>