Matplotlib启用LaTeX渲染时如何将Times New Roman坐标轴刻度设为粗体
解决Matplotlib中LaTeX渲染下坐标轴刻度标签粗体+Times New Roman字体问题
你遇到的问题核心是:坐标轴刻度默认以数学模式渲染,单纯设置font.weight='bold'无法作用于LaTeX数学环境的文本;同时原代码中的fontspec包在Matplotlib默认的PDFLaTeX编译环境下不生效,导致字体和粗体设置没完全覆盖到刻度标签。
以下是修正后的完整代码:
import numpy as np from matplotlib import rcParams import matplotlib.pyplot as plt tmpData = np.random.random(100) # 配置LaTeX渲染与字体参数 rcParams.update({ "text.usetex": True, "font.family": "serif", "font.serif": ["Times New Roman"], "font.size": 20, # 全局基础字号,减少重复设置 }) # LaTeX预amble:使用newtx系列匹配Times字体,启用数学环境粗体,加载amsmath支持 rcParams['text.latex.preamble'] = r""" \usepackage{amsmath} \usepackage{newtxtext,newtxmath} \boldmath """ # 创建图表 fig, ax = plt.subplots(figsize=(10,10)) ax.plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2) # 设置坐标轴粗体标签 ax.set_ylabel(r'\textbf{Y-AXIS}') ax.set_xlabel(r'\textbf{X-AXIS}') # 手动格式化刻度标签为粗体数学文本 xticks = ax.get_xticks() ax.set_xticklabels([r'\textbf{{{:.0f}}}'.format(tick) for tick in xticks]) yticks = ax.get_yticks() ax.set_yticklabels([r'\textbf{{{:.2f}}}'.format(tick) for tick in yticks]) # 调整刻度显示参数 ax.xaxis.set_tick_params(labelsize=20) ax.yaxis.set_tick_params(labelsize=20) ax.legend() plt.show()
关键改动说明
- 移除
fontspec:Matplotlib默认使用PDFLaTeX编译LaTeX代码,fontspec是XeLaTeX/LuaTeX专属包,无法生效;newtxtext,newtxmath已提供与Times New Roman完全匹配的衬线字体(含文本和数学符号)。 - 添加
\boldmath:强制LaTeX数学环境下的所有文本自动变为粗体,直接覆盖刻度标签的数学模式渲染逻辑。 - 手动格式化刻度标签:通过
get_xticks()获取刻度数值,用双层大括号转义的LaTeX语法将每个数值包裹为粗体文本,确保刻度完全遵循设置。 - 全局字号设置:统一
font.size参数,减少重复的fontsize配置,代码更简洁。
如果不需要全局数学粗体,仅想让刻度标签粗体,可以移除\boldmath,改为在刻度标签中使用\mathbf{}:
ax.set_xticklabels([r'\mathbf{{{:.0f}}}'.format(tick) for tick in xticks])
内容的提问来源于stack exchange,提问作者Sea_
相关产品推荐
相关产品推荐

