blob: 9866cd1f7761a435f65049a69d0d900c79c06e44 [file]
<!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_gap_percent_break_1"></div>
<div id="main_gap_percent_break_2"></div>
<div id="main_xNumber_yNumber_axis"></div>
<div id="main_xTime_yNumber_axis"></div>
<div id="main_xCategory_yNumber_axis"></div>
<div id="main_xNumber_yCategory_axis"></div>
<div id="main_break_line_style"></div>
<script>
require([
'echarts'
], function (echarts) {
var option;
var XAXIS_NAME_GAP = -190;
var caseList = [{
xAxisName: 'Brk area should be 50% of yAxis',
breaks: [{start: 0, end: 300, gap: '50%'}],
}, {
xAxisName: 'Brk area should be 50% of yAxis',
breaks: [{start: 10000, end: 10300, gap: '50%'}],
}, {
xAxisName: 'Brk area should be 80% of yAxis',
breaks: [{start: 0, end: 300, gap: '80%'}],
}, {
xAxisName: 'Brk gap should be 0, as a polyline',
breaks: [{start: 10000, end: 10300, gap: '0%'}],
}, {
xAxisName: 'Brk areas should be 30%, 20%',
breaks: [
{start: 18000, end: 19000, gap: '30%'},
{start: 19000, end: 20000, gap: '20%'},
],
}, {
xAxisName: 'Brk areas should be 40%, 10000, 10%',
breaks: [
{start: 17000, end: 18000, gap: '40%'},
{start: 18000, end: 19000, gap: 10000},
{start: 19000, end: 20000, gap: '10%'},
],
}];
option = {
tooltip: {
},
xAxis: (function createXAxis() {
var xAxisOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
xAxisOptionList.push({
gridIndex: idx,
data: ['a', 'b'],
nameGap: XAXIS_NAME_GAP,
nameLocation: 'center',
name: caseList[idx].xAxisName,
});
}
return xAxisOptionList;
})(),
yAxis: (function createYAxis() {
var yAxisOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
yAxisOptionList.push({
gridIndex: idx,
axisTick: {show: true},
breaks: caseList[idx].breaks,
});
}
return yAxisOptionList;
})(),
grid: (function createGridOption() {
var gridOptionList = []
var gridColMax = 3;
var gridWidth = '20%';
var gridHGap = '8%';
var gridTopBase = 90;
var gridLineHeight = 240;
var gridLeftBase = '8%';
var gridHeight = 150;
var gridMaxInOneLine = 3;
var currGridLineNumber = 0;
var currGridLeft = gridLeftBase;
for (var idx = 0; idx < caseList.length; idx++) {
gridOptionList.push({
left: currGridLeft,
top: gridTopBase + gridLineHeight * currGridLineNumber,
width: gridWidth,
height: gridHeight,
show: true,
backgroundColor: 'rgba(0,0,0,0.1)'
});
currGridLeft = (parseFloat(currGridLeft) + parseFloat(gridHGap) + parseFloat(gridWidth)) + '%';
if ((idx + 1) % gridMaxInOneLine === 0) {
currGridLineNumber++;
currGridLeft = gridLeftBase;
}
}
return gridOptionList;
})(),
legend: {
data: ['s2']
},
tooltip: {
trigger: 'axis'
},
series: (function makeSeries() {
function create() {
return {
type: 'bar',
name: 's2',
data: [300, 20000],
label: { show: true, position: 'top' }
};
}
var seriesOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
var seriesOption = create();
seriesOption.xAxisIndex = idx;
seriesOption.yAxisIndex = idx;
seriesOptionList.push(seriesOption);
}
return seriesOptionList;
})()
};
var chart = testHelper.create(echarts, 'main_gap_percent_break_1', {
title: [
'break gap is percent',
],
option: option,
height: 550
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var option;
var XAXIS_NAME_GAP = -190;
var caseList = [{
xAxisName: [
'Brk area should be 50% of yAxis',
'dataZoom hide break smoothly'
].join('\n'),
breaks: [{start: 10000, end: 10300, gap: '50%'}],
dataZoomStartValue: 5400,
dataZoomEndValue: 12800,
}, {
xAxisName: [
'Brk area should be 10%, 40% of yAxis',
'dataZoom gap width should be consistent',
].join('\n'),
breaks: [
{start: 4234, end: 7000, gap: '10%'},
{start: 11234, end: 13000, gap: '40%'},
],
dataZoomStart: 0,
dataZoomEnd: 50,
}, {
xAxisName: [
'Brk area should be 10%, 5000, 10% of yAxis',
'dataZoom percent gap width should be consistent',
].join('\n'),
breaks: [
{start: 4234, end: 7000, gap: '10%'},
{start: 8234, end: 10000, gap: 10000},
{start: 11234, end: 13000, gap: '10%'},
],
dataZoomStart: 0,
dataZoomEnd: 50,
}];
var gridColMax = 3;
var gridWidth = '30%';
var gridHGap = '18%';
var gridTopBase = 90;
var gridLineHeight = 240;
var gridLeftBase = '8%';
var gridHeight = 150;
var gridMaxInOneLine = 2;
option = {
tooltip: {
},
xAxis: (function createXAxis() {
var xAxisOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
xAxisOptionList.push({
gridIndex: idx,
data: ['a', 'b', 'c'],
nameGap: XAXIS_NAME_GAP,
nameLocation: 'center',
name: caseList[idx].xAxisName,
});
}
return xAxisOptionList;
})(),
yAxis: (function createYAxis() {
var yAxisOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
yAxisOptionList.push({
gridIndex: idx,
axisTick: {show: true},
breaks: caseList[idx].breaks,
breakArea: {
zigzagAmplitude: 2,
itemStyle: {color: 'red', opacity: 0.1}
}
});
}
return yAxisOptionList;
})(),
grid: (function createGridOption() {
var gridOptionList = []
var currGridLineNumber = 0;
var currGridLeft = gridLeftBase;
for (var idx = 0; idx < caseList.length; idx++) {
gridOptionList.push({
left: currGridLeft,
top: gridTopBase + gridLineHeight * currGridLineNumber,
width: gridWidth,
height: gridHeight,
show: true,
backgroundColor: 'rgba(0,0,0,0.1)'
});
currGridLeft = (
parseFloat(currGridLeft) + parseFloat(gridHGap) + parseFloat(gridWidth)
) + '%';
if ((idx + 1) % gridMaxInOneLine === 0) {
currGridLineNumber++;
currGridLeft = gridLeftBase;
}
}
return gridOptionList;
})(),
dataZoom: (function createDataZoom() {
var dataZoomOptionList = [];
var currGridLineNumber = 0;
var currGridLeft = gridLeftBase;
for (var idx = 0; idx < caseList.length; idx++) {
dataZoomOptionList.push({
type: 'slider',
yAxisIndex: idx,
startValue: caseList[idx].dataZoomStartValue,
endValue: caseList[idx].dataZoomEndValue,
left: (parseFloat(currGridLeft) + parseFloat(gridWidth)) + '%'
});
currGridLeft = (
parseFloat(currGridLeft) + parseFloat(gridHGap) + parseFloat(gridWidth)
) + '%';
if ((idx + 1) % gridMaxInOneLine === 0) {
currGridLineNumber++;
currGridLeft = gridLeftBase;
}
}
return dataZoomOptionList;
})(),
legend: {
data: ['s1', 's2']
},
tooltip: {
trigger: 'axis'
},
series: (function makeSeries() {
var seriesOptionList = [];
for (var idx = 0; idx < caseList.length; idx++) {
var seriesOpts = [{
type: 'bar',
name: 's1',
data: [300, 12000, 40000],
label: { show: true, position: 'top' }
}, {
type: 'scatter',
name: 's2',
data: [7000, 15000, 9000],
label: { show: true, position: 'top' }
}];
for (var jdx = 0; jdx < seriesOpts.length; jdx++) {
seriesOpts[jdx].xAxisIndex = idx;
seriesOpts[jdx].yAxisIndex = idx;
seriesOptionList.push(seriesOpts[jdx]);
}
}
return seriesOptionList;
})()
};
var chart = testHelper.create(echarts, 'main_gap_percent_break_2', {
title: [
'break gap is percent',
'Use legend to hide s1, break height should be consistent'
],
option: option,
height: 900
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var _gridShow = [true, true, true];
// var _gridShow = [true, false, false];
function xMakeBreaks() {
return [{
end: 34209000 + BASE_DATE,
start: 35801000 + BASE_DATE,
gap: 0
}, {
end: 3123456 + BASE_DATE,
start: 3023456 + BASE_DATE,
// gap: 50000000
gap: '5%'
}];
}
function yMakeBreaks() {
return [{
end: 1800,
start: 1500,
gap: 0
}, {
end: 900,
start: 600,
gap: '5%'
}];
}
var BASE_DATE = 1740824305347;
var X_LABEL_ROTATE = 50;
var Y_LABEL_ROTATE = 0;
var XAXIS_NAME_GAP = -190;
var FORMATTER_ONE_LINE = (value, idx, params) => {
var dateStr = echarts.time.format(value, '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}');
if (params && params.break) {
return `${dateStr} (${params.break.type})`;
}
return `${dateStr}`;
};
var option = {
tooltip: {
},
yAxis: (function () {
var list = [];
var idx = 0;
var gridIndex = 0;
_gridShow[idx++] && list.push({
gridIndex: gridIndex++,
axisLine: {
show: true,
},
axisLabel: {
rotate: Y_LABEL_ROTATE,
},
breaks: yMakeBreaks(),
breakArea: {
itemStyle: {
borderType: 'solid',
}
},
});
_gridShow[idx++] && list.push({
gridIndex: gridIndex++,
axisLine: {
show: true,
lineStyle: {
color: 'blue'
}
},
axisTick: {
show: true,
},
axisLabel: {
rotate: Y_LABEL_ROTATE,
},
breaks: yMakeBreaks(),
});
_gridShow[idx++] && list.push({
gridIndex: gridIndex++,
axisLine: {
show: true,
breakLine: false,
},
axisLabel: {
rotate: Y_LABEL_ROTATE,
},
breaks: yMakeBreaks(),
});
return list;
})(),
xAxis: (function () {
var list = [];
var idx = 0;
var gridIndex = 0;
_gridShow[idx++] && list.push({
id: 'x0',
type: 'time',
gridIndex: gridIndex++,
name: [
'axisTick.show: false',
'axis line should break'
].join('\n'),
nameLocation: 'center',
nameGap: XAXIS_NAME_GAP,
breaks: xMakeBreaks(),
splitLine: {
show: true,
},
axisTick: {
show: false,
},
breakArea: {
zigzagAmplitude: 2,
},
axisLabel: {
// hideOverlap: true,
showMaxLabel: true,
showMinLabel: true,
rotate: X_LABEL_ROTATE
}
});
_gridShow[idx++] && list.push({
id: 'x1',
type: 'time',
gridIndex: gridIndex++,
name: [
'axisTick: show true',
'axis line should break, colored. Break tick should display'
].join('\n'),
nameLocation: 'center',
nameGap: XAXIS_NAME_GAP,
splitLine: {
show: true,
},
axisTick: {
show: true,
},
axisLine: {
lineStyle: {
color: 'red'
}
},
breaks: xMakeBreaks(),
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
borderType: 'solid',
}
},
axisLabel: {
// hideOverlap: true,
showMaxLabel: true,
showMinLabel: true,
rotate: X_LABEL_ROTATE,
formatter: FORMATTER_ONE_LINE
}
});
_gridShow[idx++] && list.push({
id: 'x2',
type: 'time',
gridIndex: gridIndex++,
name: 'axisLine.breakLine: false',
nameLocation: 'center',
nameGap: XAXIS_NAME_GAP,
splitLine: {
show: true,
},
axisTick: {
show: true,
},
axisLabel: {
// hideOverlap: true,
showMaxLabel: true,
showMinLabel: true,
rotate: X_LABEL_ROTATE,
},
breaks: xMakeBreaks(),
breakLine: {
show: false,
}
});
return list;
})(),
dataZoom: (function () {
var indexList = [];
var idx = 0;
_gridShow.forEach(function (show) { indexList.push(idx++); });
return [{
type: 'slider',
xAxisIndex: indexList.slice(),
}, {
type: 'slider',
right: 20,
yAxisIndex: indexList.slice(),
}];
})(),
legend: {
data: ['s2', 's3', 's4'],
selected: {
// 's2': false,
's4': false,
},
},
grid: (function () {
var list = [];
var idx = 0;
_gridShow[idx++] && list.push({
top: 50,
left: 50,
width: '35%',
height: '25%',
borderWidth: 0,
});
_gridShow[idx++] && list.push({
top: 50,
right: 70,
width: '35%',
height: '25%',
borderWidth: 0,
});
_gridShow[idx++] && list.push({
left: 50,
width: '35%',
height: '25%',
bottom: 120,
borderWidth: 0,
});
return list;
})(),
tooltip: {
trigger: 'axis'
},
series: (function makeSeries() {
const createSeries = () => [{
type: 'scatter',
name: 's2',
data: [
[-80002000 + BASE_DATE, 1300],
[100003000 + BASE_DATE, 2000]
],
label: {
show: true
}
}, {
type: 'scatter',
name: 's3',
data: [
[2004000 + BASE_DATE, 1300],
[5005000 + BASE_DATE, 2000]
],
label: {
show: true
}
}, {
type: 'scatter',
name: 's4',
data: [
[-189106000 + BASE_DATE, 1300],
[312307000 + BASE_DATE, 2000]
],
label: {
show: true
}
}];
const list = [];
var gridIndex = 0;
_gridShow.forEach((show) => {
show && (createSeries().forEach(seriesOption => {
seriesOption.xAxisIndex = gridIndex;
seriesOption.yAxisIndex = gridIndex;
list.push(seriesOption);
}), gridIndex++);
})
return list;
})()
};
var chart = testHelper.create(echarts, 'main_break_line_style', {
title: [
'axis break line style.',
'axis break tick animation should be smooth.',
],
option: option,
height: 600,
buttons: [{
text: 'hideOverlap:',
type: 'select',
values: [true, false],
onchange: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {hideOverlap: value} });
});
chart.setOption({
xAxis: list
});
}
}]
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var GRID_SIZE = {
left: 80,
right: 80,
top: 50,
bottom: 110,
};
var option;
function makeXBreaks(isExpanded) {
return [{
start: 200,
end: 230000,
gap: 1000,
isExpanded: isExpanded,
}];
}
function makeYBreaks(isExpanded) {
return [{
start: 200,
end: 280000,
gap: 100,
isExpanded: isExpanded,
}];
}
option = {
tooltip: {
},
yAxis: {
axisLine: {
show: true,
onZero: false,
},
axisTick: {
show: true
},
axisLabel: {
hideOverlap: false,
},
breaks: makeYBreaks(false),
breakArea: {
itemStyle: {borderType: 'solid'}
},
},
xAxis: {
triggerEvent: true,
axisTick: {
show: true
},
axisLabel: {
hideOverlap: false,
show: true,
},
axisLine: {
show: true,
onZero: false,
},
breaks: makeXBreaks(false),
breakArea: {
itemStyle: {borderType: 'solid'}
},
},
grid: {
left: GRID_SIZE.left,
right: GRID_SIZE.right,
top: GRID_SIZE.top,
bottom: GRID_SIZE.bottom,
},
dataZoom: [{
type: 'slider',
xAxisIndex: 0,
bottom: 20,
}, {
type: 'inside',
xAxisIndex: 0,
}, {
type: 'slider',
yAxisIndex: 0,
right: 20,
}],
legend: {
data: ['s2']
},
tooltip: {
trigger: 'axis'
},
series: [{
type: 'scatter',
name: 's2',
symbolSize: 20,
data: [
[-1500, 10000],
[-200000, 290000],
[8008, 20000],
[-30000, -50000],
[100200, 3000],
[700435, 300000],
[700800, 4000]
],
label: {
show: true,
position: 'top',
textStyle: {
fontSize: 10,
},
},
}]
};
function brkStr(breakOptionList, idx) {
var txt = [];
breakOptionList.forEach(function (item) {
txt.push(item.start + '~' + item.end);
});
return txt.length ? txt.join(',') : 'none';
}
var chart = testHelper.create(echarts, 'main_xNumber_yNumber_axis', {
title: [
'- xAxis with breaks: ' + brkStr(makeXBreaks()),
'- yAxis with breaks: ' + brkStr(makeYBreaks()),
'- break pair should be centered to break ticks when **labels length differ significantly**.',
'- break labels should neight overlap nor join (**test different gap size**)',
'- Negative breaks should work correctly.',
'- **rotate Y labels to 90**, should be correct.',
'- rotate X labels, should be correct.',
'- **Inverse axis**, should be correct.',
'- Click the legend to remove all series, expect only axis drawn.'
],
option: option,
width: 700,
height: 400,
draggable: true,
inputsHeight: 119.5,
inputs: [{
text: 'reset X breaks',
onclick: function () {
chart.dispatchAction({
type: 'collapseAxisBreak',
xAxisIndex: 0,
breaks: makeXBreaks(false)
});
}
}, {
text: 'reset Y breaks',
onclick: function () {
chart.dispatchAction({
type: 'collapseAxisBreak',
yAxisIndex: 0,
breaks: makeYBreaks(false)
});
}
}, {
text: 'x inverse:',
type: 'select',
values: [false, true],
onchange: function () {
chart.setOption({xAxis: {inverse: this.value}});
}
}, {
text: 'y inverse:',
type: 'select',
values: [false, true],
onchange: function () {
chart.setOption({yAxis: {inverse: this.value}});
}
}, {
text: 'axisLabel.hideOverlap:',
type: 'select',
values: [false, true],
onchange: function () {
var value = this.value;
chart.setOption({
xAxis: {axisLabel: {hideOverlap: value}},
yAxis: {axisLabel: {hideOverlap: value}},
});
}
}, {
type: 'br'
}, {
text: 'xAxis.axisLabel.rotate',
type: 'select',
options: [
{value: undefined},
{text: 'range', input: {
type: 'range',
noDeltaButtons: true,
value: 0,
min: -100,
max: 100,
}}
],
onchange: function () {
chart.setOption({xAxis: {axisLabel: {rotate: this.value}}});
}
}, {
text: 'yAxis.axisLabel.rotate',
type: 'select',
options: [
{value: undefined},
{text: 'range', input: {
type: 'range',
noDeltaButtons: true,
value: 0,
min: -100,
max: 100,
}}
],
onchange: function () {
chart.setOption({yAxis: {axisLabel: {rotate: this.value}}});
}
}, {
type: 'br'
}, {
text: 'containLabel:',
type: 'select',
options: [
{text: 'false', value: false},
{text: 'true(should in green rect)', value: true}
],
onchange: function () {
if (!chart.__containLabelRect) {
chart.__containLabelRect = new echarts.graphic.Rect({
style: {
fill: 'green',
opacity: 0.1,
},
z: -10000,
});
chart.getZr().add(chart.__containLabelRect);
}
updateContainLabelCriterion(chart);
chart.__containLabelRect.ignore = !this.value;
chart.setOption({
grid: {containLabel: this.value},
});
}
}, {
type: 'select',
text: 'label margin:',
values: [undefined, 30, [2, 20]],
onchange: function () {
chart.setOption({
xAxis: {axisLabel: {textMargin: this.value}},
yAxis: {axisLabel: {textMargin: this.value}},
});
}
}]
});
function updateContainLabelCriterion(chart) {
if (chart.__containLabelRect) {
var width = chart.getWidth();
var height = chart.getHeight();
chart.__containLabelRect.setShape({
x: GRID_SIZE.left,
width: width - GRID_SIZE.left - GRID_SIZE.right,
y: GRID_SIZE.top,
height: height - GRID_SIZE.top - GRID_SIZE.bottom,
});
}
}
if (chart) {
chart.on('resize', function () {
updateContainLabelCriterion(chart);
});
chart.on('axisbreakchanged', function (params) {
console.log('axisbreakchanged', params);
});
}
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var _gridShow = [true, true];
// var _gridShow = [true, false];
var BASE_DATE = 1740824305347;
var ROUND_LEVELS = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond'];
var X_LABEL_ROTATE = 30;
var Y_LABEL_ROTATE = 0;
var XAXIS_NAME_GAP = -130;
var useUTC = false;
var _curr = {
roundLevel: {
breakStart: 'millisecond',
breakEnd: 'second',
},
timeDataRange: 'hour',
};
function xMakeBreaksAndData() {
if (ROUND_LEVELS.indexOf(_curr.roundLevel.breakStart) < 0
|| ROUND_LEVELS.indexOf(_curr.roundLevel.breakEnd) < 0
) {
throw new Error();
}
var timeDataRange = _curr.timeDataRange;
function roundTimeStart(val) {
return echarts.time.roundTime(new Date(val), _curr.roundLevel.breakStart, useUTC).getTime();
}
function roundTimeEnd(val) {
return echarts.time.roundTime(new Date(val), _curr.roundLevel.breakEnd, useUTC).getTime();
}
function make(brkEndStartSpan) {
var start0seed = 35801123 + BASE_DATE;
var breaks = [];
breaks[0] = {
start: roundTimeStart(start0seed),
end: roundTimeEnd(start0seed + brkEndStartSpan),
gap: brkEndStartSpan / 8,
};
var brk1StartSeed = start0seed + 5.6 * brkEndStartSpan;
breaks[1] = {
start: roundTimeStart(brk1StartSeed),
end: roundTimeEnd(brk1StartSeed + 50 * brkEndStartSpan),
gap: '5%'
};
var brkMin = Math.min(breaks[0].start, breaks[1].start);
var brkMax = Math.max(breaks[0].end, breaks[1].end);
var seriesData = [[
[brkMin - brkEndStartSpan * 5, 1000],
[(brkMin + brkMax) / 2, 1500],
[brkMax + brkEndStartSpan * 10, 2000]
], [
[breaks[0].start, 1000],
[breaks[0].end, 1500],
[breaks[1].start, 1000],
[breaks[1].end, 1500]
], [
[brkMin - brkEndStartSpan * 55, 1000],
[brkMax + brkEndStartSpan * 55, 2000]
]];
return {breaks: breaks, seriesData: seriesData};
}
if (timeDataRange === 'ms') {
return make(84080);
}
if (timeDataRange === 'second') {
return make(8408000);
}
else if (timeDataRange === 'hour') {
return make(4765432);
}
else if (timeDataRange === 'day') {
return make(98408123);
}
else if (timeDataRange === 'month') {
return make(3196800000);
}
else if (timeDataRange === 'year') {
return make(32140800000);
}
else {
throw new Error('illegal range');
}
}
function yMakeBreaks() {
return [{
end: 1800,
start: 1500,
gap: 0
}, {
end: 900,
start: 600,
gap: '5%'
}];
}
var FORMATTER_ONE_LINE = (value, idx, params) => {
var dateStr = echarts.time.format(value, '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}');
if (params && params.break) {
return `${dateStr} (${params.break.type})`;
}
return `${dateStr}`;
};
var FORMATTER_TWO_LINE = (value, idx, params) => {
var dateStr = echarts.time.format(value, '{yyyy}-{MM}-{dd}\n{hh}:{mm}:{ss}');
if (params && params.break) {
return `(${params.break.type}) ${dateStr}`;
}
return `${dateStr}`;
};
var generatedData = xMakeBreaksAndData();
var option = {
yAxis: (function () {
var list = [];
var idx = 0;
var gridIndex = 0;
_gridShow[idx++] && list.push({
id: 'y_number_breaks',
gridIndex: gridIndex++,
axisLabel: {
rotate: Y_LABEL_ROTATE,
},
breaks: yMakeBreaks()
});
_gridShow[idx++] && list.push({
gridIndex: gridIndex++,
axisLabel: {
rotate: Y_LABEL_ROTATE,
},
});
return list;
})(),
xAxis: (function () {
var list = [];
var idx = 0;
var gridIndex = 0;
_gridShow[idx++] && list.push({
id: 'x_time_breaks',
type: 'time',
gridIndex: gridIndex++,
name: 'Has axisLabel.formatter',
nameLocation: 'center',
nameGap: XAXIS_NAME_GAP,
splitLine: {
show: true,
},
axisTick: {
show: true,
},
breaks: generatedData.breaks,
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
borderType: 'solid',
color: '#ccc',
}
},
axisLabel: {
rotate: X_LABEL_ROTATE,
hideOverlap: false,
},
});
_gridShow[idx++] && list.push({
id: 'x_criterion',
type: 'time',
gridIndex: gridIndex++,
name: 'No breaks (criterion)',
nameLocation: 'center',
nameGap: XAXIS_NAME_GAP,
splitLine: {
show: true,
},
axisTick: {
show: true,
},
axisLabel: {
rotate: X_LABEL_ROTATE,
hideOverlap: false,
}
});
return list;
})(),
dataZoom: (function () {
var indexList = [];
var idx = 0;
_gridShow.forEach(function (show) { indexList.push(idx++); });
return [{
type: 'slider',
xAxisIndex: indexList.slice(),
}, {
type: 'slider',
right: 20,
yAxisIndex: indexList.slice(),
}, {
type: 'inside',
xAxisIndex: indexList.slice(),
}];
})(),
legend: {
left: 20,
selected: {
's2': false,
},
},
grid: (function () {
var list = [];
var idx = 0;
_gridShow[idx++] && list.push({
left: 90,
top: 50,
right: 70,
height: '20%',
borderWidth: 0,
});
_gridShow[idx++] && list.push({
left: 90,
right: 70,
height: '20%',
bottom: 120,
borderWidth: 0,
});
return list;
})(),
tooltip: {
trigger: 'axis',
},
series: (function makeSeries() {
const createSeries = () => generatedData.seriesData.map((data, idx) => ({
type: 'scatter',
name: 's' + idx,
data: data,
label: {
show: true
}
}));
let list = [];
var gridIndex = 0;
_gridShow.forEach((show) => {
if (!show) { return; }
var seriesOptionList = generatedData.seriesData.map((data, idx) => ({
type: 'scatter',
name: 's' + idx,
data: data,
xAxisIndex: gridIndex,
yAxisIndex: gridIndex,
label: {
show: true
}
}));
gridIndex++;
list = list.concat(seriesOptionList);
});
return list;
})()
};
var chart = testHelper.create(echarts, 'main_xTime_yNumber_axis', {
title: [
'x: time axis, y: number axis.',
'- The default formatter should:',
'  - be consistent between break and normal labels.',
'  - **have adequate time info**(change time level by select & zoom).',
'- Should not overlap as much as possible.',
'  - **rotate axis labels**, check break ends label overlap adjusting.',
'  - test **axisLable.rotate is 0**.',
'- **inverse axis** should be correct.'
],
option: option,
width: 700,
height: 450,
draggable: true,
buttons: function (chart) {
var charOption = chart.getOption();
function updateDataAndXBreaks() {
var generatedData = xMakeBreaksAndData();
chart.setOption({
xAxis: {
id: 'x_time_breaks',
breaks: generatedData.breaks,
},
series: _gridShow.reduce((list, show) => {
if (show) {
list = list.concat(generatedData.seriesData.map(data => ({data: data})));
}
return list;
}, [])
});
}
return [{
text: 'reset breaks expand',
onclick: function () {
chart.dispatchAction({
type: 'collapseAxisBreak',
batch: [{
xAxisId: 'x_time_breaks',
breaks: xMakeBreaksAndData().breaks,
}, {
yAxisId: 'y_number_breaks',
breaks: yMakeBreaks()
}],
});
}
}, {
text: 'axis.inverse:',
type: 'select',
values: [false, true],
onchange: function () {
var value = this.value;
var xAxis = [];
var yAxis = [];
_gridShow.forEach(show => {
if (show) {
xAxis.push({ inverse: value });
yAxis.push({ inverse: value });
}
});
chart.setOption({
xAxis: xAxis,
yAxis: yAxis,
});
}
}, {
text: 'axis formatter:',
type: 'select',
options: [
{text: 'none', value: undefined},
{text: 'one line', value: FORMATTER_ONE_LINE},
{text: 'two line', value: FORMATTER_TWO_LINE}
],
onchange: function () {
chart.setOption({
xAxis: [
{ id: 'x_time_breaks', axisLabel: {formatter: this.value} },
]
});
}
}, {
type: 'br'
}, {
type: 'select',
text: 'time range:',
values: ['ms', 'second', 'hour', 'day', 'month', 'year'],
value: _curr.timeDataRange,
onchange: function () {
_curr.timeDataRange = this.value;
updateDataAndXBreaks();
}
}, {
type: 'select',
text: 'break.start rounded to:',
values: ROUND_LEVELS,
value: _curr.roundLevel.breakStart,
onchange: function () {
_curr.roundLevel.breakStart = this.value;
updateDataAndXBreaks();
}
}, {
type: 'select',
text: 'break.end rounded to:',
values: ROUND_LEVELS,
value: _curr.roundLevel.breakEnd,
onchange: function () {
_curr.roundLevel.breakEnd = this.value;
updateDataAndXBreaks();
}
}, {
type: 'br'
}, {
text: 'hideOverlap:',
type: 'select',
values: [false, true],
onchange: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {hideOverlap: value} });
});
chart.setOption({
xAxis: list
});
}
}, {
text: 'showMinLabel',
type: 'select',
values: [undefined, false, true],
onchange: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {showMinLabel: value} });
});
chart.setOption({
xAxis: list
});
}
}, {
text: 'showMaxLabel',
type: 'select',
values: [undefined, false, true],
onchange: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {showMaxLabel: value} });
});
chart.setOption({
xAxis: list
});
}
}, {
type: 'br'
}, {
type: 'range',
noDeltaButtons: true,
text: 'xAxisLable.rotate',
value: X_LABEL_ROTATE,
min: -50,
max: 100,
oninput: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {rotate: value} });
});
chart.setOption({
xAxis: list
});
}
}, {
type: 'range',
noDeltaButtons: true,
text: 'yAxisLable.rotate',
value: Y_LABEL_ROTATE,
min: -50,
max: 100,
oninput: function () {
var value = this.value;
var list = [];
_gridShow.forEach(show => {
show && list.push({ axisLabel: {rotate: value} });
});
chart.setOption({
yAxis: list
});
}
}];
}
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
function makeBreaks() {
return [{
end: 23000,
start: 5000,
gap: 200
}, {
end: -800,
start: -15000,
gap: 2000
}, {
end: 3420,
start: 3580,
gap: 0
}];
}
var option = {
tooltip: {
},
xAxis: [{
data: ['p1', 'p2'],
gridIndex: 0,
name: '(A) No axisLabel.formatter',
nameLocation: 'center',
nameGap: 25,
}, {
data: ['p1', 'p2'],
gridIndex: 1,
name: '(B) Has axisLabel.formatter',
nameLocation: 'center',
nameGap: 25,
}, {
data: ['p1', 'p2'],
gridIndex: 2,
name: '(C) No breaks (criterion)',
nameLocation: 'center',
nameGap: 25,
}],
yAxis: [{
gridIndex: 0,
breaks: makeBreaks(),
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
color: '#ccc',
}
}
}, {
gridIndex: 1,
breaks: makeBreaks(),
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
borderType: 'solid',
color: '#ccc',
}
},
axisLabel: {
formatter: (value, idx, params) => {
if (params && params.break) {
return `${value} (${params.break.type})`;
}
return `${value}`;
}
}
}, {
gridIndex: 2,
}],
legend: {
data: ['s2', 's3', 's4'],
selected: {
// 's2': false,
's4': false,
},
},
grid: [{
top: 50,
left: 50,
right: '73%',
borderWidth: 0,
}, {
top: 50,
left: '40%',
right: '35%',
borderWidth: 0,
}, {
top: 50,
left: '75%',
right: 20,
borderWidth: 0,
}],
tooltip: {
trigger: 'axis'
},
series: (function makeSeries() {
const createSeries = () => [{
type: 'bar',
name: 's2',
data: [-8000, 10000],
label: {
show: true
}
}, {
type: 'bar',
name: 's3',
data: [200, 500],
label: {
show: true
}
}, {
type: 'bar',
name: 's4',
data: [-18910, 31230],
label: {
show: true
}
}];
const seriesOptionList = [];
for (axisIndex = 0; axisIndex < 3; axisIndex++) {
createSeries().forEach(seriesOption => {
seriesOption.xAxisIndex = axisIndex;
seriesOption.yAxisIndex = axisIndex;
seriesOptionList.push(seriesOption);
});
}
return seriesOptionList;
})()
};
var chart = testHelper.create(echarts, 'main_xCategory_yNumber_axis', {
title: [
'x: category axis, y: number axis.',
'- The default formatter should be correct and consistent.',
'- Should not overlap.',
'- If a break is displayed, all ends of it should be displayed.',
],
option: option,
height: 300,
buttons: function (chart) {
var option = chart.getOption();
return [{
text: 'hideOverlap:',
type: 'select',
values: [true, false],
value: !!(option.yAxis[0].axisLabel || {}).hideOverlap,
onchange: function () {
var value = this.value;
chart.setOption({
yAxis: [{
axisLabel: {hideOverlap: value}
}, {
axisLabel: {hideOverlap: value}
}, {
axisLabel: {hideOverlap: value}
}]
});
}
}, {
type: 'range',
noDeltaButtons: true,
text: 'yAxisLable.rotate',
value: 0,
min: -50,
max: 100,
oninput: function () {
var value = this.value;
chart.setOption({
yAxis: [
{ axisLabel: {rotate: value} },
{ axisLabel: {rotate: value} },
{ axisLabel: {rotate: value} },
]
});
}
}]
}
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var X_NAME_GAP = -240;
function makeBreaks() {
return [{
end: 230000,
start: 50000,
gap: 5000
}, {
end: -8000,
start: -150000,
gap: 20000
}, {
end: 34200,
start: 35800,
gap: 0
}];
}
var option = {
tooltip: {
},
yAxis: [{
data: ['p1', 'p2'],
gridIndex: 0,
}, {
data: ['p1', 'p2'],
gridIndex: 1,
}, {
data: ['p1', 'p2'],
gridIndex: 2,
}],
xAxis: [{
id: 'x0',
gridIndex: 0,
name: '(A) No axisLabel.formatter',
nameLocation: 'center',
nameGap: X_NAME_GAP,
breaks: makeBreaks(),
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
color: '#ccc',
}
},
axisLabel: {
hideOverlap: true,
}
}, {
id: 'x1',
gridIndex: 1,
name: '(B) Has axisLabel.formatter',
nameLocation: 'center',
nameGap: X_NAME_GAP,
breaks: makeBreaks(),
breakArea: {
zigzagAmplitude: 2,
itemStyle: {
borderType: 'solid',
color: '#ccc',
}
},
axisLabel: {
hideOverlap: true,
formatter: (value, idx, params) => {
if (params && params.break) {
return `${value}\n(${params.break.type})`;
}
return `${value}`;
}
}
}, {
id: 'x2',
gridIndex: 2,
name: '(C) No breaks (criterion)',
nameLocation: 'center',
nameGap: X_NAME_GAP,
axisLabel: {
hideOverlap: true,
}
}],
legend: {
data: ['s2', 's3', 's4'],
selected: {
// 's2': false,
's4': false,
},
},
grid: [{
top: 50,
left: 50,
width: '35%',
height: '35%',
borderWidth: 0,
}, {
top: 50,
right: 70,
width: '35%',
height: '35%',
borderWidth: 0,
}, {
left: 50,
right: 20,
width: '35%',
height: '35%',
bottom: 60,
borderWidth: 0,
}],
tooltip: {
trigger: 'axis'
},
series: (function makeSeries() {
const createSeries = () => [{
type: 'bar',
name: 's2',
data: [-80000, 100000],
label: {
show: true
}
}, {
type: 'bar',
name: 's3',
data: [2000, 5000],
label: {
show: true
}
}, {
type: 'bar',
name: 's4',
data: [-189100, 312300],
label: {
show: true
}
}];
const seriesOptionList = [];
for (axisIndex = 0; axisIndex < 3; axisIndex++) {
createSeries().forEach(seriesOption => {
seriesOption.xAxisIndex = axisIndex;
seriesOption.yAxisIndex = axisIndex;
seriesOptionList.push(seriesOption);
});
}
return seriesOptionList;
})()
};
var chart = testHelper.create(echarts, 'main_xNumber_yCategory_axis', {
title: [
'x: number axis, y: category axis',
'- xAxis should be horizontal.',
'- The default formatter should be correct and consistent.',
'- Should not overlap.',
'- some break ends can be hide since hideOverlap: true.',
],
option: option,
height: 600,
buttons: function (chart) {
var option = chart.getOption();
return [{
text: 'hideOverlap:',
type: 'select',
value: !!(option.xAxis[0].axisLabel || {}).hideOverlap,
values: [false, true],
onchange: function () {
var value = this.value;
chart.setOption({
xAxis: [{
id: 'x0',
axisLabel: {hideOverlap: value}
}, {
id: 'x1',
axisLabel: {hideOverlap: value}
}, {
id: 'x2',
axisLabel: {hideOverlap: value}
}]
});
}
}, {
type: 'range',
noDeltaButtons: true,
text: 'xAxisLable.rotate',
value: 0,
min: -50,
max: 100,
oninput: function () {
var value = this.value;
var list = [];
[1, 1, 1].forEach(_ => {
list.push({ axisLabel: {rotate: value} });
});
chart.setOption({
xAxis: list
});
}
}];
}
});
});
</script>
</body>
</html>