Подтвердить что ты не робот

Как получить тот же шрифт (-style, -size и т.д.) В выходе matplotlib, как и в выходе латекса?

У меня есть один .tex -документ, в котором один граф создается с помощью модуля python matplotlib. Я хочу, чтобы график вписывался в документ как можно лучше. Поэтому я хочу, чтобы символы, используемые на графике, выглядели точно так же, как и другие символы в остальной части документа.

Моя первая попытка выглядит так (matplotlibrc -file):

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

Для компиляции .tex, в который включен вывод PDF matplotlib, используется pdflatex.

Теперь результат выглядит неплохо, но выглядит несколько иначе, символы на графике кажутся более слабыми по ширине хода.

Каков наилучший подход для этого?

EDIT: Минимальный пример: LaTeX-Input:

\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- Script:

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:

enter image description here

4b9b3361

Ответ 1

Разница в шрифтах может быть вызвана неправильным параметром, устанавливающим изображения с помощью matplotlib или неправильной его интеграцией в итоговый документ. Я думаю, проблема в text.latex.preamble:\usepackage {lmodern}. Эта вещь работает очень плохо, и даже разработчики не гарантируют ее работоспособность, как вы можете найти здесь. В моем случае это вообще не работало.

Минимальные различия в шрифте, связанные с семейством шрифтов. Для исправления этого вам нужно: "font.family": "lmodern" в rc. Другие параметры и более подробные настройки можно найти здесь.

Чтобы подавить эту проблему, я использовал несколько иной метод - прямой. plt.rcParams [ 'text.latex.preamble'] = [г "\ 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}

Результаты

Zoom of pdf document

Как видно из сравнения двух шрифтов - различий не существует (1 - MatPlotlib, 2 - pdfLaTeX) Comparison of fonts

Ответ 2

В качестве альтернативы вы можете использовать Matplotlib PGF backend. Он экспортирует ваш график с использованием пакета LaTeX PGF, тогда он будет использовать те же шрифты, которые использует ваш документ, поскольку это всего лишь коллекция команд LaTeX. Затем вы добавляете в среду рисунка с помощью команды ввода вместо includeegraphics:

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

Если вам нужно настроить размеры, может помочь пакетный блок.