尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Matplotlib科研绘图字体配置全攻略:解决中英混排与学术规范难题

Matplotlib科研绘图字体配置全攻略:解决中英混排与学术规范难题 1. 科研绘图字体配置的痛点与核心诉求作为一名长期和数据、图表打交道的科研工作者我深知一张图表在学术论文、报告或演示文稿中的分量。它不仅是数据的呈现更是严谨性和专业度的直接体现。而字体恰恰是这种专业感最容易被忽视却又至关重要的细节。想象一下你精心调整了配色、优化了布局结果图表中的中文是默认的宋体SimSun英文却是Arial或Helvetica这种混搭在正式的学术场景下会给人一种“半成品”或不够专业的印象。国际主流期刊和国内许多高校的学位论文模板通常都明确要求正文和图表中的中文使用宋体或仿宋英文和数字使用Times New Roman新罗马字体。这不仅是格式规范更是一种学术写作的“潜规则”。然而当我们使用Python的Matplotlib库进行科学绘图时默认的字体设置往往无法满足这个看似简单的要求。最常见的报错就是Font family [‘sans-serif‘] not found.或者findfont: Font family [‘SimSun‘] not found.。这个错误背后是操作系统字体路径、Matplotlib字体缓存、以及字体名称映射等一系列问题的交织。很多新手甚至是有一定经验的开发者都可能在这个问题上耗费大量时间反复尝试修改配置文件、下载字体却依然无法成功。因此今天我们就来彻底解决这个问题。目标非常明确在Matplotlib绘制的图表中实现中文使用宋体SimSun英文和数字使用Times New Roman。这不是一个简单的“复制粘贴”教程我会带你深入理解Matplotlib的字体管理机制从原理上明白每一步操作的意义并提供一套在不同操作系统Windows, macOS, Linux下都经过验证的、稳定可靠的解决方案。无论你是刚入门Python数据分析的研究生还是需要批量产出高质量图表的工程师这篇内容都将为你扫清障碍。2. Matplotlib字体系统深度解析为何默认设置会“找不到字体”要解决问题必须先理解问题产生的根源。Matplotlib作为一个跨平台的绘图库其字体管理逻辑需要兼顾不同操作系统的差异这本身就带来了复杂性。2.1 字体查找链从rcParams到系统字体目录当我们执行plt.plot()并设置plt.xlabel(‘中文标签‘)时Matplotlib内部发生了一系列字体查找动作。核心的配置参数是rcParams[‘font.family‘]和rcParams[‘font.sans-serif‘]。读取配置Matplotlib首先检查当前的rcParams设置。默认情况下font.family通常是‘sans-serif‘无衬线字体族而font.sans-serif是一个字体名称列表如[‘DejaVu Sans‘, ‘Bitstream Vera Sans‘, ...]。这个列表是Matplotlib内置的、跨平台可用的字体后备方案。名称解析当你在代码中指定一个具体的字体名比如‘SimSun‘宋体Matplotlib会尝试将这个逻辑名称解析为系统中实际存在的字体文件通常是.ttf或.otf文件。查找路径解析过程依赖于Matplotlib的字体管理器font_manager。它会扫描一个预定义的字体路径列表来寻找匹配的字体文件。这个列表包括Matplotlib自带的字体目录如matplotlib/mpl-data/fonts/ttf。操作系统标准的用户字体目录和系统字体目录。缓存机制为了提高性能Matplotlib会将找到的字体信息生成一个缓存文件通常是fontlist-v330.json存放在用户配置目录下如~/.matplotlib或~/.cache/matplotlib。这个缓存是许多问题的罪魁祸首。当你新安装了字体但Matplotlib仍然使用旧的缓存时就会报告“找不到字体”。2.2 跨平台差异与字体名称的“陷阱”不同操作系统对同一字体的命名和存放位置不同这是另一个大坑。Windows宋体SimSun和Times New Roman是系统自带的路径通常在C:\Windows\Fonts\。字体文件名是simsun.ttc(TrueType Collection) 和times.ttf。但Matplotlib查找时使用的是字体内部的“族名”Family Name对于宋体可能是‘SimSun‘,‘宋体‘对于Times New Roman可能是‘Times New Roman‘,‘TimesNewRoman‘。你需要确认系统内准确的族名。macOS系统自带的中文字体是苹方PingFang SCTimes New Roman通常也有。但路径在/Library/Fonts/或~/Library/Fonts/。字体文件可能是.ttc或.ttf。Linux情况最复杂。系统通常不预装中文字体和Times New Roman。你需要手动安装例如通过包管理器安装fonts-arphic-uming宋体替代和fonts-texgyre或ttf-mscorefonts-installer获取Times New Roman。字体路径分散在/usr/share/fonts/,/usr/local/share/fonts/,~/.fonts/等目录。核心矛盾Matplotlib的默认sans-serif列表里没有中文字体。当你将font.family设置为包含中文字体如‘SimSun‘的列表或者直接指定中文字体时如果Matplotlib在它的查找路径和缓存里找不到这个字体文件就会抛出Font family not found错误。注意‘sans-serif‘在这里是一个通用的字体族类别无衬线不是一个具体的字体名。错误信息Font family [‘sans-serif‘] not found有时是一种误导它实际想表达的是在当前的font.sans-serif列表或font.family设置中找不到任何一个可用的字体。根本原因还是目标字体如宋体未被正确加载。3. 一站式解决方案配置中英混排字体的完整流程下面我将以Windows系统为例详细演示从检查、配置到验证的完整流程。macOS和Linux的用户我会在关键步骤指出差异。3.1 第一步定位与确认系统中的字体文件在配置之前我们必须先知道“武器”在哪里。在Windows上打开文件资源管理器进入C:\Windows\Fonts。这是一个特殊的文件夹系统已安装的字体都在这里以“快捷方式”形式呈现。找到“宋体”和“Times New Roman”。右键点击字体选择“属性”。在“详细信息”选项卡中找到“字体名称”或“族名”。对于宋体你可能会看到SimSun或宋体对于Times New Roman通常是Times New Roman。记下这个准确的名称稍后配置要用。更可靠的方法是使用Python来探测。打开一个Python交互环境或Jupyter Notebook运行以下代码import matplotlib.font_manager as fm # 获取所有可用字体的信息 font_list fm.findSystemFonts(fontpathsNone, fontextttf) # 打印前20个字体路径看看有没有目标字体 for fpath in font_list[:20]: print(fpath) # 更精确地我们可以查找包含特定关键词的字体 simsun_fonts [f for f in font_list if simsun in f.lower()] times_fonts [f for f in font_list if times in f.lower() and new in f.lower()] print(\n找到的宋体文件, simsun_fonts) print(\n找到的Times New Roman文件, times_fonts) # 获取字体的属性 if simsun_fonts: simsun_prop fm.FontProperties(fnamesimsun_fonts[0]) print(f\n宋体族名: {simsun_prop.get_name()}) print(f宋体字体名: {simsun_prop.get_fontconfig_pattern()})这段代码能帮你确认Matplotlib“看到”的字体路径和准确的族名。在Windows上宋体文件通常是simsun.ttc路径类似C:\\Windows\\Fonts\\simsun.ttc。在macOS/Linux上方法类似使用findSystemFonts函数来搜索。在Linux上如果没找到Times New Roman你可能需要安装ttf-mscorefonts-installer包Debian/Ubuntu或liberation-fonts作为替代。3.2 第二步动态配置与静态配置两种方法配置Matplotlib字体有两种主流方式动态在代码中设置和静态修改配置文件。科研绘图推荐使用静态配置一劳永逸。方法一动态配置代码内设置在绘图脚本的开头通过rcParams字典进行设置。这种方法灵活但每个脚本都需要添加。import matplotlib.pyplot as plt import matplotlib # 关键配置步骤 plt.rcParams[font.family] sans-serif # 使用无衬线字体族作为基础 # 指定无衬线字体族优先使用的字体列表中文字体放前面 plt.rcParams[font.sans-serif] [SimSun, DejaVu Sans] # ‘SimSun‘必须是你系统里存在的族名 # 单独配置数学公式和特殊符号的字体可选但推荐 plt.rcParams[mathtext.fontset] stix # 或 ‘cm‘, 避免公式字体混乱 # 为了确保Times New Roman用于英文我们通常不直接设置‘font.family‘为它而是用另一种策略 # 或者直接设置一个复合字体属性更直接的方法见下文但是上述设置并不能完美区分中文和英文。要实现中文宋体、英文Times New Roman我们需要更精细的控制。一个常见且有效的方法是使用FontProperties对象在具体的文本元素上单独设置。import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties # 定义两种字体属性 chinese_font FontProperties(fnameC:\\Windows\\Fonts\\simsun.ttc, size12) # 指定字体文件路径 english_font FontProperties(fnameC:\\Windows\\Fonts\\times.ttf, size12) # 创建图形 fig, ax plt.subplots() x [1, 2, 3, 4] y [1, 4, 2, 3] ax.plot(x, y) # 分别设置标题、坐标轴标签的字体 # 标题中英文混合整体用中文字体Matplotlib对混合文本支持有限可能需要分开处理 ax.set_title(这是一个图表标题 This is a title, fontpropertieschinese_font) # 或者更精细地用LaTeX渲染或手动拼接复杂 ax.set_xlabel(横坐标 / X-axis, fontpropertieschinese_font) ax.set_ylabel(纵坐标 / Y-axis, fontpropertieschinese_font) # 对于纯英文的刻度标签可以尝试设置 for label in ax.get_xticklabels(): label.set_fontproperties(english_font) plt.show()这种方法非常直接但缺点也很明显代码冗长每个文本元素都要单独设置不适用于批量绘图。方法二静态配置修改matplotlibrc文件推荐这是最彻底、最推荐的方法。通过修改Matplotlib的配置文件可以全局生效所有脚本无需额外代码。找到配置文件位置import matplotlib print(matplotlib.matplotlib_fname())运行这行代码它会打印出当前使用的matplotlibrc配置文件的绝对路径。通常位于Matplotlib的安装目录下如.../site-packages/matplotlib/mpl-data/matplotlibrc。备份并编辑配置文件用文本编辑器如VS Code, Notepad打开这个文件。强烈建议先备份原文件。 在文件中搜索以下关键词并进行修改#font.family: sans-serif #font.sans-serif: DejaVu Sans, Bitstream Vera Sans, ... #axes.unicode_minus: True # 确保负号正常显示去掉注释删除行首的#并修改为font.family: sans-serif font.sans-serif: SimSun, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, ... # 将SimSun放在首位 axes.unicode_minus: False # 如果负号显示为方块可以尝试设为False使用ASCII减号但是这仍然只解决了中文字体问题英文还是用的sans-serif族里的字体。实现中英字体分离的终极配置标准的matplotlibrc文件并不直接支持为不同语言指定不同字体。我们需要一个“技巧”使用支持中文的字体作为默认字体族并确保该字体本身具有良好的英文字形。但宋体的英文部分并不好看。更优雅的方案是使用rcParams的高级设置结合自定义字体属性但这通常在代码中完成。一个折中且有效的全局方案是安装并使用一个同时包含高质量中文字体和英文字体的“复合字体”或者使用支持语言自动检测的字体回退机制。然而Matplotlib原生对此支持不完善。因此实践中最稳健的全局方案是在配置文件或代码初始化部分将默认字体设置为一个同时包含中英文且风格协调的字体。对于Windows用户Microsoft YaHei微软雅黑是一个不错的选择它中文清晰英文是无衬线体。但这不符合“中文宋体、英文Times New Roman”的严格学术要求。为了严格满足要求我们通常采用“代码初始化块”的方式。创建一个单独的Python模块如my_plot_style.py在其中进行复杂的字体配置然后在所有绘图脚本中导入它。my_plot_style.py内容示例import matplotlib.pyplot as plt from matplotlib import rcParams import matplotlib.font_manager as fm import os # 1. 清除字体缓存非常重要尤其是在首次配置或更改字体后 # 找到缓存目录 cache_dir matplotlib.get_cachedir() font_cache os.path.join(cache_dir, ‘fontlist-v330.json‘) # 版本号可能不同 if os.path.exists(font_cache): os.remove(font_cache) print(f已删除字体缓存: {font_cache}) # 2. 手动添加字体路径如果字体不在标准路径 # font_dirs [‘C:/my_custom_fonts‘] # 你的自定义字体目录 # font_files fm.findSystemFonts(fontpathsfont_dirs) # for font_file in font_files: # fm.fontManager.addfont(font_file) # 3. 获取系统字体属性 # 假设我们已经知道宋体和Times New Roman的准确族名 # 通过前面的探测代码获取例如 chinese_font_name ‘SimSun‘, english_font_name ‘Times New Roman‘ chinese_font_name ‘SimSun‘ english_font_name ‘Times New Roman‘ # 4. 核心配置设置默认字体为支持中文的字体并通过rcParams调整 rcParams[‘font.family‘] ‘sans-serif‘ # 将中文字体放在sans-serif列表最前面确保中文优先使用它 rcParams[‘font.sans-serif‘] [chinese_font_name, ‘DejaVu Sans‘, ...] # 5. 关键技巧配置LaTeX文本渲染以实现更复杂的字体控制如果环境中安装了LaTeX # 这能实现真正的中英混排但依赖外部LaTeX环境较复杂。 # rcParams[‘text.usetex‘] True # rcParams[‘text.latex.preamble‘] r‘\usepackage{fontspec, xunicode, xltxtra}\setmainfont{Times New Roman}\setsansfont{SimSun}‘ # 6. 对于非LaTeX模式一个实用的“曲线救国”方法 # 我们无法全局区分但在具体绘图时可以通过函数封装来简化设置。 # 定义一个辅助函数用于设置轴的标签字体中文用宋体英文用新罗马 def set_axis_font(ax, xlabelNone, ylabelNone): if xlabel: ax.set_xlabel(xlabel, fontnamechinese_font_name) # 假设标签是中文 if ylabel: ax.set_ylabel(ylabel, fontnamechinese_font_name) # 刻度标签通常为数字可以设置为Times New Roman for label in ax.get_xticklabels() ax.get_yticklabels(): label.set_fontname(english_font_name)然后在主绘图脚本中import matplotlib.pyplot as plt import my_plot_style # 导入配置模块执行其中的rcParams设置 # 现在绘图中文默认已经是宋体通过sans-serif列表 fig, ax plt.subplots() ax.plot([1,2,3], [4,5,6]) ax.set_xlabel(‘时间 (秒)‘) # 这部分中文会使用SimSun ax.set_ylabel(‘强度 (单位)‘) # 调用辅助函数设置刻度字体 for label in ax.get_xticklabels() ax.get_yticklabels(): label.set_fontname(‘Times New Roman‘) plt.title(‘中文标题 English Words‘) # 混合标题中文部分用SimSun英文部分可能回退到SimSun的英文样式不完美。 plt.show()3.3 第三步清除字体缓存与验证配置无论采用哪种方法修改字体配置后必须清除Matplotlib的缓存否则更改可能不生效。找到并删除缓存文件在Python中运行import matplotlib as mpl print(mpl.get_cachedir())进入打印出的目录删除所有以fontlist或fontcache开头的.json文件。更直接的方式推荐在代码配置部分开始时就强制删除缓存如上文my_plot_style.py所示。验证配置是否成功 创建一个简单的测试脚本import matplotlib.pyplot as plt import numpy as np plt.figure() x np.linspace(0, 10, 100) y np.sin(x) plt.plot(x, y) plt.title(‘测试标题中文Chinese和English混合‘, fontsize16) plt.xlabel(‘横轴 - X Axis (单位)‘, fontsize14) plt.ylabel(‘纵轴 - Y Axis‘, fontsize14) plt.xticks(fontsize12) plt.yticks(fontsize12) # 尝试获取当前使用的字体 from matplotlib import rcParams print(“当前默认字体族:“, rcParams[‘font.family‘]) print(“当前sans-serif列表:“, rcParams[‘font.sans-serif‘][:3]) plt.tight_layout() plt.savefig(‘font_test.png‘, dpi300) plt.show()保存图片后放大检查中文字符是否为宋体英文字符是否为Times New Roman或至少不是默认的DejaVu Sans。检查坐标轴数字的字体。4. 疑难杂症排查与进阶技巧即使按照上述步骤操作你可能还是会遇到一些奇怪的问题。这里汇总了常见的坑和解决方案。4.1 常见错误与解决方案错误RuntimeWarning: Glyph XXXXX missing from current font.原因当前设置的字体缺少某些字符特别是生僻汉字或特殊符号。解决确保你的中文字体是完整的。可以尝试换一个更全的中文字体如Microsoft YaHei微软雅黑或Source Han Sans SC思源黑体。在font.sans-serif列表中将备选字体往后放。错误图表中部分中文显示为方框□□□原因字体缓存未更新或指定的字体族名不正确Matplotlib使用了不支持中文的后备字体。解决确认字体族名拼写正确大小写敏感。强制重载字体缓存在代码最开头添加import matplotlib; matplotlib.font_manager._rebuild()。但注意这个函数可能在新版本中位置有变。使用字体文件路径直接加载最可靠import matplotlib.font_manager as fm fm.fontManager.addfont(‘C:/Windows/Fonts/simsun.ttc‘) prop fm.FontProperties(fname‘C:/Windows/Fonts/simsun.ttc‘) plt.rcParams[‘font.family‘] prop.get_name() # 获取并设置族名问题英文和数字没有变成Times New Roman原因我们之前的配置主要解决了中文字体。Matplotlib的rcParams没有提供直接为“非中文”文本设置字体的选项。解决折中方案方案A全局近似使用一个英文部分类似Times New Roman的中文字体。但几乎没有中文字体自带Times New Roman英文字形。方案B代码控制接受中文用宋体英文/数字用默认无衬线体如Arial。这在许多国内期刊中也是可接受的。如果必须严格区分就需要像前文所述对每个文本元素特别是刻度标签进行单独设置或者使用LaTeX渲染见下文。方案CLaTeX引擎终极方案如果系统安装了LaTeX如MiKTeX或TeX Live可以启用Matplotlib的LaTeX文本渲染。这是实现完美中英混排中文宋体英文Times New Roman的最强大方法。4.2 使用LaTeX渲染实现完美字体控制启用LaTeX后Matplotlib会将所有文本交给LaTeX引擎渲染你可以使用LaTeX强大的字体管理命令。前提确保系统已安装LaTeX并且Matplotlib能找到它通常需要将LaTeX的bin目录添加到系统PATH。配置示例import matplotlib.pyplot as plt plt.rcParams.update({ “text.usetex“: True, # 启用LaTeX渲染 “font.family“: “serif“, # 使用衬线字体族以便与Times New Roman对应 # LaTeX preamble (导言区) 进行精细控制 “text.latex.preamble“: r“““ \usepackage{fontspec} \setmainfont{Times New Roman} \setsansfont{SimSun} % 设置无衬线字体为宋体 \usepackage{xeCJK} % 如果处理中日韩文字 \setCJKmainfont{SimSun} % 设置CJK主字体为宋体 “““, })注意使用LaTeX渲染会显著增加图形生成时间且对复杂文本或动态交互可能不友好。但它生成的字体质量最高也最符合出版要求。4.3 在Jupyter Notebook/Lab中的特殊处理在Jupyter环境中Matplotlib可能以交互模式inline运行。有时需要额外设置来使字体生效。在Notebook开头执行配置将字体配置代码放在第一个单元格。使用%matplotlib inline后的重载有时需要重启内核或重新执行配置单元格。检查后端确保没有使用可能忽略rcParams的特殊后端。通常inline后端没问题。4.4 字体版权与分发注意事项如果你编写的脚本或生成的图表需要与他人共享或在其他机器上运行字体是一个需要谨慎对待的问题。系统字体宋体和Times New Roman在Windows/macOS上是系统自带字体通常允许在文档中嵌入对于PDF等格式。但如果你将脚本发给一个Linux用户他的系统很可能没有这些字体图表就会显示异常。解决方案字体打包将用到的字体文件.ttf/.ttc随代码一起分发并在代码中通过绝对路径或相对路径加载。务必注意字体文件的版权许可确保你有权分发。使用开源字体在协作或跨平台项目中考虑使用开源字体替代。例如中文思源宋体Source Han Serif、思源黑体Source Han Sans、方正书宋等需确认开源许可。英文TeX Gyre TermesTimes New Roman的开源替代、Liberation Serif。输出为矢量格式并嵌入字体当使用plt.savefig(‘figure.pdf‘)保存为PDF时可以通过pdf.fonttype 42参数确保字体嵌入。但同样需要目标系统有相应字体或字体已嵌入。5. 实战案例创建符合学术出版要求的图表模板理论说再多不如一个完整的例子。下面我将演示如何创建一个可复用的、符合严格学术字体要求的绘图函数。假设我们的要求是坐标轴标签、标题的中文部分用宋体SimSun英文部分用Times New Roman坐标轴刻度数字用Times New Roman图例用Times New Roman。我们将采用“默认字体设宋体局部覆盖英文部分”的策略。import matplotlib.pyplot as plt import numpy as np from matplotlib import rcParams import matplotlib.font_manager as fm import os # 初始化配置 (可单独放入模块) def init_plot_style(): “““初始化绘图样式设置中文字体并尝试区分英文。“”“ # 0. 尝试清除缓存可选首次运行时进行 try: cache_dir plt.get_cachedir() cache_file os.path.join(cache_dir, ‘fontlist-*.json‘) import glob for f in glob.glob(cache_file): os.remove(f) print(f“Removed cache: {f}“) except: pass # 1. 手动添加字体文件路径如果字体不在标准位置 # font_paths [‘./fonts/‘] # 自定义字体目录 # for path in font_paths: # if os.path.exists(path): # for f in fm.findSystemFonts(fontpaths[path]): # fm.fontManager.addfont(f) # 2. 配置rcParams - 基础中文支持 rcParams[‘font.family‘] ‘sans-serif‘ # 关键将中文字体放在列表最前面 rcParams[‘font.sans-serif‘] [‘SimSun‘, ‘Microsoft YaHei‘, ‘DejaVu Sans‘] # 解决负号显示问题 rcParams[‘axes.unicode_minus‘] False # 设置图形尺寸和DPI rcParams[‘figure.figsize‘] [8, 6] rcParams[‘figure.dpi‘] 150 rcParams[‘savefig.dpi‘] 300 rcParams[‘font.size‘] 12 rcParams[‘axes.titlesize‘] 14 rcParams[‘axes.labelsize‘] 13 rcParams[‘xtick.labelsize‘] 11 rcParams[‘ytick.labelsize‘] 11 rcParams[‘legend.fontsize‘] 11 # 应用初始化 init_plot_style() # 定义辅助函数用于设置Times New Roman字体 def set_times_new_roman(ax): “““将坐标轴刻度标签的字体设置为Times New Roman。“”“ for label in ax.get_xticklabels() ax.get_yticklabels(): label.set_fontname(‘Times New Roman‘) # 图例字体也设置如果已有图例 legend ax.get_legend() if legend: for text in legend.get_texts(): text.set_fontname(‘Times New Roman‘) # 主绘图函数示例 def create_academic_plot(x_data, y_data, xlabel‘‘, ylabel‘‘, title‘‘): “““ 创建一个符合学术规范的图表。 参数: x_data, y_data: 数据 xlabel, ylabel: 坐标轴标签可含中文 title: 标题可含中文 “”“ fig, ax plt.subplots() ax.plot(x_data, y_data, label‘实验数据‘, marker‘o‘, linestyle‘-‘, linewidth2) # 设置标签和标题这些文本中的中文会使用rcParams中设置的SimSun ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) ax.set_title(title) # 强制设置刻度数字为Times New Roman set_times_new_roman(ax) # 添加图例并设置其字体为Times New Roman ax.legend() legend ax.get_legend() for text in legend.get_texts(): text.set_fontname(‘Times New Roman‘) # 网格线 ax.grid(True, which‘both‘, linestyle‘--‘, alpha0.6) plt.tight_layout() return fig, ax # 使用示例 if __name__ ‘__main__‘: # 生成示例数据 x np.linspace(0, 2*np.pi, 50) y np.sin(x) np.random.normal(0, 0.1, x.shape) # 创建图表 fig, ax create_academic_plot( x, y, xlabel‘时间 t (秒)‘, # 中文部分会显示为宋体 ylabel‘信号强度 A (伏特)‘, title‘正弦信号与噪声叠加结果 Sinusoidal Signal with Noise‘ ) # 保存为高分辨率图片和矢量图 fig.savefig(‘academic_plot.png‘, dpi300, bbox_inches‘tight‘) fig.savefig(‘academic_plot.pdf‘, bbox_inches‘tight‘) # PDF会嵌入字体 plt.show() # 打印当前使用的字体信息以供调试 from matplotlib import font_manager current_font font_manager.FontProperties().get_name() print(f“当前默认字体: {current_font}“)这个模板提供了从初始化、字体设置到最终出图的一条龙服务。init_plot_style函数负责全局配置set_times_new_roman函数负责覆盖英文和数字的字体。create_academic_plot是一个封装好的绘图函数你可以在自己的数据分析脚本中直接调用。最后的小技巧如果你经常需要产出大量图表可以考虑将上述配置和函数保存为一个自定义的Python包或模块比如myplotlib然后在每个项目开头from myplotlib import *这样就能始终保持一致的、专业的图表风格再也不必为字体问题烦恼了。这可能是从“会用Matplotlib”到“善用Matplotlib”的一个关键飞跃。
返回列表