大家好,我是你们的小帅学长。
你有没有这种瞬间崩溃的时刻:当折线从 2 条变成 8 条,你的图突然变成一锅面。
你明明想表达“某条线更好”“某个范围更稳定”,但读者看到的只有:线交织、颜色打架、图例像菜单,最后一句评价是:“这张图信息很多,但我看不出来重点。”
这不是你数据的问题,而是你没有建立“视觉层级”。
多条线不乱的核心不是“多漂亮”,而是主线要突出,辅线要退后;读者不需要看完每条线,只需要看到你要他看到的那条。
这一篇我会给你一套非常可执行的策略:
排序:先画谁、后画谁,决定谁站在上面
透明度:把“背景线”变成背景
标注:用最少文字替代拥挤的图例
01.第一性原则:多线图 = “一个主角 + 一群配角”
先把这句话记住:
一张图里能当主角的线通常只有 1–2 条。
你想强调某模型 → 它是主角
你想强调平均趋势 → 均值是主角,个体是配角
你想强调最优/最差 → 边界线是主角,其余是背景
如果你把每条线都当主角,结果就是:没有主角。
02.排序策略:先画背景,再画主角(图层顺序决定阅读顺序)
多线图最简单的“视觉层级”做法:
先画背景线(透明度低、线宽细、颜色中性)
最后画主线(线宽更粗、透明度高、必要时加 marker)
03.透明度策略:把“个体曲线”变成纹理,让主线成为信息
当你有很多条个体曲线(比如多个样本、多个站点、多个模型版本),你其实不希望读者/审稿人逐条看完,你只希望读者/审稿人感受到“波动范围”。
所以背景线通常这样处理就够了:
alpha = 0.1 ~ 0.3linewidth = 0.8 ~ 1.2
不进 legend(label="_nolegend_")而主线:
alpha = 1.0linewidth = 2.2 ~ 3.0
进 legend 或直接标注
04.标注策略:多线图最容易乱的是图例
图例一旦超过 6 条,就很容易变成“菜单”,读者注意力被图例吃掉。
这里有三种从易到难、从稳到高级的方案:
方案 1:只给主线做图例,其余不进 legend
适合:你有 10 条背景线,但只强调 1–2 条主线。
方案2:线尾直接标注,干掉图例
适合:2–5 条主线对比。
方案3:把图例放到图外 + 分组命名
适合:确实需要展示多个系列,但仍要避免遮挡数据。
05.直接上手:多线不乱模板(背景线 + 主线 + 线尾标注)
下面是一份你可以直接复用的“多线图论文模板”:
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter# == 字体 ==win_fonts = r"C:\Windows\Fonts"for p in [ os.path.join(win_fonts, "times.ttf"), os.path.join(win_fonts, "timesbd.ttf"), os.path.join(win_fonts, "timesi.ttf"), os.path.join(win_fonts, "simsun.ttc"),]: if os.path.exists(p): try: fm.fontManager.addfont(p) except Exception: passmpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = False OUT_DIR = r"D:\py_figs "os.makedirs(OUT_DIR, exist_ok=True)# == 数据:多条背景线 + 一条主线 ==rng = np.random.default_rng(7)x = np.linspace(0, 10, 160)n_bg = 20ys_bg = []for i in range(n_bg): noise= 0.08 * rng.standard_normal(len(x)) y = 0.9 * np.sin(x) + noise + rng.normal(0, 0.05) ys_bg.append(y)y_main = np.mean(np.vstack(ys_bg), axis=0)# 主线:均值(示例) fig, ax = plt.subplots(figsize=(6.8, 3.6)) for y in ys_bg: ax.plot(x, y, linewidth=1.0, alpha=0.18, label="_nolegend_") ax.plot(x, y_main, linewidth=2.8, alpha=1.0, label="_nolegend_") ax.text( x[-1] + 0.15, y_main[-1], "Mean / 均值", fontsize=12, va="center")ax.set_title("多条线不乱:背景表示波动范围,主线表达整体趋势", fontsize=14)ax.set_xlabel("Time (day) / 时间(天)", fontsize=12)ax.set_ylabel("Value / 数值", fontsize=12)# 5) 刻度:少而清楚ax.xaxis.set_major_locator(MaxNLocator(nbins=6))ax.yaxis.set_major_locator(MaxNLocator(nbins=6))ax.yaxis.set_major_formatter(FormatStrFormatter("%.2f"))ax.grid(alpha=0.25)ax.set_xlim(x.min(), x.max() + 1.0)out_path = os.path.join(OUT_DIR, "multi_line_clean.jpg")fig.savefig(out_path, dpi=300, bbox_inches="tight", pad_inches=0.05)plt.close(fig)print("Saved:", out_path)

06.个人一些心得总结
当多条线画不清楚时,你按这个顺序处理:
①先决定主角是谁(1–2 条)
②背景线透明度降到 0.1–0.3
③背景线不进图例
④主线线宽加粗、最后绘制
⑤能线尾标注就线尾标注(少而清楚)
⑥刻度做减法,图例做减法
多条线不乱的关键不是“多配几种颜色”,而是建立视觉层级——背景线淡化成纹理,主线最后压上来并做简短标注,读者/审稿人自然一眼抓住你要表达的趋势。
下一篇我将把“多线图”的表达再往前推一步,讲更科研、也更常被审稿人看重的内容:《不确定性表达:fill_between 置信区间带》。当你不只想展示一条曲线,而是想告诉读者/审稿人“这条曲线有多稳、波动范围多大”,置信区间带就是最标准也最清晰的语言。
#Python入门 #作图技巧 #折线图
——期待你的关注——
往期内容:
用Python做科研级画图——折线图基础模板
用Python做科研级画图——论文级排版检查清单(Checklist)