You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:22:13