基坑监测图

描述:当前是关于Echarts图表中的 折线图 示例。
 
            // 基坑观测数据
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);
            })
        }
    ]
};