Pandas柱状图导出PGF用于LaTeX时刻度标签字体不一致问题
问题:Matplotlib导出PGF后LaTeX编译轴刻度字体不一致
我用Python 3.12.4编写了以下代码生成柱状图并导出为PGF格式:
import matplotlib.pyplot as plt import numpy as np import pandas as pd plt.rc('font',**{'family':'serif','serif':['Palatino'], 'size': 20}) plt.rc('text', usetex=True) fig, ax = plt.subplots() df = pd.DataFrame({'a':[1,3,4,2], 'b':[1,2,3,4]}) df.plot.bar(x='a', y='b', ax=ax) plt.xticks(rotation=0) plt.savefig(f'out.pgf',bbox_inches='tight')
随后使用pdflatex(版本:pdfTeX 3.141592653-2.6-1.40.26)编译以下LaTeX文档:
\documentclass{standalone} \usepackage{palatino} \usepackage{tikz} \usepackage{amsmath} \def\mathdefault#1{#1} \begin{document} \input{out.pgf} \end{document}
编译后生成的图表中X轴与Y轴刻度标签字体不一致,我期望两者字体一致,请问这是Bug吗?有无可行的解决方法?
解答
这不是Bug,是Matplotlib处理轴刻度标签的机制差异导致的:
- 启用
usetex=True时,Matplotlib默认将Y轴数值标签用数学模式($...$)包裹渲染,而X轴标签因是DataFrame中a列的数值,被当作普通文本处理,最终造成字体差异。
有两种可行的解决方法:
方法一:修改Matplotlib代码统一刻度渲染模式
在Python代码中设置轴刻度格式器,强制所有刻度标签使用数学模式渲染:
import matplotlib.ticker as ticker # 在生成图表后添加以下代码 ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'${x}$')) ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'${x}$'))
方法二:修改LaTeX代码统一字体配置
替换原LaTeX中的palatino包为mathpazo,该包会同时配置Palatino文本字体和匹配的数学字体,从根源上统一两种模式的字体:
\documentclass{standalone} \usepackage{mathpazo} % 替代palatino,同步匹配数学字体 \usepackage{tikz} \usepackage{amsmath} \def\mathdefault#1{#1} \begin{document} \input{out.pgf} \end{document}
更推荐第二种方法,无需修改绘图代码,完全通过LaTeX排版规则实现字体一致性,更符合专业排版的逻辑。
内容的提问来源于stack exchange,提问作者san04
相关产品推荐
相关产品推荐

