x轴(xAxis)为time时,使用dataZoom上下滚动grid时,axisLabel设置rotate被旋转?
需要做一个任务进度甘特图,用到了echarts v4.3
,x轴为time
类型,但是由于刻度比较多,很容易重叠,所以打算把label旋转40°,这样就能节省不少空间。但是在加入dataZoom后,上下滚动滚动条时,发现label变成了负角度了。
静态页面完整代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="main" style="width: 100%; height: 500px;"></div>
</body>
</html>
<script src="https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js"></script>
<script type="text/javascript">
var HEIGHT_RATIO = 0.5;
var DIM_CATEGORY_INDEX = 0;//类目索引
var DIM_TIME_START = 1;//抵达时间
var DIM_TIME_END = 2;//起飞时间
var DIM_TIME_DELAY = 3;//超时时间
var DIM_TASK_NO = 5;//任务编号索引
var DATA_ZOOM_AUTO_MOVE_THROTTLE = 30;
var DATA_ZOOM_X_INSIDE_INDEX = 1;
var DATA_ZOOM_Y_INSIDE_INDEX = 3;
var DATA_ZOOM_AUTO_MOVE_SPEED = 0.2;
var DATA_ZOOM_AUTO_MOVE_DETECT_AREA_WIDTH = 30;
var _rawData;
var _autoDataZoomAnimator;
let datasTemp = [
{
"CreateUserId": "111-111-111",
"CreateUserName": "小A",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220014",
"TaskTitle": "任务一",
"TaskStartTime": "2018-10-17",
"TaskEndTime": "2018-10-19",
"TaskDelayTime": "2018-10-20"
},
{
"CreateUserId": "111-111-111",
"CreateUserName": "小A",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220015",
"TaskTitle": "任务三",
"TaskStartTime": "2018-10-14",
"TaskEndTime": "2018-10-21",
"TaskDelayTime": "2018-10-23"
},
{
"CreateUserId": "111-111-111",
"CreateUserName": "小A",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220016",
"TaskTitle": "任务四",
"TaskStartTime": "2018-10-14",
"TaskEndTime": "2018-10-20",
"TaskDelayTime": "2018-10-22"
},
{
"CreateUserId": "222-222-222",
"CreateUserName": "小张",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220017",
"TaskTitle": "任务五",
"TaskStartTime": "2018-10-18",
"TaskEndTime": "2018-10-28",
"TaskDelayTime": "2018-10-29"
},
{
"CreateUserId": "222-222-222",
"CreateUserName": "小张",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220018",
"TaskTitle": "任务六",
"TaskStartTime": "2018-10-13",
"TaskEndTime": "2018-10-21",
"TaskDelayTime": "2018-10-22"
},
{
"CreateUserId": "222-222-222",
"CreateUserName": "小张",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220019",
"TaskTitle": "任务七",
"TaskStartTime": "2018-11-16",
"TaskEndTime": "2018-11-19",
"TaskDelayTime": "2018-11-22"
},
{
"CreateUserId": "222-222-222",
"CreateUserName": "小张",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220020",
"TaskTitle": "任务九",
"TaskStartTime": "2018-10-12",
"TaskEndTime": "2018-10-20",
"TaskDelayTime": "2018-10-23"
},
{
"CreateUserId": "ccc-ccc-ccc",
"CreateUserName": "王五",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220021",
"TaskTitle": "任务十一",
"TaskStartTime": "2018-10-13",
"TaskEndTime": "2018-10-19",
"TaskDelayTime": "2018-10-20"
},
{
"CreateUserId": "ccc-ccc-ccc",
"CreateUserName": "王五",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220022",
"TaskTitle": "任务十三",
"TaskStartTime": "2018-10-14",
"TaskEndTime": "2018-10-18",
"TaskDelayTime": "2018-10-19"
},
{
"CreateUserId": "444-444-444",
"CreateUserName": "李四",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220023",
"TaskTitle": "任务十五",
"TaskStartTime": "2018-10-16",
"TaskEndTime": "2018-10-21",
"TaskDelayTime": "2018-10-22"
},
{
"CreateUserId": "444-444-444",
"CreateUserName": "李四",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220024",
"TaskTitle": "任务十七",
"TaskStartTime": "2018-10-11",
"TaskEndTime": "2018-10-14",
"TaskDelayTime": "2018-10-15"
},
{
"CreateUserId": "555-555-555",
"CreateUserName": "张三",
"DeptName": "软件部门",
"Num": "100000",
"TaskNo": "RW201910220025",
"TaskTitle": "任务十九",
"TaskStartTime": "2018-10-3",
"TaskEndTime": "2018-10-8",
"TaskDelayTime": "2018-10-10"
}
]
let datas = {
"taskTitle": {
"dimensions": ["Name"],
"data": datasTemp.map(s => s.TaskNo)
},
"taskDatas": {
"dimensions": [
"索引",
"开始时间",
"结束时间",
"延期至",
"任务标题",
"任务流水号",
],
"data": datasTemp.map((item, idx) => {
return [idx, item.TaskStartTime, item.TaskEndTime, item.TaskDelayTime, item.TaskTitle, item.TaskNo]
})
}
}
var myChart = echarts.init(document.getElementById('main'));
_rawData = datas;
myChart.setOption(option = makeOption());
function makeOption() {
return {
tooltip: {
},
animation: false,
title: {
text: '任务概况图',
left: 'center'
},
dataZoom: [{ //交互组件
type: 'slider',
xAxisIndex: 0,
filterMode: 'weakFilter',
height: 20,
bottom: 0,
start: 0,
end: 26,
handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
handleSize: '80%',
showDetail: false
}, {
type: 'inside',
id: 'insideX',
xAxisIndex: 0,
filterMode: 'weakFilter',
start: 0,
end: 26,
zoomOnMouseWheel: false,
moveOnMouseMove: true
}, {
type: 'slider',
yAxisIndex: 0,
zoomLock: true,
width: 10,
right: 10,
top: 70,
bottom: 20,
start: 10,
end: 100,
handleSize: 0,
showDetail: false,
}, {
type: 'inside',
id: 'insideY',
yAxisIndex: 0,
start: 95,
end: 100,
zoomOnMouseWheel: false,
moveOnMouseMove: true,
moveOnMouseWheel: true
}],
grid: { //表格对象
show: true,
top: 70,
bottom: 20,
left: 130,
right: 20,
borderWidth: 0
},
xAxis: {
type: 'time',
splitNumber: 24,
position: 'top',
splitLine: {
lineStyle: {
color: ['#E9EDFF']
}
},
axisLine: {
show: false
},
axisTick: {
lineStyle: {
color: '#929ABA'
}
},
axisLabel: {
color: '#929ABA',
align: 'left',
rotate: 20
},
},
yAxis: {
axisTick: {show: false},
splitLine: {show: false},
axisLine: {show: false},
axisLabel: {show: false},
min: 0,
max: _rawData.taskTitle.data.length
},
series: [{
id: 'taskData',
type: 'custom',
renderItem: renderGanttItem,
dimensions: _rawData.taskDatas.dimensions,
encode: {
x: [DIM_TIME_START, DIM_TIME_END, DIM_TIME_DELAY],
y: DIM_CATEGORY_INDEX,
tooltip: [DIM_TASK_NO, 4, DIM_TIME_START, DIM_TIME_END, DIM_TIME_DELAY]
},
data: _rawData.taskDatas.data
}, {
type: 'custom',
renderItem: renderAxisLabelItem,
dimensions: _rawData.taskTitle.dimensions,
encode: {
x: -1, // Then this series will not controlled by x.
y: 0
},
data: echarts.util.map(_rawData.taskTitle.data, function (item, index) {
return [index].concat(item);
})
}]
};
}
function renderGanttItem(params, api) {
var categoryIndex = api.value(DIM_CATEGORY_INDEX);
var timeStart = api.coord([api.value(DIM_TIME_START), categoryIndex]);
var timeEnd = api.coord([api.value(DIM_TIME_END), categoryIndex]);
var timeDelay = api.coord([api.value(DIM_TIME_DELAY), categoryIndex]);
var barLength = timeDelay[0] - timeStart[0];
var normalBarLength = timeEnd[0] - timeStart[0];
// Get the heigth corresponds to length 1 on y axis.
var barHeight = api.size([0, 1])[1] * HEIGHT_RATIO;
var x = timeStart[0];
var y = timeStart[1] - barHeight;
var taskName = api.value(4) + '';
var taskNameWidth = echarts.format.getTextRect(taskName).width;
var text = (barLength > taskNameWidth + 40 && x + barLength >= 180)
? taskName : '';
var rectDelay = clipRectByRect(params, {
x: x, y: y, width: barLength, height: barHeight
});
var rectNormal = clipRectByRect(params, {
x: x, y: y, width: normalBarLength, height: barHeight
})
var rectText = clipRectByRect(params, {
x: x, y: y, width: barLength, height: barHeight
});
return {
type: 'group',
children: [
{
type: 'rect',
ignore: !rectDelay,
shape: rectDelay,
style: api.style()
},
{
type: 'rect',
ignore: !rectNormal,
shape: rectNormal,
style: api.style({fill: 'green'})//甘特图条左侧部分
},
{
type: 'rect',
ignore: !rectText,
shape: rectText,
style: api.style({
fill: 'transparent',
stroke: 'transparent',
text: text,
textFill: '#fff'
})
}
]
};
}
function renderAxisLabelItem(params, api) {
var y = api.coord([0, api.value(0)])[1];
if (y < params.coordSys.y + 5) {
return;
}
return {
type: 'group',
position: [
10,
y
],
children: [
{
type: 'text',
style: {
x: 0,
y: -3,
text: api.value(1),
textVerticalAlign: 'bottom',
textAlign: 'left',
textFill: '#000',
},
},
]
};
}
function clipRectByRect(params, rect) {
return echarts.graphic.clipRectByRect(rect, {
x: params.coordSys.x,
y: params.coordSys.y,
width: params.coordSys.width,
height: params.coordSys.height
});
}
</script>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论