大家好,我是你们的小帅学长。
你一定有过这种经历:数据很扎实、模型很漂亮、图也画出来了,但把图贴到论文/汇报里,总觉得“乱”“挤”“看不懂”。
很多人第一反应是 再换个配色、再加个阴影、再把线条调细一点。
但真正的答案通常更简单:图之所以乱,是因为你把“所有信息”都交给读者自己筛选了;而专业图的核心,是你替读者做筛选,让图变得“少而清楚”。
这一篇我们专门讲两件事:
一是图例怎么放、放多少、怎么写才不打扰阅读;
二是刻度怎么简化、怎么控制密度,才能让读者一眼抓住趋势。
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一键设置