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生成,如有问题,请指出!!!!
相关推荐
天启HTTP4 小时前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php
卡布鲁4 小时前
Webpack 核心原理与自定义 Loader/Plugin 实战
前端·javascript
小林ixn4 小时前
从拼多多手机号验证到模板引擎:深入正则表达式与 JS 字符串处理
开发语言·javascript·正则表达式
智码看视界4 小时前
Web Storage 的无障碍实践与工程化应用
前端·javascript·web
孟陬4 小时前
国外技术周刊 #140:在 Jeff Bezos 的私密 Campfire 峰会上,我学到了关于亿万富翁的事
前端·后端
槑有老呆4 小时前
Bun:一个让 Node 开发者原地起飞的 JS/TS 运行时
前端
小小小小宇4 小时前
AI Agent 核心流程与底层逻辑
前端
wuhen_n4 小时前
RAG 实战:语义检索 + 大模型生成精准问答
前端·langchain·ai编程
沉尘5884 小时前
ACE-GCM加解密微信小程序
前端