Echarts单表多图实现

直接上代码

java 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入 ECharts 和 axios -->
    <script src="echarts.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>

<body>
    <!-- 图表容器 -->
    <div id="main" style="width: 100%;height:400px;"></div>

    <script type="text/javascript">
        // 初始化 ECharts 实例
        var chartDom = document.getElementById('main');
        var myChart = echarts.init(chartDom);

        // ========== 数据存储 ==========
        var allXAxisData = [];      // 存储所有X轴数据
        var allSeriesData = [];      // 存储所有折线图数据
        var currentPage = 1;         // 当前页码
        var pageSize = 7;            // 每页数据条数
        var isLoading = false;       // 是否正在加载数据
        var hasMore = true;          // 是否还有更多数据

        // ========== 接口地址 ==========
        const API_URL = 'http://localhost:8081/home/getTableData';

        // ========== 加载数据函数 ==========
        function loadData(page) {
            // 如果正在加载或没有更多数据,则不执行
            if (isLoading || !hasMore) return;
            isLoading = true;

            // 发送请求获取数据
            axios.get(API_URL, {
                params: { page: page, size: pageSize, date: '2023-01-01 00:00:00' }
            }).then(res => {
                const data = res.data.data;
                console.log('第' + page + '页数据:', data);

                // 将新数据累加到现有数据中
                allXAxisData = allXAxisData.concat(data.xAxisData);
                allSeriesData = allSeriesData.concat(data.seriesData);

                // 更新图表数据
                myChart.setOption({
                    xAxis: [
                        { data: allXAxisData },
                        { data: allXAxisData },
                        { data: allXAxisData }
                    ],
                    series: [
                        { data: allSeriesData },
                        { data: allSeriesData },
                        { data: allSeriesData },
                        { data: allSeriesData },
                        { data: allSeriesData },
                        { data: allSeriesData }
                    ]
                });

                // 判断是否还有更多数据(根据返回的总数判断)
                if (data.total <= allXAxisData.length) {
                    console.log('没有更多数据了');
                    console.log('总数据量:', data.total);
                    console.log('当前数据量:', allXAxisData.length);
                    hasMore = false;
                }
                console.log('pageSize');

                // 页码加1,准备加载下一页
                currentPage++;
                isLoading = false;
            }).catch(err => {
                console.error('请求失败:', err);
                isLoading = false;
            });
        }

        // ========== 监听滚动事件(分页加载) ==========
        myChart.on('datazoom', function (params) {
            // 如果没有更多数据或正在加载,则不执行
            if (!hasMore || isLoading) return;

            // 获取当前视图的显示范围(百分比)
            var option = myChart.getOption();
            var dataZoom = option.dataZoom[0];
            var end = dataZoom.end;

            // 计算当前视图最后一条数据的索引
            var totalData = allXAxisData.length;
            var lastIndex = Math.floor(totalData * end / 100);

            // 当滚动到倒数第3个数据点时,触发加载下一页
            if (lastIndex >= totalData - 3) {
                console.log('触发加载下一页');
                loadData(currentPage);
            }
        });

        // ========== 图表配置 ==========
        var option = {
            // 鼠标悬浮提示框配置
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'line',
                    axis: 'x'  // 只显示X轴的竖线
                }
            },
            // 多个图表之间的竖线联动配置
            axisPointer: {
                link: { xAxisIndex: 'all' }
            },
            // 图表布局(三个折线图上下排列)
            grid: [
                // 第一个折线图(顶部)
                {
                    left: "14.5%",
                    right: "12%",
                    top: "5%",
                    height: "28%",
                },
                // 第二个折线图(中部)
                {
                    left: "14.5%",
                    right: "12%",
                    top: "38%",
                    height: "28%",
                },
                // 第三个折线图(底部)
                {
                    left: "14.5%",
                    right: "12%",
                    top: "71%",
                    height: "28%",
                },
            ],
            // 缩放配置(鼠标滚轮缩放)
            dataZoom: [{
                start: 0,          // 初始显示起始位置(0%)
                end: 100,          // 初始显示结束位置(100%)
                type: 'inside',    // 内置缩放(鼠标滚轮)
                xAxisIndex: [0, 1, 2],  // 同时控制三个x轴
                maxSpan: 100       // 最大缩放范围
             }],
            // X轴配置(三个x轴分别对应三个图表)
            xAxis: [
                // 第一个图表的X轴(隐藏标签)
                { gridIndex: 0, type: "category", axisLabel: { show: false }, data: [] },
                // 第二个图表的X轴(隐藏标签)
                { gridIndex: 1, type: "category", axisLabel: { show: false }, data: [] },
                // 第三个图表的X轴(显示标签)
                { gridIndex: 2, type: "category", data: [] },
            ],
            // Y轴配置(三个Y轴分别对应三个图表,都在左侧显示)
            yAxis: [
                // 第一个图表的Y轴
                {
                    gridIndex: 0,
                    splitLine: { show: true, lineStyle: { type: 'solid' } },  // 横向网格线
                    axisLine: { show: true, lineStyle: { color: '#333' } },   // Y轴线
                    axisTick: { show: true }                                   // 刻度线
                },
                // 第二个图表的Y轴
                {
                    gridIndex: 1,
                    splitLine: { show: true, lineStyle: { type: 'solid' } },
                    axisLine: { show: true, lineStyle: { color: '#333' } },
                    axisTick: { show: true }
                },
                // 第三个图表的Y轴
                {
                    gridIndex: 2,
                    splitLine: { show: true, lineStyle: { type: 'solid' } },
                    axisLine: { show: true, lineStyle: { color: '#333' } },
                    axisTick: { show: true }
                },
            ],
            // 折线图配置(6条折线,分成3组)
            series: [
            // 第一个图表的两条折线
            {
                name: "小件货物",
                type: "line",
                xAxisIndex: 0,
                yAxisIndex: 0,
                data: []
            },
            {
                name: "网点负荷",
                type: "line",
                xAxisIndex: 0,
                yAxisIndex: 0,
                data: []
            },
            // 第二个图表的两条折线
            {
                name: "大件货物",
                type: "line",
                xAxisIndex: 1,
                yAxisIndex: 1,
                data: []
            },
            {
                name: "网点负荷2",
                type: "line",
                xAxisIndex: 1,
                yAxisIndex: 1,
                data: []
            },
            // 第三个图表的两条折线
            {
                name: "新增折线1",
                type: "line",
                xAxisIndex: 2,
                yAxisIndex: 2,
                data: []
            },
            {
                name: "新增折线2",
                type: "line",
                xAxisIndex: 2,
                yAxisIndex: 2,
                data: []
            }
        ]
        };

        // 应用配置并初始化图表
        myChart.setOption(option);

        // 初始加载第一页数据
        loadData(currentPage);
    </script>
</body>

</html>

注意:这里还有一个小问题暂时还没解决

复制代码
1. 分页加载后,界面重新渲染,start和end位置的索引会表,例如原来你有10条数据,缩放比例10%,开始为1结束为2,分页加载后,开始结束的位置不会在1和2上了,具体变成多少自行尝试,如果有解决的方法也可以拿出来一起讨论,共创!!!!
2. 上述代码内容部分为AI生成,如有问题,请指出!!!!
相关推荐
跟着珅聪学java1 小时前
Element UI 的 Tabs 标签页开发教程
javascript·vue.js·elementui
dunky1 小时前
Spring AI 深度解析:把 LLM 抽象成 Spring Bean 的底层逻辑
前端
星栈1 小时前
Rust WASM 文件上传全链路:从浏览器到 S3,一个字节都不能少
前端·前端框架·开源
濮水大叔1 小时前
告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染
前端·typescript·node.js
JarvanMo1 小时前
Flutter 3.44 & Dart 3.12重磅发布!这些新特性太香了
前端
竹林8181 小时前
用Viem替换ethers.js:一次合约交互的"减负"实战,我总算把TypeScript类型搞明白了
前端·javascript
To_OC1 小时前
一个让我懵了半小时的时钟 Bug,注重前端三权分立落地
前端·代码规范
归故里1 小时前
harmony-next.skills 为 AI 而生!
前端·后端·github
threelab1 小时前
Three.js 3D 热力图效果 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器