Plotting

The plotting subpackage provides functions to create plots following the Merantix Momentum style guide.

Fonts

Download and install the required fonts from Google Fonts:

wget 'https://github.com/google/fonts/raw/main/ofl/spacegrotesk/SpaceGrotesk%5Bwght%5D.ttf'
wget 'https://github.com/google/fonts/raw/main/ofl/inter/Inter%5Bopsz%2Cwght%5D.ttf'

Install them to your system (e.g., Font Book on macOS), then register with matplotlib:

from matplotlib import font_manager as fm
for font_file in fm.findSystemFonts():
    fm.fontManager.addfont(font_file)

Styles and Variants

Two styles are available via MXM_STYLE:

  • MXM_STYLE.LIGHT — light backgrounds (variant 0: white, variant 1: offwhite)

  • MXM_STYLE.DARK — dark backgrounds (variant 0: blueberry, variant 1: black, variant 2: admiral)

Use get_mpl_context(style, variant) to apply the theme as a context manager.

Title Font

Matplotlib has no rcParam for title font family, so titles use the body font by default. Apply the title font explicitly using the TITLE_FONT dict:

fig.suptitle("My Title", **plotting.TITLE_FONT)
ax.set_title("Axes Title", **plotting.TITLE_FONT)

Colors

Individual colors can be imported directly:

from scaffold.plotting import ELECTRIC, CARIBBEAN, CORAL, ADMIRAL, PINE

Or get the full color cycle for a style:

from scaffold.plotting import get_color_cycle, MXM_STYLE
colors = get_color_cycle(style=MXM_STYLE.LIGHT)

Example

from scaffold import plotting
import matplotlib.pyplot as plt
import numpy as np

style = plotting.MXM_STYLE.LIGHT
variant = 0

with plotting.get_mpl_context(style, variant):
    fig, ax = plt.subplots(figsize=(10, 5))
    fig.suptitle("Example plot", **plotting.TITLE_FONT)

    N = 5
    x = np.arange(N)
    for i in range(3):
        ax.bar(x + i * 0.25, np.random.randint(3, 15, N), width=0.2)

    ax.set_xlabel("Category")
    ax.set_ylabel("Value")
    ax.legend(["A", "B", "C"], loc="upper center", bbox_to_anchor=(0.5, -0.1), ncol=3)

plt.tight_layout()
plt.show()

Logo Helper

Use plotting.add_logo() to place a logo in the corner of a figure:

plotting.add_logo(fig, style=style, variant=variant, position="upper right")

Custom logos can be passed via the logo_path argument (supports any fsspec-compatible path):

plotting.add_logo(fig, logo_path="gs://my-bucket/logo.png")

Applying Globally

To apply the style to all plots without a context manager:

import matplotlib.pyplot as plt
from scaffold.plotting import get_rc_params, MXM_STYLE

plt.rcParams.update(get_rc_params(MXM_STYLE.LIGHT, variant=0))