blob: 6c7c562033f5084a96104a33e1dbca39d1fbe3a4 [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/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>
<script src="lib/draggable.js"></script>
<!-- <script src="ut/lib/canteen.js"></script> -->
<link rel="stylesheet" href="lib/reset.css" />
</head>
<body>
<style>
</style>
<div id="main_animation_brush_1"></div>
<div id="main_animation_brush_2"></div>
<div id="main_api_pixel_value_converter_1"></div>
<div id="main_singleAxis_1"></div>
<div id="main_avoid_split_overlap_1"></div>
<script>
require([
'echarts'
], function (echarts) {
var option;
var GRID_TOP = 50;
var GRID_BOTTOM = 50;
option = {
tooltip: {
},
xAxis: [{
splitLine: {
show: false,
}
}],
yAxis: [{
triggerEvent: true,
axisTick: {
show: true
},
axisLabel: {
},
minorTick: {
show: true
},
breakArea: {
expandOnClick: false,
itemStyle: {
borderColor: '#777',
opacity: 0
}
}
}],
grid: [{
top: GRID_TOP,
bottom: GRID_BOTTOM,
}],
legend: {
data: ['s2']
},
tooltip: {
trigger: 'axis'
},
series: [{
type: 'line',
name: 's2',
symbol: 'circle',
symbolSize: 5,
data: (function createSeriesData() {
function makeRandom(range) {
return Math.random() * (range[1] - range[0]) + range[0];
}
var seriesData = [];
var DATA_COUNT = 100;
for (var idx = 0; idx < DATA_COUNT; idx++) {
let yVal = 0;
if (idx < DATA_COUNT / 4) {
yVal = makeRandom([0, 100])
}
else if (idx < 2 * DATA_COUNT / 3) {
yVal = makeRandom([10000, 12000]);
}
else {
yVal = makeRandom([30000, 31000]);
}
seriesData.push([idx, yVal]);
}
return seriesData;
})(),
}]
};
var chart = testHelper.create(echarts, 'main_animation_brush_1', {
title: [
'Fisheye: Brush an area on the cartesian to break. **(only Y)**',
],
option: option,
buttons: [{
text: 'Reset',
onclick: function (event) {
chart.setOption({
yAxis: {
breaks: []
}
});
}
}]
});
var _brushingEl = null;
var _brushShape = null;
if (chart) {
chart.on('axisbreakchanged', function (params) {
console.log('axisbreakchanged', params);
});
chart.getZr().on('mousedown', function (params) {
_brushingEl = new echarts.graphic.Rect({
shape: {
x: 0,
y: params.offsetY,
},
ignore: true,
style: {
stroke: 'none',
fill: '#ccc',
}
});
chart.getZr().add(_brushingEl);
});
chart.getZr().on('mousemove', function (params) {
if (!_brushingEl) {
return;
}
var initX = _brushingEl.shape.x;
var initY = _brushingEl.shape.y;
var currPoint = [params.offsetX, params.offsetY];
_brushingEl.setShape('width', chart.getWidth());
_brushingEl.setShape('height', currPoint[1] - initY);
_brushingEl.ignore = false;
});
document.addEventListener('mouseup', function (params) {
if (_brushingEl) {
var initX = _brushingEl.shape.x;
var initY = _brushingEl.shape.y;
var currPoint = [params.offsetX, params.offsetY];
var pixelSpan = Math.abs(currPoint[1] - initY);
if (pixelSpan > 2) {
var dataXY0 = chart.convertFromPixel({gridIndex: 0}, [initX, initY]);
var dataXY1 = chart.convertFromPixel({gridIndex: 0}, [currPoint[0], currPoint[1]]);
updateBreak(chart, pixelSpan, [dataXY0[1], dataXY1[1]]);
}
chart.getZr().remove(_brushingEl);
_brushingEl = null;
}
});
function getYAxisPixelSpan(chart) {
return chart.getHeight() - GRID_BOTTOM - GRID_TOP;
}
function updateBreak(chart, pixelSpan, dataRange) {
function round(val) {
return +(+val).toFixed(0);
}
dataRange = dataRange.slice();
dataRange[0] = round(dataRange[0]);
dataRange[1] = round(dataRange[1]);
var gapPercent = pixelSpan / getYAxisPixelSpan(chart);
function makeOption(gapPercentStr) {
return {
yAxis: {
breaks: [{
start: dataRange[0],
end: dataRange[1],
gap: gapPercentStr,
}]
}
};
}
chart.setOption(makeOption((gapPercent * 100) + '%'));
setTimeout(() => {
chart.setOption(makeOption('70%'));
}, 0);
}
}
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var option;
var GRID_TOP = 50;
var GRID_BOTTOM = 50;
var GRID_LEFT = 80;
var GRID_RIGHT = 50;
option = {
tooltip: {
},
xAxis: [{
splitLine: {
show: false,
},
breakArea: {
expandOnClick: false,
itemStyle: {
borderColor: '#777',
opacity: 0
}
}
}],
yAxis: [{
triggerEvent: true,
axisTick: {
show: true
},
axisLabel: {
},
minorTick: {
show: true
},
breakArea: {
itemStyle: {
borderColor: '#999',
opacity: 0
}
}
}],
grid: [{
top: GRID_TOP,
bottom: GRID_BOTTOM,
left: GRID_LEFT,
right: GRID_RIGHT,
}],
legend: {
data: ['s2']
},
tooltip: {
trigger: 'axis'
},
series: [{
type: 'line',
name: 's2',
symbol: 'circle',
symbolSize: 5,
data: (function createSeriesData() {
function makeRandom(range) {
return Math.random() * (range[1] - range[0]) + range[0];
}
var seriesData = [];
var DATA_COUNT = 100;
for (var idx = 0; idx < DATA_COUNT; idx++) {
let yVal = 0;
if (idx < DATA_COUNT / 4) {
yVal = makeRandom([0, 100])
}
else if (idx < 2 * DATA_COUNT / 3) {
yVal = makeRandom([10000, 12000]);
}
else {
yVal = makeRandom([30000, 31000]);
}
seriesData.push([idx, yVal]);
}
return seriesData;
})(),
}]
};
var chart = testHelper.create(echarts, 'main_animation_brush_2', {
title: [
'Fisheye: Brush an area on the cartesian to break. **(both XY)**',
],
option: option,
buttons: [{
text: 'Reset',
onclick: function (event) {
chart.setOption({
xAxis: {
breaks: []
},
yAxis: {
breaks: []
}
});
}
}]
});
var _brushingEl = null;
var _brushShape = null;
if (chart) {
chart.on('axisbreakchanged', function (params) {
console.log('axisbreakchanged', params);
});
chart.getZr().on('mousedown', function (params) {
_brushingEl = new echarts.graphic.Rect({
shape: {
x: params.offsetX,
y: params.offsetY,
},
ignore: true,
style: {
stroke: '#777',
fill: 'none',
lineWidth: 2,
lineDash: 'dashed'
}
});
chart.getZr().add(_brushingEl);
});
chart.getZr().on('mousemove', function (params) {
if (!_brushingEl) {
return;
}
var initX = _brushingEl.shape.x;
var initY = _brushingEl.shape.y;
var currPoint = [params.offsetX, params.offsetY];
_brushingEl.setShape('width', currPoint[0] - initX);
_brushingEl.setShape('height', currPoint[1] - initY);
_brushingEl.ignore = false;
});
document.addEventListener('mouseup', function (params) {
if (_brushingEl) {
var initX = _brushingEl.shape.x;
var initY = _brushingEl.shape.y;
var currPoint = [params.offsetX, params.offsetY];
var xPixelSpan = Math.abs(currPoint[0] - initX);
var yPixelSpan = Math.abs(currPoint[1] - initY);
if (xPixelSpan > 2 && yPixelSpan > 2) {
var dataXY0 = chart.convertFromPixel({gridIndex: 0}, [initX, initY]);
var dataXY1 = chart.convertFromPixel({gridIndex: 0}, [currPoint[0], currPoint[1]]);
updateBreak(
chart,
xPixelSpan,
[dataXY0[0], dataXY1[0]],
yPixelSpan,
[dataXY0[1], dataXY1[1]],
);
}
chart.getZr().remove(_brushingEl);
_brushingEl = null;
}
});
function getXYAxisPixelSpan(chart) {
return [
chart.getWidth() - GRID_LEFT - GRID_RIGHT,
chart.getHeight() - GRID_BOTTOM - GRID_TOP
];
}
function updateBreak(chart, xPixelSpan, xDataRange, yPixelSpan, yDataRange) {
function format(range) {
function round(val) {
return +(+val).toFixed(0);
}
range = range.slice();
range[0] = round(range[0]);
range[1] = round(range[1]);
return range;
}
xDataRange = format(xDataRange);
yDataRange = format(yDataRange);
var xySpan = getXYAxisPixelSpan(chart);
var xGapPercent = xPixelSpan / xySpan[0];
var yGapPercent = yPixelSpan / xySpan[1];
function makeOption(xGapPercentStr, yGapPercentStr) {
return {
xAxis: {
breaks: [{
start: xDataRange[0],
end: xDataRange[1],
gap: xGapPercentStr,
}]
},
yAxis: {
breaks: [{
start: yDataRange[0],
end: yDataRange[1],
gap: yGapPercentStr,
}]
}
};
}
chart.setOption(makeOption((xGapPercent * 100) + '%', (yGapPercent * 100) + '%'));
setTimeout(() => {
chart.setOption(makeOption('80%', '70%'));
}, 0);
}
}
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var timeBase = 1741187840933;
var timeOffsetLimit = 5000
function time(offset) {
if (Math.abs(offset) > timeOffsetLimit) {
throw new Error('offset over timeOffsetLimit:' + timeOffsetLimit);
}
return timeBase + offset;
}
function formatTime(value) {
value = +value.toFixed(0);
return echarts.time.format(value, '{yyyy}-{MM}-{dd}_{hh}:{mm}:{ss}.{SSS}');
}
var option = {
tooltip: {
},
xAxis: {
type: 'time',
axisLabel: {
rotate: 20,
formatter: function (value) {
return formatTime(value);
}
},
splitLine: {
show: true
},
axisPointer: {
label: {
show: true,
margin: -250,
formatter: function (params) {
return formatTime(params.value);
}
}
},
breaks: [{
start: time(600),
end: time(1000),
gap: '10%',
}, {
start: time(1534),
end: time(1987),
gap: 500,
}],
breakArea: {
itemStyle: {color: 'green'},
expandOnClick: false,
zigzagAmplitude: 0,
}
},
yAxis: {
breaks: [{
start: 7000,
end: 12000,
gap: '20%'
}, {
start: 15000,
end: 18000,
gap: 2000
}],
breakArea: {
itemStyle: {color: 'orange'},
expandOnClick: false,
zigzagAmplitude: 0,
}
},
// legend: {
// data: ['s2'],
// bottom: 10,
// },
grid: {
right: 80,
bottom: 120,
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
},
},
axisPointer: {
show: true,
},
dataZoom: [{
type: 'slider',
xAxisIndex: 0,
}, {
type: 'slider',
yAxisIndex: 0,
right: 25,
}],
series: [{
type: 'scatter',
name: 's2',
data: [
[time(100), -800],
[time(1000), -1800], [time(1800), 5000], [time(3000), 20000],
[time(2200), 9000], [time(500), 17000], [time(800), 14000],
[time(1300), 18000]
],
label: {
show: true,
position: 'top'
}
}]
};
var chart = testHelper.create(echarts, 'main_api_pixel_value_converter_1', {
title: [
'- Test api.convertFromPixel (colored areas are breaks)',
'- tooltip (trigger "axis") should be correct on point inside breaks',
'- Click on the scatter, the displayed x/y value should be correct.',
'- Move dataZoom and click, should still correct.',
'- axisPointer label should be correct in breaks.',
],
option: option,
});
if (chart) {
chart.getZr().on('click', function (params) {
const xyPx = [params.offsetX, params.offsetY];
const xyVal = chart.convertFromPixel({gridIndex: 0}, xyPx);
chart.setOption({
title: {
text: `api.convertFromPixel get: xVal=${formatTime(xyVal[0])}, yVal=${xyVal[1].toFixed(3)}`,
textStyle: {
fontSize: 16,
fontWeight: 'normal',
}
}
});
});
}
});
</script>
<script>
require([
'echarts'
], function (echarts) {
function makeBreaks(isExpanded) {
return [{
start: 600,
end: 1000,
gap: '10%',
isExpanded: isExpanded,
}, {
start: 1000534,
end: 5000987,
gap: 50000,
isExpanded: isExpanded,
}];
}
var option = {
tooltip: {
},
singleAxis: {
axisLabel: {
},
splitArea: {
show: true,
},
splitLine: {
show: true,
lineStyle: {
color: '#000',
// opacity: 1,
width: 1
}
},
bottom: 100,
breaks: makeBreaks(false),
breakArea: {
itemStyle: {color: 'green'},
}
},
legend: {
data: ['s2'],
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
},
},
dataZoom: [{
type: 'slider',
singleAxisIndex: 0,
}],
series: [{
type: 'scatter',
coordinateSystem: 'singleAxis',
name: 's2',
data: [
100800,
10001800,
-3000,
2200,
500,
800,
1300
],
label: {
show: true,
position: 'top'
}
}]
};
var chart = testHelper.create(echarts, 'main_singleAxis_1', {
title: [
'single axis breaks',
],
option: option,
height: 200,
buttons: [{
text: 'reset breaks',
onclick: function () {
chart.dispatchAction({
type: 'collapseAxisBreak',
singleAxisIndex: 0,
breaks: makeBreaks(false)
});
}
}]
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var option;
option = {
xAxis: {
data: ['a', 'b', 'c', 'd', 'e'],
axisTick: {
show: false
},
splitLine: {
show: true,
},
},
yAxis: {
triggerEvent: true,
axisTick: {
show: true
},
minorTick: {
show: true
},
axisLabel: {
},
splitLine: {
show: true
},
breaks: [{
start: 123,
end: 2058,
gap: '20%'
}, {
start: 2305,
end: 7400,
gap: '10%'
}],
breakArea: {
}
},
legend: {
data: ['s2', 's3', 's4']
},
tooltip: {
},
dataZoom: [{
id: 'dz0',
type: 'slider',
yAxisIndex: 0,
right: 20,
startValue: 0,
endValue: 2073,
}],
series: [{
type: 'bar',
name: 's2',
data: [12, 88, 650, 1200, 2235],
label: {
show: true,
position: 'top'
}
}, {
type: 'scatter',
name: 's4',
data: [12, 88, 1150, 200, 7835],
symbolSize: 30
}]
};
var chart = testHelper.create(echarts, 'main_avoid_split_overlap_1', {
title: [
'Split line and axis tick should not overlap.',
'axis minor tick should be appropriate.',
'**animation**: zigzag shape and split line animation should be smooth.',
'The **top split line** should be always displayed.',
],
option: option,
height: 400,
buttons: [{
type: 'select',
text: 'dataZoom cases:',
values: [[0, 2073], [0, 2060], [0, 2098], [0, 3000]],
onchange: function () {
chart.setOption({
dataZoom: {
id: 'dz0',
startValue: this.value[0],
endValue: this.value[1],
}
});
}
}, {
type: 'select',
text: 'xAxis.split:',
options: [{
text: 'splitLine',
value: {
splitLine: {
show: true,
},
splitArea: {
show: false,
},
}
}, {
text: 'splitArea',
value: {
splitLine: {
show: false,
},
splitArea: {
show: true,
areaStyle: {
color: ['rgba(0,0,0,0)', 'rgba(210,219,238,0.5)']
}
},
}
}],
onchange: function () {
chart.setOption({
xAxis: {
splitLine: this.value.splitLine,
splitArea: this.value.splitArea,
}
});
}
}, {
type: 'select',
text: 'bar start value:',
values: [0, 1000],
onchange: function () {
chart.setOption({
yAxis: {
startValue: this.value
}
});
}
}]
});
});
</script>
</body>
</html>