echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>

        <style>
            .wrap {
                width: 100%;
                height: 400px;
                overflow: hidden;
            }
            /* #lineChart {
                width: 100%;
                height: 100%;
            } */
        </style>
    </head>
    <body>
        <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>

        <div id="lineChart" style="width: 800px; height: 600px"></div>

        <script>
            myChart = null; // 定义变量用来存放echarts实例
            xData = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; // 两个echarts公用的x轴的数据
            y1Data = [8888, 9999, 7777, 10000, 3334, 7878, 6543]; // 小件货物
            y2Data = [56, 64, 32, 58, 64, 76, 81]; // 网点负荷
            y3Data = [88, 99, 77, 100, 21, 66, 95]; // 大件货物

            // 画图方法
            let drawEcharts = function () {
                myChart = echarts.init(document.getElementById('lineChart'));
                let options = {
                    color: ['#bfa', '#baf', 'pink', '#baf'], // 配置数据颜色
                    grid: [
                        // 配置第一个折线图的位置
                        {
                            left: '14.5%',
                            right: '12%',
                            top: '10%',
                            height: '32%',
                        },
                        // 配置第二个折线图位置
                        {
                            left: '14.5%',
                            right: '12%',
                            top: '50%',
                            height: '32%',
                        },
                    ],
                    tooltip: {
                        trigger: 'axis', //axis /item
                        // formatter函数动态修改tooltip样式
                        formatter: function (params) {
                            if (params) {
                                var htmlStr = '';
                                htmlStr += params[0].name.replace(/\-/g, '/') + '<br/>'; //x轴的名称
                                for (var i = 0; i < params.length; i++) {
                                    var param = params[i]; // 存一份item项
                                    var seriesName = param.seriesName; //图例名称
                                    var value = param.value; //y轴值
                                    var color = param.color; //图例颜色
                                    htmlStr += '<div>';
                                    htmlStr += '<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:' + color + ';"></span>';
                                    //圆点后面显示的文本
                                    htmlStr += seriesName + ':' + value;
                                    switch (seriesName) {
                                        case '小件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        case '网点负荷':
                                            htmlStr += ' ' + '%';
                                            break;
                                        case '大件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        default:
                                            htmlStr += ' ';
                                    }
                                    htmlStr += '</div>';
                                }
                                return htmlStr;
                            } else {
                                return;
                            }
                        },
                        backgroundColor: '#ccc',
                        borderWidth: 1,
                        borderColor: '#ccc',
                        padding: 10,
                        textStyle: {
                            color: '#000',
                            fontSize: 12,
                            align: 'left',
                        },
                        hideDelay: 10000, //延时消失时间
                    },
                    legend: {
                        show: true,
                        x: 'center',
                        y: '0',
                        data: ['小件货物', '网点负荷', '大件货物', '网点负荷'],
                        textStyle: {
                  
<think>好的,用户想在ECharts中绘制共享同一X的多条折线图。首先,我需要回忆一下ECharts的基本配置结构。通常,一个图表需要配置xAxisyAxis,然后添加多个series。 用户提到多条折线共享同一个X,所以xAxis应该设置为相同的类型数据。根据引用[2],如果没有设置type但提供了data,ECharts会默认使用'category'类型,这适合折线图的X。因此,xAxis的data可以从共同的数据源获取,比如时间序列或者类别数据。 接下来,每个折线对应一个yAxis,但用户可能希望所有折线都使用同一个X,而Y可能有多个。不过问题描述是共享同一X,可能Y可以各自独立,但用户可能更想要的是多个折线在同一个X上,Y自动适应。需要确认用户是否需要多个Y,但根据常见情况,可能只需要一个Y,多条折线共享同一个XY。 然后,每个折线作为一个series,类型为'line',并且每个series的data对应各自的数值。需要确保每个series的x索引指向同一个xAxis,默认是0,所以可能不需要特别配置。另外,如果需要堆叠效果,可能需要设置stack属性,但用户的问题里没有提到堆叠,所以暂时不考虑。 还需要注意图例的显示,可能需要配置legend的data,让每个series的name对应图例项。引用[2]提到如果没有设置type但设置了data,会自动视为category,所以X的配置应该没问题。 可能还需要调整标签显示,比如引用[4]提到的distance属性,但用户的问题可能不需要这些细节,除非用户有特殊需求。另外,引用[3]提到地理坐标的标注,但这里不涉及地图,可以忽略。 最后,生成图表后,可能需要渲染到DOM元素,并确保正确的文件输出或页面显示。用户提供的示例代码中使用了.render("三维数据折叠.html"),所以用户可能希望生成HTML文件。 总结步骤: 1. 配置xAxis为category类型,设置共同的data。 2. 配置yAxis,可能一个或多个,根据用户需求。 3. 添加多个series,每个series类型为line,使用相同的xAxisIndex(默认0)。 4. 设置legend显示各个系列的name。 5. 调整全局配置如标题、提示框等。 6. 渲染图表到HTML文件。 可能还需要检查是否有其他配置项,比如提示框的触发方式、坐标标签的旋转等,根据用户需求添加。同时,示例代码中的stack属性是否需要?用户的问题是关于共享X,而不是堆叠,所以可能不需要,但需要确认。根据用户提供的引用[1]中的示例,商家A、B、C都设置了stack="stack1",但用户的问题不涉及堆叠,所以可能在配置中去掉stack属性,除非用户需要。 现在需要将上述思考整理成结构化的步骤,并确保使用正确的中文表达,同时引用相关引用内容。例如,在提到xAxis类型时引用[2],在提到标签配置时引用[4]。</think>在ECharts中绘制共享同一X的多条折线图,可通过以下步骤实现: --- ### **步骤1:初始化基础配置** ```python from pyecharts import options as opts from pyecharts.charts import Line # 初始化折线图对象 line = Line() # 设置公共X数据(如时间序列或类别) x_data = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] line.add_xaxis(xaxis_data=x_data) # 公共X配置 ``` --- ### **步骤2:添加多条折线(Y数据)** ```python # 添加第一条折线 line.add_yaxis( series_name="销量A", y_axis=[120, 132, 101, 134, 90, 230, 210], label_opts=opts.LabelOpts(is_show=False) # 隐藏数据标签[^4] ) # 添加第二条折线 line.add_yaxis( series_name="销量B", y_axis=[220, 182, 191, 234, 290, 330, 310] ) ``` --- ### **步骤3:配置全局选项** ```python line.set_global_opts( title_opts=opts.TitleOpts(title="商品销量趋势图"), # 标题 xaxis_opts=opts.AxisOpts(type_="category"), # X类型为分类(自动推断,可省略)[^2] yaxis_opts=opts.AxisOpts(name="销量(单位:件)"), tooltip_opts=opts.TooltipOpts(trigger="axis") # 提示框以X触发 ) ``` --- ### **步骤4:生成图表文件** ```python line.render("shared_xaxis_line_chart.html") print("图表已生成!") ``` --- ### **核心逻辑说明** 1. **X共享**:所有折线共用`add_xaxis()`设置的X数据,无需单独配置。 2. **Y独立**:每条折线的Y数据通过`add_yaxis()`独立添加,默认共享同一Y(若需多Y,需额外配置`yaxis_index`)。 3. **类型推断**:未显式设置X类型时,若提供`xaxis_data`,ECharts自动识别为`category`类型[^2]。 --- ### **效果扩展** - **堆叠折线图**:在`add_yaxis()`中设置`stack="same_stack"`可实现数据堆叠[^1]。 - **多Y**:通过`extend_axis()`添加新Y,并在`add_yaxis()`中指定`yaxis_index=1`。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值