Plot typography affects whether titles, axis labels, and tick values remain readable after a figure leaves Python. Matplotlib can apply one family list and a consistent size hierarchy to every text object created by a plotting script.
Runtime settings in rcParams change the defaults for the current Python process without editing a user or system configuration file. Applying them before the figure is created keeps the title, labels, and tick text on the same project-level typography baseline.
Matplotlib resolves font families in list order, so a concrete family can be followed by a generic group such as serif. DejaVu Serif ships with common Matplotlib installations; the resolved .ttf file, reported text sizes, and saved PNG show whether the requested settings reached the rendered plot.
from pathlib import Path import matplotlib from matplotlib import font_manager import matplotlib.pyplot as plt quarters = ["Q1", "Q2", "Q3", "Q4"] satisfaction = [82, 86, 88, 91]
plt.rcParams.update( { "font.family": ["DejaVu Serif", "serif"], "font.size": 12, "axes.titlesize": 15, "axes.labelsize": 12, "xtick.labelsize": 10, "ytick.labelsize": 10, } )
font.size supplies the general default, while the axes and tick settings establish the size hierarchy for their specific text roles.
requested_family = plt.rcParams["font.family"] resolved_font = Path( font_manager.findfont( font_manager.FontProperties(family=requested_family), fallback_to_default=False, ) ) resolved_family = font_manager.get_font(resolved_font).family_name
fallback_to_default=False raises an error when none of the requested concrete or generic families can resolve to a usable font file.
fig, ax = plt.subplots(figsize=(6.4, 3.8), layout="constrained") ax.plot(quarters, satisfaction, marker="o", linewidth=2.2, color="#3E6C9A") title = ax.set_title("Customer satisfaction trend", fontweight="bold") xlabel = ax.set_xlabel("Quarter") ax.set_ylabel("Score") ax.grid(True, axis="y", alpha=0.25) output = Path("font-configure.png") fig.savefig(output, dpi=160) plt.close(fig) print(f"matplotlib {matplotlib.__version__} ({matplotlib.get_backend()} backend)") print(f"font family: {requested_family}") print(f"resolved font: {resolved_font.name} ({resolved_family})") print(f"title size: {title.get_fontsize():.0f} pt") print(f"axis label size: {xlabel.get_fontsize():.0f} pt") print(f"saved: {output}") print(f"bytes: {output.stat().st_size}")
$ python3 font_configure.py matplotlib 3.10.7+dfsg1 (agg backend) font family: ['DejaVu Serif', 'serif'] resolved font: DejaVuSerif.ttf (DejaVu Serif) title size: 15 pt axis label size: 12 pt saved: font-configure.png bytes: 41103
The byte count can change with the Matplotlib version, backend, operating system, and font renderer. The resolved family and reported sizes should match the configured values.
The title should be larger than the axis labels, and the tick labels should be the smallest text in the figure.