Matplotlib Bold Title and Subplot Title Font Size

Say you’ve got a 2×2 chart of 2026 revenue for four US regions, and the subplot titles look small and thin. For a Matplotlib title bold and bigger, pass fontweight="bold" and fontsize=14 to ax.set_title().

In this tutorial, I’ll bold and resize subplot titles three ways (one setting skips the figure title), then bold other text, on Python 3.12.5 and Matplotlib 3.11.2.

The sample regional revenue subplots we’ll use

Four US regions, four quarters of 2026 revenue in USD. Mountain West’s space matters in Method 3.

quarters = ["Q1", "Q2", "Q3", "Q4"]
regions = {   # 2026 revenue, USD
    "Northeast": [412350.75, 438910.20, 455120.40, 488230.95],
    "Southeast": [389240.10, 401775.65, 396310.00, 428905.30],
    "Midwest": [301480.55, 318220.90, 327615.25, 340110.80],
    "Mountain West": [256930.40, 271845.15, 290470.60, 312685.25],
}

Here’s the starting chart with default titles:

import matplotlib.pyplot as plt

# quarters and regions from the sample

fig, axs = plt.subplots(2, 2, figsize=(9, 6), sharey=True,
                        layout="constrained")
for ax, (name, sales) in zip(axs.flat, regions.items()):
    ax.bar(quarters, sales, color="#4c72b0")
    ax.set_title(name)
fig.suptitle("2026 revenue by region (USD)")
plt.show()
Matplotlib 2x2 bar subplots of 2026 revenue by region with default normal-weight subplot titles
Default subplot titles: 12 points and normal weight.

To add the titles first, see setting titles for each subplot and an overall title.

Method 1: Bold subplot titles with fontweight in set_title() (Recommended)

Use this for one figure. Same regional data, two extra arguments:

for ax, (name, sales) in zip(axs.flat, regions.items()):
    ax.bar(quarters, sales, color="#4c72b0")
    ax.set_title(name, fontsize=14, fontweight="bold")
fig.suptitle("2026 revenue by region (USD)", fontsize=16,
             fontweight="bold")
Matplotlib 2x2 subplots with bold 14-point region titles and a bold 16-point figure title
Each region title is now 14-point bold, and the figure title 16-point bold.

How does this code work?

fontsize takes points or a name like "large". fontweight takes "bold", "semibold" or a number up to 1000 (700 is bold).

fig.suptitle() needs its own arguments. Looping over axs.flat is explained in the Matplotlib subplots tutorial.

Method 2: Set every subplot title’s size and weight with rcParams

When every chart in a script should match, set the defaults once:

plt.rcParams.update({
    "axes.titlesize": 14,        # every ax.set_title()
    "axes.titleweight": "bold",
    "figure.titlesize": 16,      # fig.suptitle()
    "figure.titleweight": "bold",
})

Here’s what each setting really changes (VS Code run):

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# quarters and regions from the sample

def check(step):
    fig, axs = plt.subplots(2, 2)
    for ax, name in zip(axs.flat, regions):
        ax.set_title(name)
    sup = fig.suptitle("2026 revenue by region")
    t = axs[0, 0].title
    print(f"{step:<18}{t.get_fontsize():>5} {t.get_fontweight():<7}"
          f"suptitle {sup.get_fontsize():>5} {sup.get_fontweight()}")

plt.rcParams["axes.titleweight"] = "bold"
check("titleweight only")
plt.rcParams.update({
    "axes.titlesize": 14,        # every ax.set_title()
    "axes.titleweight": "bold",
    "figure.titlesize": 16,      # fig.suptitle()
    "figure.titleweight": "bold",
})
check("all four")

Output:

titleweight only   12.0 bold   suptitle  12.0 normal
all four           14.0 bold   suptitle  16.0 bold
VS Code output showing axes.titleweight bolds the subplot titles but leaves the suptitle normal until figure.titleweight is set
axes.titleweight alone leaves the suptitle normal.

How does this code work?

The axes. keys cover set_title() only. fig.suptitle() reads the figure. keys, so it stayed normal in the first run. For single charts, see the Matplotlib title font size guide.

Method 3: Bold only part of a subplot title with mathtext

To bold just the region name, wrap it in $\bf{...}$:

for ax, (name, sales) in zip(axs.flat, regions.items()):
    growth = (sales[-1] / sales[0] - 1) * 100
    ax.bar(quarters, sales, color="#4c72b0")
    label = name.replace(" ", r"\ ")
    ax.set_title(rf"$\bf{{{label}}}$  +{growth:.1f}% since Q1",
                 fontsize=13)
Matplotlib subplots whose titles show the region name in bold followed by normal-weight growth since Q1, such as Northeast +18.4%
Only the region name is bold; growth since Q1 stays normal.

How does this code work?

Mathtext drops plain spaces (I got “MountainWest”), so each space becomes \ . Northeast shows +18.4% and Mountain West +21.7%.

Need the title higher or further from the bars? See subplot title position and padding.

How do you make other text bold in Matplotlib?

fontweight works on every Text object, including axis labels, tick labels and ax.text(). Same sample data, Northeast only:

import matplotlib.pyplot as plt

# quarters and regions from the sample

sales = regions["Northeast"]
fig, ax = plt.subplots(figsize=(7, 4.5), layout="constrained")
ax.bar(quarters, sales, color="#4c72b0")
ax.set_title("Northeast 2026 revenue", fontweight="bold")
ax.set_xlabel("Quarter", fontweight="bold")
ax.set_ylabel("Revenue (USD)", fontweight=700)
for label in ax.get_xticklabels():
    label.set_fontweight("bold")
plt.show()
Matplotlib bar chart with bold title, bold axis labels, and bold quarter tick labels
Bold title, axis labels and tick labels.

ax.tick_params() can’t change weight, so loop over the tick labels. For sizes, see Matplotlib axis label font size and tick label font size.

Why is my Matplotlib bold title not working?

Important: weight names are lowercase, so "Bold" raises a ValueError. If a font still looks thin, findfont() shows the file Matplotlib picked:

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties, findfont

fig, ax = plt.subplots()
try:
    ax.set_title("Northeast", fontweight="Bold")
except ValueError as err:
    print("ValueError:", err)

bold = FontProperties(family="Times New Roman", weight="bold")
print("Bold file:", findfont(bold).split("\\")[-1])

Output:

ValueError: weight='Bold' is invalid
Bold file: timesbd.ttf

Times New Roman has a bold file here.

Things to Keep in Mind with bold subplot titles

  • fig.suptitle() ignores axes.titleweight; set figure.titleweight.
  • Use \ for spaces inside $\bf{}$.
  • Bigger titles need room; use layout="constrained" or subplot spacing.

More title and label guides you might like:

Frequently asked questions

How do I make a Matplotlib title bold?

Pass fontweight="bold" to plt.title() or ax.set_title().

How do I change the font size of all subplot titles?

Set plt.rcParams["axes.titlesize"] before creating the figure.

Why isn’t my suptitle bold?

It uses figure.titleweight, not axes.titleweight, or pass fontweight to suptitle().

Can I use a number for fontweight?

Yes, 0 to 1000. 400 is normal and 700 is bold.

How do I bold only one word in a title?

Wrap it in mathtext, like r"$\bf{Northeast}$ revenue".

Where are the title options documented?