当前位置:首页>python>用Python做科研级画图——图例与刻度:让图“少而清楚”

用Python做科研级画图——图例与刻度:让图“少而清楚”

  • 2026-10-08 01:49:14
用Python做科研级画图——图例与刻度:让图“少而清楚”

大家好,我是你们的小帅学长。

你一定有过这种经历:数据很扎实、模型很漂亮、图也画出来了,但把图贴到论文/汇报里,总觉得“乱”“挤”“看不懂”。

很多人第一反应是 再换个配色、再加个阴影、再把线条调细一点。

但真正的答案通常更简单:图之所以乱,是因为你把“所有信息”都交给读者自己筛选了;而专业图的核心,是你替读者做筛选,让图变得“少而清楚”。

这一篇我们专门讲两件事:

一是图例怎么放、放多少、怎么写才不打扰阅读;

二是刻度怎么简化、怎么控制密度,才能让读者一眼抓住趋势。

01.图例和刻度不是“附属品”,它们决定读图成本

你可以这样理解:

图例解决“这条线/这个点是谁?”

刻度解决“它大概是多少?变化到什么范围?”

如果图例太吵、刻度太密,读者的注意力就会被“噪声”吃掉——最后你想强调的结论反而看不见。

02.图例:少放、放对、写短

1)图例最常见的 3 个错误

图例信息重复:标题、注释、图例三处都在解释同一件事

图例堆得像菜单:十几条线,每条都放进图例,直接劝退读者

图例位置遮挡数据:图例压住关键趋势,读者看不到重点

2)三条“减法规则”

规则1:能不放图例就不放

如果只有一条线、或者颜色含义写在标题/注释里,图例可以删掉。

规则2:图例只放“必须区分”的对象

多条线里,读者真正需要区分的通常只有 2–5 条。

其它辅助线可以淡化(浅色/虚线)甚至不放在图例中。

规则3:图例文字越短越高级

用 “Model A / Model B” 比 “Results of model A under…” 更清晰。

把长解释放到图注/正文,别塞进图例中。

03.图例怎么放才不碍事?

下面是科研图里最常见、也最稳的四种:

空白区:如果图里有天然空白角落,放在空白区最舒服

图外:当图里很满,legend 放图外(右侧/上方)最清爽

多子图统一图例:不要每个子图都放一套 legend

用直接标注替代图例:在曲线末端直接写名称

经验:当线条不多时,直接标注经常比 legend 更高级。

04.刻度:刻度不是越多越严谨,越多越像噪声

1)刻度密度的“读图成本”

刻度过密会导致两件事:

读者不断低头读数字,反而看不到趋势;

字符拥挤,整体观感变差。

你要的刻度效果是:

读者不用逐个读刻度,也能大致判断量级与变化范围。

2)三条刻度控制原则

原则1:刻度数量控制在 4–7 个最舒服

太多像表格,太少又没尺度感。

原则2:刻度标签不必全显示

隐藏一部分标签,保留关键节点(起点、终点、中间几个)。

原则3:刻度格式统一

例如,统一保留 1 位小数,别一会儿 0.1 一会儿 0.12345。

05.直接上手:一份“少而清楚”的模板

下面给你一段可复制模板

import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfrom matplotlib.ticker import MaxNLocator, FormatStrFormatter# == 字体:英文 ==fm.fontManager.addfont(r"C:\Windows\Fonts\times.ttf")fm.fontManager.addfont(r"C:\Windows\Fonts\simsun.ttc")mpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# == 数据 ==x = np.linspace(0, 10, 80)y1 = np.sin(x)y2 = np.sin(x) + 0.2y3 = np.sin(x) - 0.2# 假装是“辅助曲线” fig, ax = plt.subplots(figsize=(6, 4))# 主线:进入图例ax.plot(x, y1, linewidth=2, label="Model A / 模型A")ax.plot(x, y2, linewidth=2, label="Model B / 模型B")# 辅助线:不进图例ax.plot(x, y3, linewidth=1.2, alpha=0.35, label="_nolegend_")ax.set_title("图例与刻度示例:少而清楚", fontsize=14)ax.set_xlabel("Time (day) / 时间(天)", fontsize=12)ax.set_ylabel("Value / 数值", fontsize=12)# == 刻度:控制数量 + 统一格式 ==ax.xaxis.set_major_locator(MaxNLocator(nbins=6))# 目标 4-7 个刻度ax.yaxis.set_major_locator(MaxNLocator(nbins=6))ax.yaxis.set_major_formatter(FormatStrFormatter("%.1f"))# 统一 1 位小数 ax.grid(alpha=0.25)# ===== 图例:放图外(不遮挡曲线)=====ax.legend(    loc="upperleft",  bbox_to_anchor=(1.02, 1.0),# 图外右侧    borderaxespad=0.0,    frameon=False)fig.savefig(os.path.join(OUT_DIR, "legend_ticks_clean.jpg"), dpi=300, bbox_inches="tight")plt.close(fig)

专业图的核心不是“加”,而是“减”——图例只保留必须区分的对象,刻度只保留足够表达尺度的信息,让结论自己站出来。

下一篇我会在“减法”之后讲“加法的正确姿势”:《标注与强调:箭头/框/高亮怎么用》。当你把图做得干净以后,下一步就是用最克制的标注,把审稿人/读者的视线精准引到你最想强调的那一处。

——期待你的关注—— 

往期内容:

用Python做科研级画图——配色与色带:连续离散怎么选

用Python做科研级画图——统一风格:rcParams一键设置

最新文章

随机文章