如何在matplotlib输出中获得与latex输出相同的字体(-style、-size等)?

qlvxas9a  于 2023-03-19  发布在  其他
关注(0)|答案(4)|浏览(168)

我有一个.tex-文档,其中一个图形是由python模块matplotlib生成的,我想要的是,图形尽可能好地融入文档,所以我希望图形中使用的字符看起来和文档其余部分中的其他相同字符完全一样。
我的第一次尝试如下所示(matplotlibrc文件):

text.usetex   : True
text.latex.preamble: \usepackage{lmodern} #Used in .tex-document
font.size    : 11.0 #Same as in .tex-document
backend: PDF

为了编译其中包括matplotlib的PDF输出的.tex,使用pdflatex
现在,输出看起来还不错,但看起来有些不同,图形中的字符在笔划宽度上似乎较弱。
什么是最好的方法呢?
编辑:最小示例:LaTeX-输入:

\documentclass[11pt]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{graphicx}

\begin{document}

\begin{figure}
\includegraphics{./graph}
\caption{Excitation-Energy}
\label{fig:graph}
\end{figure}

\end{document}

Python脚本:

import matplotlib.pyplot as plt
import numpy as np

plt.plot([1,2,3,4])
plt.xlabel("Excitation-Energy")
plt.ylabel("Intensität")
plt.savefig("graph.pdf")

PDF输出:

72qzrwbm

72qzrwbm1#

字体的差异可能是由于使用matplotlib设置图片的参数不正确或错误地将其集成到最终文档中造成的。我认为 text.latex.preamble中的问题:\usepackage{lmodern}.这个东西工作得很糟糕,甚至开发人员都不保证它的可工作性,how you can find here.在我的情况下它根本不工作。
与字体系列关联的字体差异最小。要修复此问题,您需要:* “字体系列”:rc中的“ldemont”*。其他选项和更详细的设置可以在here.中找到
为了解决这个问题,我使用了一个稍微不同的方法- direct. plt.rcParams ['text.latex. preamble']=[r”\usepackage{lmodern}"]。这并不奇怪,但它起作用了。更多信息可以在上面的链接中找到。
为了防止这些影响,建议看看这个代码:

import matplotlib.pyplot as plt

#Direct input 
plt.rcParams['text.latex.preamble']=[r"\usepackage{lmodern}"]
#Options
params = {'text.usetex' : True,
          'font.size' : 11,
          'font.family' : 'lmodern',
          'text.latex.unicode': True,
          }
plt.rcParams.update(params) 

fig = plt.figure()

#You must select the correct size of the plot in advance
fig.set_size_inches(3.54,3.54) 

plt.plot([1,2,3,4])
plt.xlabel("Excitation-Energy")
plt.ylabel("Intensität")
plt.savefig("graph.pdf", 
            #This is simple recomendation for publication plots
            dpi=1000, 
            # Plot will be occupy a maximum of available space
            bbox_inches='tight', 
            )

最后是乳胶:

\documentclass[11pt]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{graphicx}

\begin{document}

\begin{figure}
    \begin{center}
        \includegraphics{./graph}
        \caption{Excitation-Energy}
        \label{fig:graph}
    \end{center}
\end{figure}

\end{document}

结果

从两种字体的比较中可以看出-不存在差异(1 - MatPlotlib,2 - pdfLaTeX)

ia2d9nvy

ia2d9nvy2#

或者,你可以使用Matplotlib的PGF backend。它使用LaTeX包PGF导出你的图形,然后它将使用你的文档使用的相同字体,因为它只是LaTeX命令的集合。你可以使用input命令而不是includegraphics在图形环境中添加:

\begin{figure}
  \centering
  \input{your_figure.pgf}
  \caption{Your caption}
\end{figure}

如果你需要调整尺寸,package adjustbox可以帮上忙。

xkftehaa

xkftehaa3#

tikzplotlib正是为此目的而设置的。

import tikzplotlib

tikzplotlib.save("out.tex")

并将生成的文件包含在LaTeX文档中,方法是

\input{out.tex}

如果在创建文件后需要更改绘图中的内容,也可以轻松编辑。

xriantvc

xriantvc4#

我很难让Elenium的答案对我起作用。我在matplotlib rc-params中指定'figure.figsize''font.size'与LaTeX文档的字体大小和textwidth相同,但标签的文本大小仍然有明显的差异。我最终发现matplotlib中的标签字体大小显然与'font.size'无关。
下面的解决方案对我来说非常有效:

巨蟒

W = 5.8    # Figure width in inches, approximately A4-width - 2*1.25in margin
plt.rcParams.update({
    'figure.figsize': (W, W/(4/3)),     # 4:3 aspect ratio
    'font.size' : 11,                   # Set font size to 11pt
    'axes.labelsize': 11,               # -> axis labels
    'legend.fontsize': 11,              # -> legends
    'font.family': 'lmodern',
    'text.usetex': True,
    'text.latex.preamble': (            # LaTeX preamble
        r'\usepackage{lmodern}'
        # ... more packages if needed
    )
})

# Make plot
fig, ax = plt.subplots(constrained_layout=True)
ax.plot([1, 2], [1, 2])
ax.set_xlabel('Test Label')
fig.savefig('test.pdf')

乳胶

\documentclass[11pt]{article}    % Same font size
\usepackage[paper=a4paper, top=25mm, 
            bottom=25mm, textwidth=5.8in]{geometry}    % textwidth == W
\usepackage{lmodern}

% ...

\begin{figure}[ht]
    \centering
    \includegraphics{test.pdf}
    \caption{Test Title}
\end{figure}

相关问题