重点在于如何对应 y 轴数据
配置项如下
// 基坑观测数据
const observationData = [{
name: '第一次',
time: '2020-09-26',
floor: -3,
settlement: 0
},
{
name: '第二次',
time: '2020-10-23',
floor: 2,
settlement: -1.44
}, {
name: '第三次',
time: '2020-11-04',
floor: 6,
settlement: -2.28
},
{
name: '第四次',
time: '2020-11-28',
floor: 10,
settlement: -3.80
},
// {
// name: '第五次',
// time: '2020-12-15',
// floor: 13,
// settlement: -4.60
// }
];
// 拼接 echarts y 轴数据
// 1. 取得数据中的最大沉降量(即沉降量最小值)
let maxSettlement = Math.min(...observationData.map(item => item.settlement));
// 2. 根据最大沉降量 * 2 得到沉降量数组 同时定义 y轴 分割基准值
let settlementArr = [];
let yAxisDividNum = 0.5;
// 2.1 判断最小值扩大之后的情况
if (maxSettlement * 1.2 < -20) {
maxSettlement = -20;
yAxisDividNum = 1;
} else maxSettlement *= 1.2;
// 2.2 循环构造数组
do {
settlementArr.push(maxSettlement);
maxSettlement = Number((maxSettlement + yAxisDividNum).toFixed(1));
} while (maxSettlement < 0);
// 2.3 多push一个值,用来显示 y 轴负值区域的轴名称
settlementArr.unshift(settlementArr[0] - yAxisDividNum);
// 3. 楼层高度
const buildingHeight = 19;
// 3.1 根据楼层高度得到楼层数组
let buildingArr = [];
for (let i = 1; i <= buildingHeight; i++) {
buildingArr.push(i);
}
// 3.2 楼层数组需额外 + 地下两层 + 夹层
buildingArr = [0.1, 0.2, 0.3].concat(buildingArr);
// 4. 拼接 y 轴数据(沉降量 + 楼层)
const temp = settlementArr.concat(buildingArr);
let fNum = 0; // y 轴负值
let zNum = 0; // y 轴正值
for (let i = 0; i < temp.length; i++) {
if (temp[i] < 0) fNum--;
if (temp[i] > 0) zNum++;
}
let yAxisData = [];
for (let i = fNum; i <= zNum; i++) {
yAxisData.push(i); // y z轴真实数据
}
// 单独获取一下数据中的沉降量数据
const CJL = observationData.map(item => item.settlement);
// echarts配置
option = {
backgroundColor: "#fff",
tooltip: {
show: true,
trigger: 'axis',
// axisPointer: {
// type: 'cross',
// axis:'x',
// label: {
// show: false
// },
// crossStyle: {
// type: 'solid',
// color: 'red'
// }
// },
formatter: (params) => {
return `<span>${params[0].axisValueLabel}</span><br>
<span><span>${params[0].marker}</span>楼层:${params[0].value === 0 ? 0:params[0].value - 3}</span><br>
<span><span>${params[1].marker}</span>沉降量:${CJL[params[1].dataIndex]}</span>`;
}
},
grid: {
containLabel: true
},
xAxis: {
type: 'category',
splitLine: {
show: true
},
boundaryGap: false,
axisLabel: {
show: true,
align: 'left'
},
axisLine: {
symbol: ['none', 'arrow'],
lineStyle: {
width: 2
}
},
data: observationData.map(item => `${item.time}\n${item.name}`)
},
yAxis: {
name: '载荷(楼层)',
nameTextStyle: {
align: 'right'
},
type: 'value',
max: yAxisData[yAxisData.length - 1],
min: yAxisData[0],
interval: 1,
splitLine: {
show: true
},
axisLabel: {
show: true,
formatter: (item, index) => {
// 改变y轴label
if (item === yAxisData[0]) return '累积沉降量(mm)'
if (item >= 0 && item < 4) {
return item === 0 ? 0 : item === 1 ? 'B2' : item === 2 ? 'B1' : 'J'
} else {
if (item < 0) return settlementArr[index];
if (item === yAxisData[yAxisData.length - 1]) return '机房层';
return item - 3;
}
}
},
axisLine: {
symbol: ['arrow', 'arrow'],
symbolOffset: [-12, 12],
lineStyle: {
width: 2
},
},
data: yAxisData
},
series: [{
name: '楼层',
type: 'line',
smooth: true,
label: {
show: true,
formatter: (value) => {
switch (value.value) {
case 0:
return '';
case 1:
return 'B2';
case 2:
return 'B1';
case 3:
return 'J';
default:
return value.value - 3;
}
}
},
data: observationData.map(item => {
// 每一层的数加上地下3成(+3)
return item.floor + 3;
})
},
{
name: '沉降量',
type: 'line',
smooth: true,
label: {
show: true,
position: 'bottom',
formatter: (params) => {
if (params.value === 0) return '';
return CJL[params.dataIndex];
}
},
data: CJL.map((item, index) => {
if (index === 0) return 0;
return item / yAxisDividNum - ((settlementArr[settlementArr.length - 1] / yAxisDividNum) + 1);
})
}
]
};