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
相关产品推荐
相关产品推荐

