Skip to content

cgahr/latexplotlib

Repository files navigation

latexplotlib

image image image Actions status Coverage Status Ruff

Perfect matplotlib figures for latex.

Quickstart

  1. install latexplotlib:
pip install latexplotlib
  1. import latexplotlib and use latexplotlib style
import latexplotlib as lpl

lpl.style.use('latex10pt')
# lpl.style.use('latex10pt-minimal')
  1. replace all usages of plt with lpl. Only plt.subplots changes its behavior:
#  fig, axes = plt.subplots(2, 3)
fig, axes = lpl.subplots(2, 3)

Optional:

  1. get size of latex document
(\the\textwidth, \the\textheight)  % (412.123pt, 346.564pt)
  1. set lpl.size to size of latex document
lpl.size.set(412.123, 346.564)

Usage

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.

latexplotlib styles

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
)

Get latex dimensions

You can find the width and height of your document using the following command:

\the\textwidth

\the\textheight

Set and get latex page size

import latexplotlib as lpl

lpl.size.set(200, 400)

with lpl.size.context(100, 200):
    lpl.size()  # 100, 200

lpl.size()  # (200, 400)

Create figures for latex

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

aspect keyword

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

Include figures in Latex

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

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.

References

This package is inspired by the following sources: