Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain the same font(-style, -size etc.) in matplotlib output as in latex output?

I have one .tex-document in which one graph is made by the python module matplotlib. What I want is, that the graph blends in to the document as good as possible. So I want the characters used in the graph to look exactly like the other same characters in the rest of the document.

My first try looks like this (the 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

For compiling of the .tex in which the PDF output of matplotlib is included, pdflatex is used.

Now, the output looks not bad, but it looks somewhat different, the characters in the graph seem weaker in stroke width.

What is the best approach for this?

EDIT: Minimum example: 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 output:

enter image description here

like image 305
John H. K. Avatar asked Jul 16 '13 21:07

John H. K.


People also ask

What is the font used by Matplotlib?

The default font has changed from "Bitstream Vera Sans" to "DejaVu Sans".

How do I enable LaTeX in Matplotlib?

Matplotlib can use LaTeX to render text. This is activated by setting text. usetex : True in your rcParams, or by setting the usetex property to True on individual Text objects.

How do I make my font bold in Matplotlib?

MatPlotLib with Python To set the Matplotlib title in bold while using "Times New Roman", we can use fontweight="bold".


4 Answers

The difference in the fonts can be caused by incorrect parameter setting out pictures with matplotlib or wrong its integration into the final document. I think problem in text.latex.preamble: \usepackage{lmodern}. This thing works very badly and even developers do not guarantee its workability, how you can find here. In my case it did not work at all.

Minimal differences in font associated with font family. For fix this u need: 'font.family' : 'lmodern' in rc. Other options and more detailed settings can be found here.

To suppress this problem, I used a slightly different method - direct. plt.rcParams['text.latex.preamble']=[r"\usepackage{lmodern}"]. It is not strange, but it worked. Further information can be found at the link above.


To prevent these effects suggest taking a look at this code:

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',              ) 

And finally move on to the latex:

\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} 

Results

Zoom of pdf document

As can be seen from a comparison of two fonts - differences do not exist (1 - MatPlotlib, 2 - pdfLaTeX) Comparison of fonts

like image 85
Elenium Avatar answered Oct 11 '22 14:10

Elenium


Alternatively, you can use Matplotlib's PGF backend. It exports your graph using LaTeX package PGF, then it will use the same fonts your document uses, as it is just a collection of LaTeX commands. You add then in the figure environment using input command, instead of includegraphics:

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

If you need to adjust the sizes, package adjustbox can help.

like image 42
WDiniz Avatar answered Oct 11 '22 13:10

WDiniz


tikzplotlib is here for this exact purpose. Instead of savefig(), use

import tikzplotlib

tikzplotlib.save("out.tex")

and include the resulting file in your LaTeX document via

\input{out.tex}

It's also easy to edit in case you need to change things in your plot after you created the file.

enter image description here

like image 20
Nico Schlömer Avatar answered Oct 11 '22 12:10

Nico Schlömer


I had difficulties getting Eleniums's answer to work for me. I specified 'figure.figsize' and 'font.size' in the matplotlib rc-params to be identical to the font size and textwidth of the LaTeX document, but there still was a noticeable difference in the text size of the label. I finally found out that the label font size in matplotlib is apparently indepentent of 'font.size'.

The following solution worked perfectly for me:

Python

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')

LaTeX

\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}
like image 38
Onno Eberhard Avatar answered Oct 11 '22 14:10

Onno Eberhard