Perfect matplotlib figures for latex.
- install
latexplotlib
:
pip install latexplotlib
- import latexplotlib and use latexplotlib style
import latexplotlib as lpl
lpl.style.use('latex10pt')
# lpl.style.use('latex10pt-minimal')
- replace all usages of
plt
withlpl
. Onlyplt.subplots
changes its behavior:
# fig, axes = plt.subplots(2, 3)
fig, axes = lpl.subplots(2, 3)
Optional:
- get size of latex document
(\the\textwidth, \the\textheight) % (412.123pt, 346.564pt)
- set
lpl.size
to size of latex document
lpl.size.set(412.123, 346.564)
This package has two basic functionalities. On the one hand, it sets sensible defaults for creating perfect figures for latex. This includes a color scheme optimized for color-blind people, correct font and font sizes, and sensible defaults to store the figure. On the other hand, it provides some functions to create perfectly sized figures. These figures fit your latex document without scaling and have the correct font size for your document.
There are 6 different styles for matplotlib:
latex10pt-minimal
latex11pt-minimal
latex12pt-minimal
latex10pt
latex11pt
latex12pt
The *minimal
versions change the font and the font sizes to ensure that the figures fonts match the latex font. This style is fully compatible with other styles:
import matplotlib.pyplot as plt
import numpy as np
import latexplotlib as lpl
lpl.style.use("latex10pt-minimal")
# lpl.size.set(200, 400)
with lpl.size.context(200, 400):
fig, ax = lpl.subplots(1, 1)
x = np.linspace(1, 5, 100)
for t in range(4):
label = f"$x^{t}$"
ax.plot(x, x ** t, label=label)
ax.set_yscale("log")
ax.set_title("Perfect matplotlib figures for \\LaTeX")
ax.grid()
fig.legend()
fig.savefig("example_poly_minimal")
fig.savefig("example_poly_minimal.png")
The non-minimal versions set additional defaults to create figures that are accessible for color-blind people:
import matplotlib.pyplot as plt
import numpy as np
lpl.style.use("latex10pt")
# lpl.size.set(200, 400)
with lpl.size.context(200, 400):
fig, ax = lpl.subplots(1, 1)
x = np.linspace(1, 5, 100)
for t in range(4):
label = f"$x^{t}$"
ax.plot(x, x ** t, label=label)
ax.set_yscale("log")
ax.set_title("Perfect matplotlib figures for \\LaTeX")
ax.grid()
fig.legend()
fig.savefig("example_poly")
fig.savefig("example_poly.png")
Both styles change the defaults of the plt.savefig
command. The new defaults are
lpl.savefig(
...,
bbox_inches=None,
dpi=300,
format="pdf",
orientation="portrait",
pad_inches=0.05
)
You can find the width and height of your document using the following command:
\the\textwidth
\the\textheight
import latexplotlib as lpl
lpl.size.set(200, 400)
with lpl.size.context(100, 200):
lpl.size() # 100, 200
lpl.size() # (200, 400)
import latexplotlib as lpl
# A figure filling 75% of the latex page
_ = lpl.subplots(1, 1)
# A subplot filling 80% of the latex page
fig, axes = lpl.subplots(3, 2, scale=0.8)
# A subplot for 3 square plots next to each other
fig, axes = lpl.subplots(1, 3, scale=0.8, aspect='equal')
The aspect
keyword controls the ratio of height to width. The default is the Golden ratio. aspect
can also be equal
(i.e. aspect=1
)or auto
. In the latter case, the figure fills the available space.
import latexplotlib as lpl
# A 3 by 2 figure where each subplots height to width ratio is the golden ratio
fig, axes = lpl.subplots(3, 2)
# A 3 by 2 figure where each subplot having a height to width ratio of 1:1
fig, axes = lpl.subplots(3, 2, aspect=1.0)
# A figure that is exactly 300pt height and 200pt wide
with lpl.size.context(200, 300):
fig, axes = lpl.subplots(3, 2, aspect="auto")
The most important part of including the figures in latex is to not set the size of the figure using arguments like [width=...]
:
\includegraphics{test.pdf}
Observe that we did NOT adjust the size using arguments like [width=...]
:
\includegraphics[width=\textwidth]{test.pdf}
plt.tight_layout()
changes the size of the produced figure. As such it is recommended to not use plt.tight_layout()
at all! The same is true for savefig(..., bbox_inches=None)
!
Instead all latexplotlib styles used constrained_layout
by default. constrained_layout
has a similar functionality compared to tight_layout
, however it is fully deterministic and does not change the size of the underlying figure.
This package is inspired by the following sources:
- Code: https://pypi.org/project/SciencePlots/
- Figure sizes: https://jwalton.info/Embed-Publication-Matplotlib-Latex/
- Color palette (Okabe Ito): https://clauswilke.com/dataviz/color-basics.html
- Golden ratio: https://en.wikipedia.org/wiki/Golden_ratio