Matplotlib 第四章 文字图例尽眉目
一、Figure和Axes上的文本Matplotlib 提供了两套 API 用于添加文本功能完全对应仅调用方式不同表格pyplot APIOO API功能描述textAxes.text()在Axes子图的任意坐标位置添加文本titleAxes.set_title()为 Axes 添加标题figtextFigure.text()在Figure画布的任意位置添加文本不依赖子图坐标suptitleFigure.suptitle()为整个 Figure 添加总标题xlabelAxes.set_xlabel()为 Axes 的 X 轴添加标签ylabelAxes.set_ylabel()为 Axes 的 Y 轴添加标签annotateAxes.annotate()向 Axes 添加带可选箭头的标注常用于标注数据点二、核心函数text()详解1. 函数定义pyplot APImatplotlib.pyplot.text(x, y, s, fontdictNone, **kwargs)OO APIAxes.text(self, x, y, s, fontdictNone, **kwargs)2. 核心参数表格参数说明x, y文本放置的坐标基于 Axes 的数据坐标系s要添加的文本内容支持 LaTeX 数学公式fontdict可选字典用于批量覆盖默认文本样式如字体、颜色、大小等**kwargs单独指定的样式参数优先级高于fontdict3.fontdict常用样式参数表格参数说明可选值 / 示例family字体类型SimSun华文宋体、Times New Roman、serif、sans-serif等color/c字体颜色red、blue、purple、navy等weight/fontweight字体粗细normal、bold、light等size/fontsize字体大小数值如16、large、x-large等alpha透明度0完全透明~ 1完全不透明backgroundcolor文本背景色同字体颜色可选值rotation旋转角度数值逆时针、vertical90°、horizontal0°ha/horizontalalignment水平对齐left、center、rightva/verticalalignment垂直对齐top、center、bottom、baselinebbox文本外框字典如{boxstyle:round, facecolor:#fff, alpha:0.8}三、完整实战代码可直接运行python运行import numpy as np import matplotlib.pyplot as plt # ---------------------- 1. 定义4种字体样式 ---------------------- # 样式1华文宋体、紫色、16号、0.7透明度 font1 { family: SimSun, alpha: 0.7, color: purple, weight: normal, size: 16 } # 样式2Times New Roman、红色、16号 font2 { family: Times New Roman, color: red, weight: normal, size: 16 } # 样式3衬线字体、蓝色、加粗、14号 font3 { family: serif, color: blue, weight: bold, size: 14 } # 样式4Calibri、藏青色、17号 font4 { family: Calibri, color: navy, weight: normal, size: 17 } # ---------------------- 2. 生成数据并绘图 ---------------------- # 定义衰减震荡函数y cos(2πx) * exp(-x/3) x np.linspace(0.0, 5.0, 100) y np.cos(2 * np.pi * x) * np.exp(-x/3) # 绘制虚线曲线 plt.plot(x, y, --) # ---------------------- 3. 添加各类文本标注 ---------------------- # 1. 子图标题 plt.title(震荡曲线, fontdictfont1) # 2. 在坐标(2, 0.65)处添加数学公式LaTeX语法 plt.text(2, 0.65, r$\cos(2 \pi x) \exp(-x/3)$, fontdictfont2) # 3. X轴标签 plt.xlabel(Ytime (s), fontdictfont3) # 4. Y轴标签 plt.ylabel(Xvoltage(mv), fontdictfont4) # ---------------------- 4. 调整布局并显示 ---------------------- # 调整左侧边距避免Y轴标签被截断 plt.subplots_adjust(left0.15) plt.show()四、运行效果解读代码运行后生成的图表包含以下关键元素标题震荡曲线紫色华文宋体位于图表顶部数学公式标注cos(2πx)exp(-x/3)红色 Times New Roman标注在曲线旁坐标轴标签X 轴Ytime (s)蓝色加粗衬线字体Y 轴Xvoltage(mv)藏青色 Calibri 字体曲线蓝色虚线呈现衰减震荡的形态振幅随 x 增大逐渐减小五、关键知识点拓展1. LaTeX 数学公式支持Matplotlib 原生支持 LaTeX 语法只需用r$...$包裹公式即可渲染例如r$\alpha$→ αr$\sqrt{x^2y^2}$→ √(x²y²)r$\sum_{i1}^{n} x_i$→ ∑(i1 到 n) x_i2. 坐标系说明text()默认使用数据坐标系即x,y对应图表的数值坐标若要使用相对坐标系0-1基于 Axes/Figure 的比例可添加参数transformax.transAxesAxes 相对坐标transformfig.transFigureFigure 相对坐标3. 中文显示问题若运行代码出现中文乱码需在代码开头添加以下配置python运行plt.rcParams[font.sans-serif] [SimSun] # 替换为你的中文字体 plt.rcParams[axes.unicode_minus] False # 解决负号显示异常六、常见使用场景表格场景推荐 API示例子图标题title()/set_title()plt.title(实验数据, fontsize18)数据点标注annotate()plt.annotate(峰值, xy(1, 1), xytext(1.2, 1.2), arrowpropsdict(arrowstyle-))画布总标题suptitle()plt.suptitle(2025年实验报告, y0.98)任意位置文本text()/figtext()plt.figtext(0.5, 0.02, 数据来源实验室, hacenter)七、可直接修改的参数建议你可以直接修改代码中的以下部分快速调整样式修改字体替换fontdict中的family值如Microsoft YaHei、Arial修改颜色替换color值支持英文、十六进制如#FF5733、RGB 元组修改公式位置调整plt.text()的x,y坐标添加外框在fontdict中添加bbox: {facecolor:yellow, alpha:0.3}旋转文本添加rotation: 45实现 45° 逆时针旋转如果你需要我可以帮你补充annotate()箭头标注的详细用法或者优化图表的配色、布局生成更符合论文 / 报告规范的样式。Matplotlib 标题 / 坐标轴标签 / 画布文本全解析附完整代码这组资料承接上一节详细讲解了 Matplotlib 中子图标题、画布文本、总标题、坐标轴标签的用法包含两种 API、核心参数、实战案例与效果展示下面是结构化梳理与深度解读。一、核心 API 速查表表格功能pyplot APIOO API作用域核心特点子图标题plt.title()Axes.set_title()单个 Axes子图仅作用于当前子图可控制位置、边距画布任意文本plt.figtext()Figure.text()整个 Figure画布基于画布相对坐标 (0-1)不依赖子图画布总标题plt.suptitle()Figure.suptitle()整个 Figure画布专为总标题设计默认居中置顶X 轴标签plt.xlabel()Axes.set_xlabel()单个 Axes子图绑定 X 轴可控制与轴的距离、对齐方式Y 轴标签plt.ylabel()Axes.set_ylabel()单个 Axes子图绑定 Y 轴可控制与轴的距离、对齐方式二、各函数详细参数与用法1.title()/set_title()子图标题函数定义pyplot APImatplotlib.pyplot.title(label, fontdictNone, locNone, padNone, *, yNone, **kwargs)OO APIAxes.set_title(self, label, fontdictNone, locNone, padNone, *, yNone, **kwargs)核心参数表格参数说明默认值label标题文本内容-fontdict控制标题样式的字典字体、颜色、大小等内置默认样式继承 rcParamsloc水平对齐方式center可选left/rightpad标题与子图顶部的距离单位点6y标题在子图内的垂直位置相对坐标 0-11紧贴子图顶部**kwargs额外文本样式如rotation、backgroundcolor等-默认fontdict样式python运行{ fontsize: rcParams[axes.titlesize], fontweight: rcParams[axes.titleweight], color: rcParams[axes.titlecolor], verticalalignment: baseline, horizontalalignment: loc }2.figtext()/Figure.text()画布任意位置文本函数定义pyplot APImatplotlib.pyplot.figtext(x, y, s, fontdictNone, **kwargs)OO APIFigure.text(self, x, y, s, fontdictNone, **kwargs)核心参数表格参数说明x, y文本在画布上的位置默认使用画布相对坐标 (0-1)0 左 / 下1 右 / 上s要添加的文本内容fontdict文本样式字典**kwargs额外样式如transform可切换坐标系关键特性坐标默认是画布相对坐标不受子图位置影响适合添加水印、署名、全局说明等。可通过transformax.transAxes切换为子图相对坐标或transformax.transData切换为数据坐标。3.suptitle()画布总标题函数定义pyplot APImatplotlib.pyplot.suptitle(t, **kwargs)OO APIFigure.suptitle(self, t, **kwargs)核心参数表格参数说明默认值t总标题文本-x, y画布相对坐标x0.5水平居中y0.95靠近画布顶部ha/horizontalalignment水平对齐centerva/verticalalignment垂直对齐topfontsize/size字体大小large继承 rcParamsfontweight/weight字体粗细normal适用场景多子图图表的全局总标题统一整个画布的主题。4.xlabel()/ylabel()坐标轴标签函数定义pyplot APImatplotlib.pyplot.xlabel(xlabel, fontdictNone, labelpadNone, *, locNone, **kwargs)matplotlib.pyplot.ylabel(ylabel, fontdictNone, labelpadNone, *, locNone, **kwargs)OO APIAxes.set_xlabel(self, xlabel, fontdictNone, labelpadNone, *, locNone, **kwargs)Axes.set_ylabel(self, ylabel, fontdictNone, labelpadNone, *, locNone, **kwargs)核心参数表格参数说明默认值xlabel/ylabel坐标轴标签文本-fontdict标签样式字典-labelpad标签与坐标轴的距离单位点继承 rcParamsloc标签在轴上的位置center可选left/right**kwargs额外样式如rotation、fontproperties等-三、完整实战代码两种样式设置方式资料中给出了两种字体样式设置方法**kwargs直接传参、FontProperties对象配置以下是完整可运行代码python运行import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties # ---------------------- 1. 生成衰减震荡数据 ---------------------- x1 np.linspace(0.0, 5.0, 100) y1 np.cos(2 * np.pi * x1) * np.exp(-x1) # 衰减余弦函数 # ---------------------- 2. 用FontProperties配置Y轴标签样式 ---------------------- font FontProperties() font.set_family(serif) # 衬线字体 font.set_name(Times New Roman) # 具体字体 font.set_style(italic) # 斜体 font.set_size(14) # 字号 font.set_weight(bold) # 加粗 # ---------------------- 3. 创建画布与子图 ---------------------- fig, ax plt.subplots(figsize(5, 3)) # 调整底部和左侧边距避免标签被截断 fig.subplots_adjust(bottom0.15, left0.2) # ---------------------- 4. 绘制曲线 ---------------------- ax.plot(x1, y1) # ---------------------- 5. 添加坐标轴标签两种方式 ---------------------- # 方式1**kwargs直接传参X轴标签 ax.set_xlabel(time [s], fontsizelarge, fontweightbold, color#000000) # 方式2FontProperties对象配置Y轴标签 ax.set_ylabel(Damped oscillation [V], fontpropertiesfont) # ---------------------- 6. 可选添加子图标题、总标题、画布文本 ---------------------- # 子图标题 ax.set_title(Damped Oscillation Curve, loccenter, pad10, fontsize12) # 画布总标题 fig.suptitle(Experiment Data Report, y0.98, fontsize14, fontweightbold) # 画布底部添加署名相对坐标 plt.figtext(0.5, 0.01, Data Source: Lab Test, hacenter, fontsize10, colorgray) # ---------------------- 7. 显示图表 ---------------------- plt.show()四、运行效果解读代码运行后生成的图表包含以下关键元素曲线蓝色衰减震荡曲线振幅随时间x 轴增大逐渐减小符合cos(2πx)·exp(-x)的数学特性。X 轴标签time [s]采用**kwargs方式设置为大号加粗字体位于 X 轴底部居中。Y 轴标签Damped oscillation [V]采用FontProperties方式设置为Times New Roman 斜体衬线字体垂直显示在 Y 轴左侧。可选标题与署名子图标题、全局总标题、画布底部署名层级清晰符合学术图表规范。五、关键知识点拓展1. 两种字体样式设置方式对比表格方式适用场景优点缺点**kwargs直接传参简单样式、临时修改代码简洁、直观样式复用性差复杂样式代码冗余FontProperties对象复杂样式、多标签复用样式统一、可复用、配置灵活需额外创建对象代码稍长2. 中文显示问题解决方案若运行代码出现中文乱码在代码开头添加以下配置python运行# 解决中文乱码 plt.rcParams[font.sans-serif] [SimSun, Microsoft YaHei] # 解决负号显示异常 plt.rcParams[axes.unicode_minus] False3. 坐标系统说明表格坐标系适用 API坐标范围特点数据坐标ax.text()与图表数据范围一致随缩放、平移变化子图相对坐标ax.text(transformax.transAxes)0-1子图左下角为原点固定在子图内不随数据缩放变化画布相对坐标plt.figtext()0-1画布左下角为原点固定在画布上不受子图位置影响4. 常见样式优化技巧调整标签边距通过labelpad坐标轴标签、pad标题避免标签与轴 / 刻度重叠。旋转标签给xlabel/ylabel添加rotation45实现标签斜向显示适合长文本。添加背景色给标题 / 标签添加backgroundcolor#f0f0f0突出文本。多子图总标题用suptitle()统一多子图图表的主题避免每个子图重复标题。六、常见使用场景示例1. 多子图添加总标题python运行fig, (ax1, ax2) plt.subplots(2, 1, figsize(6, 8)) # 绘制子图... fig.suptitle(2025 Annual Sales Report, y0.99, fontsize16, fontweightbold)2. 画布添加水印python运行plt.figtext(0.5, 0.5, Confidential, hacenter, vacenter, fontsize50, colorgray, alpha0.2, rotation30)3. 坐标轴标签斜向显示python运行ax.set_xlabel(Long Label Name, rotation30, haright) # 右对齐避免重叠annotate标注全解析附完整可运行代码这组资料系统讲解了 Matplotlib 中最强大的标注工具annotate()涵盖两种 API、坐标系、箭头样式、连接样式、实战案例下面是结构化梳理与深度解读。一、核心函数定义annotate()用于在图表中添加带箭头的文本标注支持 pyplot 和面向对象OO两种调用方式pyplot APImatplotlib.pyplot.annotate(text, xy, *args, **kwargs)OO APIAxes.annotate(self, text, xy, *args, **kwargs)二、核心参数详解1. 基础位置参数表格参数说明text标注的文本内容strxy被标注点的坐标格式为(float, float)坐标系由xycoords决定xytext标注文本的坐标格式为(float, float)默认与xy相同2. 坐标系参数xycoords/textcoords这是annotate最核心的特性支持多种坐标系灵活控制标注位置xycoords被标注点的坐标系表格属性值含义data默认值以数据坐标为参考与图表刻度一致figure points以绘图区左下角为参考单位是点数figure pixels以绘图区左下角为参考单位是像素数figure fraction以绘图区左下角为参考单位是百分比0-1axes points以子绘图区左下角为参考单位是点数axes pixels以子绘图区左下角为参考单位是像素数axes fraction以子绘图区左下角为参考单位是百分比0-1polar使用极坐标系textcoords标注文本的坐标系除支持上述所有值外额外增加 2 种偏移坐标系表格属性值含义offset points相对于被注释点xy的偏移量单位是点offset pixels相对于被注释点xy的偏移量单位是像素3. 箭头样式参数arrowpropsarrowprops是字典类型用于控制箭头的样式、颜色、连接方式等是annotate的灵魂参数。基础箭头参数未设置arrowstyle时可用表格关键字说明width箭身的宽度单位点headwidth箭头头部的宽度点headlength箭头头部的长度点shrink箭头两端收缩的百分比占总长箭头样式arrowstyle设置arrowstyle后上述基础参数失效可直接使用预设样式常用样式如下表格箭头样式默认参数效果-None无箭头直线-head_length0.4, head_width0.2标准右箭头-head_length0.4, head_width0.2标准左箭头-head_length0.4, head_width0.2双向箭头fancyhead_length0.4, head_width0.4, tail_width0.4fancy 箭头simplehead_length0.5, head_width0.5, tail_width0.2简单箭头wedgetail_width0.3, shrink_factor0.5楔形箭头FancyArrowPatch高级参数表格关键字说明connectionstyle连接线的样式控制箭头路径的弯曲relpos箭头起点相对文本的位置默认(0.5, 0.5)文本中心patchA/patchB箭头起点 / 终点绑定的图形对象shrinkA/shrinkB箭头起点 / 终点的缩进点数默认 2mutation_scale箭头大小缩放比例默认文本尺寸4. 连接线样式connectionstyle用于控制箭头从文本到标注点的路径形状核心样式如下表格名称默认参数说明angleangleA90, angleB0, rad0.0折线连接可设置两个角度angle3angleA90, angleB0二次样条折线3 个控制点arcangleA0, angleB0, rad0.0圆弧连接arc3rad0.0二次样条圆弧3 个控制点最常用bararmA0.0, armB0.0, fraction0.3直角折线连接angle3和arc3中的3代表路径由 3 个控制点生成是平滑的二次曲线。三、完整实战代码含多种场景1. 基础标注衰减震荡曲线标注python运行import numpy as np import matplotlib.pyplot as plt # 生成衰减震荡数据 x np.arange(0, 10, 0.005) y np.exp(-x/2.) * np.sin(2*np.pi*x) fig, ax plt.subplots(figsize(8, 4)) ax.plot(x, y) ax.set_xlim(0, 10) ax.set_ylim(-1, 1) # 标注点坐标 (5, 0) xdata, ydata 5, 0 # 转换为屏幕像素坐标 xdisplay, ydisplay ax.transData.transform_point((xdata, ydata)) # 文本框样式 bbox dict(boxstyleround, fc0.8) # 箭头样式- 箭头angle 连接 arrowprops dict( arrowstyle -, connectionstyle angle,angleA0,angleB90,rad10) offset 72 # 数据坐标标注相对偏移 ax.annotate( fdata ({xdata:.1f}, {ydata:.1f}), (xdata, ydata), xytext(-2*offset, offset), textcoordsoffset points, bboxbbox, arrowpropsarrowprops ) # 屏幕像素坐标标注 ax.annotate( fdisplay ({xdisplay:.1f}, {ydisplay:.1f}), xy(xdisplay, ydisplay), xycoordsfigure pixels, xytext(0.5*offset, -offset), textcoordsoffset points, bboxbbox, arrowpropsarrowprops ) plt.tight_layout() plt.show()2. 极坐标标注螺旋曲线标注python运行import numpy as np import matplotlib.pyplot as plt # 创建极坐标子图 fig plt.figure(figsize(6, 6)) ax fig.add_subplot(111, polarTrue) # 生成螺旋曲线数据 r np.arange(0, 1, 0.001) theta 2 * 2*np.pi * r line, ax.plot(theta, r, color#ee8d18, lw3) # 选择索引800的点进行标注 ind 800 thisr, thistheta r[ind], theta[ind] ax.plot([thistheta], [thisr], o) # 添加标注 ax.annotate( a polar annotation, xy(thistheta, thisr), # 极坐标(角度, 半径) xytext(0.05, 0.05), # 文本位置画布百分比坐标 textcoordsfigure fraction, arrowpropsdict(facecolorblack, shrink0.05), horizontalalignmentleft, verticalalignmentbottom ) plt.tight_layout() plt.show()3. 箭头样式与连接样式演示python运行import matplotlib.pyplot as plt import matplotlib.patches as mpatches # 定义演示函数 def demo_con_style(ax, connectionstyle): x1, y1 0.3, 0.2 x2, y2 0.8, 0.6 ax.plot([x1, x2], [y1, y2], .) ax.annotate( , xy(x1, y1), xycoordsdata, xytext(x2, y2), textcoordsdata, arrowpropsdict( arrowstyle-, color0.5, shrinkA5, shrinkB5, patchANone, patchBNone, connectionstyleconnectionstyle, ), ) ax.text(.05, .95, connectionstyle.replace(,, ,\n), transformax.transAxes, haleft, vatop) # 创建3行5列子图 fig, axs plt.subplots(3, 5, figsize(8, 4.8)) # 演示不同连接样式 demo_con_style(axs[0, 0], angle3,angleA90,angleB0) demo_con_style(axs[1, 0], angle3,angleA0,angleB90) demo_con_style(axs[0, 1], arc3,rad0.) demo_con_style(axs[1, 1], arc3,rad0.3) demo_con_style(axs[2, 1], arc3,rad-0.3) demo_con_style(axs[0, 2], angle,angleA-90,angleB180,rad0) demo_con_style(axs[1, 2], angle,angleA-90,angleB180,rad5) demo_con_style(axs[2, 2], angle,angleA-90,angleB10,rad5) demo_con_style(axs[0, 3], arc,angleA-90,angleB0,armA30,armB30,rad0) demo_con_style(axs[1, 3], arc,angleA-90,angleB0,armA30,armB30,rad5) demo_con_style(axs[2, 3], arc,angleA-90,angleB0,armA0,armB40,rad0) demo_con_style(axs[0, 4], bar,fraction0.3) demo_con_style(axs[1, 4], bar,fraction-0.3) demo_con_style(axs[2, 4], bar,angle180,fraction-0.2) # 统一设置子图 for ax in axs.flat: ax.set(xlim(0, 1), ylim(0, 1), xticks[], yticks[], aspect1) fig.tight_layout(pad0.2) plt.show()四、运行效果解读1. 基础标注效果标注点(5, 0)处添加了两个标注数据坐标标注基于图表刻度相对偏移定位带圆角文本框和箭头。屏幕像素标注基于画布像素固定位置不受图表缩放影响。箭头采用angle连接样式实现直角转折清晰指向标注点。2. 极坐标标注效果螺旋曲线的指定点索引 800添加标注文本固定在画布左下角5% 位置。箭头自动适配极坐标系准确指向目标点两端缩进 5% 避免遮挡。3. 连接样式效果15 种不同的连接样式直观展示了angle/angle3/arc/arc3/bar等样式的差异。可通过调整rad弧度、angleA/angleB角度等参数自定义箭头路径的弯曲程度。五、关键知识点拓展1. 坐标系选择指南表格场景推荐坐标系说明标注数据点data与数据刻度绑定缩放图表时标注自动跟随固定位置标注figure fraction基于画布百分比不受子图位置、缩放影响相对偏移标注offset points相对于标注点偏移适合批量标注极坐标标注polar自动适配极坐标系统2. 箭头样式最佳实践学术图表推荐arrowstyle-connectionstylearc3,rad0.2简洁清晰。复杂标注使用arrowstylefancy搭配mutation_scale调整大小突出重点。避免遮挡设置shrinkA/shrinkB让箭头两端缩进不遮挡文本和数据点。3. 中文显示问题若标注出现中文乱码在代码开头添加python运行plt.rcParams[font.sans-serif] [SimSun, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False4. 标注裁剪控制annotation_clip参数控制标注是否裁剪True仅当标注点在子图内时显示标注默认xycoordsdata时生效。False无论标注点位置始终显示标注。