echart预测图表

描述:当前是关于Echarts图表中的 折线图 示例。
 
            // https://www.isqqw.com/viewer?id=39796

function formatDateTime(dateP, format) {
    const pad = (n) => (n < 10 ? "0" + n : n); // 补零函数
    const date = new Date(dateP);
    const year = date.getFullYear();
    const month = pad(date.getMonth() + 1);
    const day = pad(date.getDate());
    const hours = pad(date.getHours());
    const minutes = pad(date.getMinutes());
    const seconds = pad(date.getSeconds());

    return format
        .replace("YYYY", year)
        .replace("MM", month)
        .replace("DD", day)
        .replace("HH", hours)
        .replace("mm", minutes)
        .replace("ss", seconds);
}
let data = [
    { time: "2024.04.24 00:00:00", value: 480 },
    { time: "2024.04.25 00:00:00", value: 500 },
    { time: "2024.04.26 00:00:00", value: 450 },
    { time: "2024.04.27 00:00:00", value: 520 },
    { time: "2024.04.28 00:00:00", value: 490 },
    { time: "2024.04.29 00:00:00", value: 550 },
    { time: "2024.04.30 00:00:00", value: 580 },
    { time: "2024.05.01 00:00:00", value: 560 },
    { time: "2024.05.02 00:00:00", value: 530 },
    { time: "2024.05.03 00:00:00", value: 590 },
    { time: "2024.05.04 00:00:00", value: 540 },
    { time: "2024.05.05 00:00:00", value: 600 },
    { time: "2024.05.06 00:00:00", value: 620 },
    { time: "2024.05.07 00:00:00", value: 650 },
    { time: "2024.05.08 00:00:00", value: 680 },
    { time: "2024.05.09 00:00:00", value: 630 },
    { time: "2024.05.10 00:00:00", value: 660 },
    { time: "2024.05.11 00:00:00", value: 690 },
    { time: "2024.05.12 00:00:00", value: 420, predict: true },
    { time: "2024.05.13 00:00:00", value: 450, predict: true },
    { time: "2024.05.14 00:00:00", value: 480, predict: true },
    { time: "2024.05.15 00:00:00", value: 510, predict: true },
    { time: "2024.05.16 00:00:00", value: 540, predict: true },
    { time: "2024.05.17 00:00:00", value: 480, predict: true },
    { time: "2024.05.18 00:00:00", value: 510, predict: true },
    { time: "2024.05.19 00:00:00", value: 630, predict: true },
    { time: "2024.05.20 00:00:00", value: 660, predict: true },
    { time: "2024.05.21 00:00:00", value: 690, predict: true },
    { time: "2024.05.22 00:00:00", value: 650, predict: true },
    { time: "2024.05.23 00:00:00", value: 750, predict: true },
    { time: "2024.05.24 00:00:00", value: 780, predict: true },
];

let data1 = [];
let data2 = [];
const getDateStr = (dateStr) => formatDateTime(new Date(dateStr), "MM.DD");

data.forEach((item) => {
    if (item.predict) {
        data2.push([getDateStr(item.time), item.value]);
    } else {
        data1.push([getDateStr(item.time), item.value]);
    }
});
const splitLineData = data1.at(-1);

// 如果是折线图,此处需要追加实际数据的最后一组数据,如果是柱状图,则不需要。
data2.unshift(splitLineData);

console.log({ splitLineData });

const labels = data.map((m) => {
    return getDateStr(m.time);
});

const option = {
    backgroundColor: '#061c4c',
    grid: {
        left: 0,
        top: "22%",
        right: "0",
        bottom: 0,
        containLabel: true,
    },
    legend: {
        right: "0",
        top: "4%",
        textStyle: {
            fontSize: 24,
            color: "rgba(203, 221, 242, 1)",
        },
    },
    xAxis: {
        type: "category",
        data: labels,
        axisLabel: {
            fontSize: 28,
            color: "rgba(203, 221, 242, 0.60)",
        },
        axisTick: {
            show: false,
        },
    },
    yAxis: {
        type: "value",
        splitLine: {
            show: true,
        },
        axisLabel: {
            fontSize: 28,
            color: "rgba(203, 221, 242, 0.60)",
        },
    },
    series: [
        {
            name: "历史",
            type: "line",
            showSymbol: false,
            data: data1,
            smooth: true,
            areaStyle: {
                color: {
                    type: "linear",
                    x: 0,
                    y: 0,
                    x2: 0,
                    y2: 0.6,
                    colorStops: [
                        {
                            offset: 0,
                            color: "rgba(0, 170, 255, 0.2)", // 0% 处的颜色
                        },
                        {
                            offset: 1,
                            color: "rgba(0, 170, 255, 0)", // 100% 处的颜色
                        },
                    ],
                    global: false, // 缺省为 false
                },
            },
            lineStyle: {
                width: 2,
                color: "rgba(0, 170, 255, 1)",
            },
        },
        {
            name: "预测",
            type: "line",
            showSymbol: false,
            data: data2,
            smooth: true,
            areaStyle: {
                color: {
                    type: "linear",
                    x: 0,
                    y: 0,
                    x2: 0,
                    y2: 0.6,
                    colorStops: [
                        {
                            offset: 0,
                            color: "rgba(46, 224, 85, 0.2)", // 0% 处的颜色
                        },
                        {
                            offset: 1,
                            color: "rgba(46, 224, 85, 0)", // 100% 处的颜色
                        },
                    ],
                    global: false, // 缺省为 false
                },
            },
            lineStyle: {
                width: 2,
                color: "rgba(46, 224, 85, 1)",
            },
        },
        {
            type: "line",
            data: [],
            markLine: {
                symbol: "none",
                lineStyle: {
                    type: "solid",
                    width: 2,
                },
                data: [
                    // 灰色线
                    {
                        xAxis: splitLineData[0],
                        label: {
                            show: false,
                        },
                        lineStyle: {
                            color: "white",
                        },
                    },
                    // 下面绿色线
                    [
                        // 下面半截绿色的线
                        {
                            xAxis: splitLineData[0],
                            yAxis: 0,
                            lineStyle: {
                                color: "rgba(46, 224, 85, 1)",
                            },
                        },
                        {
                            xAxis: splitLineData[0],
                            yAxis: splitLineData[1],
                        },
                    ],
                ],
            },
            markPoint: {
                data: [
                    {
                        coord: splitLineData,
                        symbol: "circle",
                        symbolSize: 16,
                        itemStyle: {
                            color: "rgba(203, 221, 242, 1)",
                            shadowColor: "rgba(46, 224, 85, 1)",
                            shadowBlur: 10,
                        },
                    },
                ],
            },
        },
    ],
};