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

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

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

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)

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

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()ignoresaxes.titleweight; setfigure.titleweight.- Use
\for spaces inside$\bf{}$. - Bigger titles need room; use
layout="constrained"or subplot spacing.
More title and label guides you might like:
- Bar chart title font size in Matplotlib
- Matplotlib legend font size
- Share axis labels across subplots
- Add multi-line text to a plot
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".