使用tikzplotlib导出LaTeX绘图效果与PNG不一致及尺寸调整问题
Python 结合 LaTeX 绘图样式匹配方案
现存问题
目前本地PNG预览和LaTeX编译效果存在偏差,核心原因有三个:
- 全局参数配置顺序错误:
figure.figsize在画布创建之后才设置,未实际生效 - 混用pgf后端和tikzplotlib导出,两边渲染逻辑不统一
- tikzplotlib默认导出时会将样式控制权交给LaTeX侧重算,导致字体、元素位置和本地预览不一致
两种效果对比如下:
- PNG预览输出:

- LaTeX编译输出:

实现两端效果完全一致的操作步骤
- 第一步:把所有matplotlib全局配置移到代码最前面,所有参数设置必须在创建画布、绘图操作之前完成,修正后的基础配置如下:
import matplotlib import matplotlib.pyplot as plt import numpy as np import tikzplotlib # 注意:所有rcParams配置必须放在所有绘图逻辑最前面 matplotlib.rcParams.update({ "pgf.texsystem": "pdflatex", "font.family": "serif", "font.size": 12, # 这里的数值必须和你LaTeX文档正文字号完全对应,比如正文是11pt就填11 "text.usetex": True, "pgf.rcfonts": False, "figure.figsize": (6, 4) # 画布尺寸配置移到这里,不要在创建fig之后再改 }) # 如果用tikzplotlib导出,不需要开pgf后端,二选一即可 # matplotlib.use("pgf")
- 第二步:导出tikz代码时加参数锁定样式,禁止LaTeX侧随意覆盖绘图属性,把原来的保存代码替换成:
tikzplotlib.save( r'你的保存路径\thermal_light_prob.tex', override_externals=True, # 下面两个参数直接控制图在LaTeX里的尺寸,不需要在LaTeX侧再缩放 axis_width=r'\linewidth', axis_height=r'0.7\linewidth', # 固定各元素字号和正文一致 extra_axis_parameters={ 'tick label style={font=\\normalsize}', 'label style={font=\\normalsize}', 'legend style={font=\\small}' } )
- 如果不想调tikz参数,直接用matplotlib导出PDF格式图片插入是最稳妥的方案,渲染效果和本地预览完全一致,不会有任何偏差,保存代码换成:
plt.savefig(r'你的保存路径\thermal_light_prob.pdf', bbox_inches='tight')
LaTeX侧调整绘图尺寸的方法
- 如果你用
\input导入tikz导出的.tex文件:不要在外层套\resizebox,不然会连字体一起缩放,导致字号和正文不匹配。尺寸直接在Python导出时通过axis_width、axis_height设置即可,比如要占满整行宽就设axis_width=r'\linewidth',占半栏就设axis_width=r'0.5\linewidth',高度按视觉效果调整比例就行。 - 如果你插入的是PDF/PNG格式的图片:直接在
\includegraphics里加尺寸参数即可,参考代码:
% 占满整行宽度,自动保持比例 \includegraphics[width=\linewidth,keepaspectratio]{thermal_light_prob.pdf} % 固定宽度为8cm \includegraphics[width=8cm,keepaspectratio]{thermal_light_prob.pdf}
- 避坑提醒:不要在Python侧设固定英寸尺寸,又在LaTeX侧用缩放命令强制改大小,这是字号错位、样式变形的最常见原因。要么Python侧导出时就定好尺寸,LaTeX侧1:1插入;要么Python侧按相对比例导出,LaTeX侧只设宽度不做强制拉伸。
内容的提问来源于stack exchange,提问作者Ulrich P.
相关产品推荐
相关产品推荐

