You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyplot绘制多折线图时线条拥挤的分离显示解决方案

问题描述

拥挤的折线图效果
使用pyplot绘制多序列日转化率折线图时,所有折线挤在同一绘图区域重叠严重,手动调用ylim()调整坐标轴范围没有效果,线条依然拥挤无法清晰辨认单条序列的走势。

现有实现代码

for k,i in clean_font_data.to_dict().items():
    plt.plot(list(i.keys()),list(i.values()), label = k[1],marker='o')
    
plt.legend(title="Legenda",fontsize=7)
plt.title('Conversão Diaria')
plt.xlabel('Datas',fontsize = 12)
plt.ylabel('Conversão',fontsize = 12)
plt.grid(True)
plt.show()

示例数据结构

attendance bot
['2022-06-01', '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06']
[15.9, 17.99, 17.24, 12.75, 22.89, 24.69]
解决方案

调ylim无效的核心原因是所有折线的数值区间本身高度重合,单纯缩放坐标轴范围无法解决线条重叠问题,根据你的使用场景选下面任意一种方案即可:

  • 方案1:分面子图(最清晰,适合报告/静态输出)
    为每条折线单独创建垂直排列的子图,共享x轴避免日期重复标注,完全不会有线条重叠,每个序列的波动细节都能清晰展示。

    import matplotlib.pyplot as plt
    import numpy as np
    
    plot_dict = clean_font_data.to_dict()
    seq_num = len(plot_dict)
    # 按序列数量设置画布高度,每个子图高3英寸
    fig, axes = plt.subplots(
        nrows=seq_num, ncols=1, 
        figsize=(10, 3*seq_num), 
        sharex=True
    )
    # 兼容单序列场景
    if seq_num == 1:
        axes = [axes]
    
    for ax, (meta, data) in zip(axes, plot_dict.items()):
        x = list(data.keys())
        y = list(data.values())
        ax.plot(x, y, label=meta[1], marker='o', linewidth=1.5)
        ax.set_ylabel('Conversão', fontsize=9)
        ax.grid(True, alpha=0.3)
        ax.set_title(meta[1], loc='left', fontsize=9)
    
    fig.suptitle('Conversão Diaria', y=0.95, fontsize=14)
    fig.text(0.5, 0.04, 'Datas', ha='center', fontsize=12)
    plt.tight_layout()
    plt.show()
    
  • 方案2:偏移错位山脊图(保留单画布,适合趋势对比)
    如果不想拆分为多个子图,可以给每条折线的y值加固定垂直偏移,把所有线条上下错开,类似山脊图效果,既保留单画布的整体感,又不会出现线条拥挤重叠。注意这个方法需要替换y轴刻度,避免数值误读。

    import matplotlib.pyplot as plt
    import numpy as np
    
    plot_dict = clean_font_data.to_dict()
    offset = 30  # 根据自身数据范围调整,保证相邻线条不重叠即可
    plt.figure(figsize=(12,7))
    tick_pos = []
    tick_labels = []
    
    for idx, (meta, data) in enumerate(plot_dict.items()):
        x = list(data.keys())
        y_raw = list(data.values())
        # 给当前序列加固定垂直偏移
        y = [val + idx*offset for val in y_raw]
        plt.plot(x, y, label=meta[1], marker='o', linewidth=1.2, alpha=0.8)
        # 记录当前序列的刻度位置
        tick_pos.append(idx*offset + np.mean(y_raw))
        tick_labels.append(meta[1])
    
    plt.yticks(tick_pos, tick_labels, fontsize=8)
    # 把图例放在画布外侧避免遮挡线条
    plt.legend(title="Legenda", fontsize=7, bbox_to_anchor=(1.02, 1), loc='upper left')
    plt.title('Conversão Diaria')
    plt.xlabel('Datas', fontsize=12)
    plt.grid(True, axis='x', alpha=0.3)
    plt.tight_layout()
    plt.show()
    
  • 方案3:交互式勾选显示(适合本地分析场景)
    如果序列数量非常多,可以加复选框组件,默认只显示1-2条重点折线,需要看其他序列时手动勾选即可,从根源上避免大量线条同时显示造成的拥挤。

内容的提问来源于stack exchange,提问作者INGl0R1AM0R1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:42:30