Bold font weight for LaTeX axes label in matplotlib
Question:
In matplotlib
you can make the text of an axis label bold by
plt.xlabel('foo',fontweight='bold')
You can also use LaTeX with the right backend
plt.xlabel(r'$phi$')
When you combine them however, the math text is not bold anymore
plt.xlabel(r'$phi$',fontweight='bold')
Nor do the following LaTeX commands seem to have any effect
plt.xlabel(r'$bf phi$')
plt.xlabel(r'$mathbf{phi}$')
How can I make a bold $phi$
in my axis label?
Answers:
Unfortunately you can’t bold symbols using the bold font, see this question on tex.stackexchange.
As the answer suggests, you could use boldsymbol
to bold phi:
r'$boldsymbol{phi}$'
You’ll need to load amsmath
into the TeX preamble:
matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble']=[r"usepackage{amsmath}"]
If you intend to have consistently bolded fonts throughout the plot, the best way may be to enable latex and add boldmath
to your preamble:
# Optionally set font to Computer Modern to avoid common missing font errors
matplotlib.rc('font', family='serif', serif='cm10')
matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble'] = [r'boldmath']
Then your axis or figure labels can have any mathematical latex expression and still be bold:
plt.xlabel(r'$frac{phi + x}{2}$')
However, for portions of labels that are not mathematical, you’ll need to explicitly set them as bold:
plt.ylabel(r'textbf{Counts of} $lambda$'}
As this answer Latex on python: alpha and beta don't work? points out. You may have a problem with b
so boldsymbol
may not work as anticipated. In that case you may use something like: '$ \boldsymbol{\beta} $'
in your python code. Provided you use the preamble plt.rcParams['text.latex.preamble']=[r"usepackage{amsmath}"]
In case anyone stumbles across this from Google like I did, another way that doesn’t require adjusting the rc preamble (and conflicting with non-latex text) is:
ax.set_ylabel(r"$mathbf{partial y / partial x}$")
When using LaTeX to typeset all text in a figure, you can make "normal" (non-equation) text bold by using textbf
:
ax.set_title(r"textbf{some text}")
None of these solutions worked for me and I was astonished to find something so simple was so infuriating to achieve. In the end, this is what worked for my use case. I would advise adapting this for your own use:
plt.suptitle(r"$ARMA({0}, {1})$ Multi-Parameter, $bf{{a}}$, Electrode Response".format(n_i, m), fontsize=16)
The {0}
and {1}
refer to positional arguments supplied to format
method, meaning 0
refers to variable n_i
and 1
refers to variable m
.
Note: In my setup, for some reason, textbf
did not work. I have read somewhere that bf
is deprecated in LaTeX, but for me this is what worked.
I wanted to do something similar only then plot ‘K’ with subscript ‘1/2’ as label and in bold. This worked without changing any of the rc parameters.
plt.figure()
plt.xlabel(r'$bf{K_{1/2}}$')
Update for recent Matplotlib versions
In more recent versions of Matplotlib, the preamble must be specified as a string.
import matplotlib.pyplot as plt
plt.rcParams.update(
{
"text.usetex": True,
"text.latex.preamble": r"usepackage{bm}",
# Enforce default LaTeX font.
"font.family": "serif",
"font.serif": ["Computer Modern"],
}
)
# ...
plt.xlabel(r"$bm{phi}$")
This uses the default LaTeX font "Computer Modern"
for a more natural look.
Instead of bm
, may can alternatively use the older boldsymbol
from usepackage{amsmath}
.
In matplotlib
you can make the text of an axis label bold by
plt.xlabel('foo',fontweight='bold')
You can also use LaTeX with the right backend
plt.xlabel(r'$phi$')
When you combine them however, the math text is not bold anymore
plt.xlabel(r'$phi$',fontweight='bold')
Nor do the following LaTeX commands seem to have any effect
plt.xlabel(r'$bf phi$')
plt.xlabel(r'$mathbf{phi}$')
How can I make a bold $phi$
in my axis label?
Unfortunately you can’t bold symbols using the bold font, see this question on tex.stackexchange.
As the answer suggests, you could use boldsymbol
to bold phi:
r'$boldsymbol{phi}$'
You’ll need to load amsmath
into the TeX preamble:
matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble']=[r"usepackage{amsmath}"]
If you intend to have consistently bolded fonts throughout the plot, the best way may be to enable latex and add boldmath
to your preamble:
# Optionally set font to Computer Modern to avoid common missing font errors
matplotlib.rc('font', family='serif', serif='cm10')
matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble'] = [r'boldmath']
Then your axis or figure labels can have any mathematical latex expression and still be bold:
plt.xlabel(r'$frac{phi + x}{2}$')
However, for portions of labels that are not mathematical, you’ll need to explicitly set them as bold:
plt.ylabel(r'textbf{Counts of} $lambda$'}
As this answer Latex on python: alpha and beta don't work? points out. You may have a problem with b
so boldsymbol
may not work as anticipated. In that case you may use something like: '$ \boldsymbol{\beta} $'
in your python code. Provided you use the preamble plt.rcParams['text.latex.preamble']=[r"usepackage{amsmath}"]
In case anyone stumbles across this from Google like I did, another way that doesn’t require adjusting the rc preamble (and conflicting with non-latex text) is:
ax.set_ylabel(r"$mathbf{partial y / partial x}$")
When using LaTeX to typeset all text in a figure, you can make "normal" (non-equation) text bold by using textbf
:
ax.set_title(r"textbf{some text}")
None of these solutions worked for me and I was astonished to find something so simple was so infuriating to achieve. In the end, this is what worked for my use case. I would advise adapting this for your own use:
plt.suptitle(r"$ARMA({0}, {1})$ Multi-Parameter, $bf{{a}}$, Electrode Response".format(n_i, m), fontsize=16)
The {0}
and {1}
refer to positional arguments supplied to format
method, meaning 0
refers to variable n_i
and 1
refers to variable m
.
Note: In my setup, for some reason, textbf
did not work. I have read somewhere that bf
is deprecated in LaTeX, but for me this is what worked.
I wanted to do something similar only then plot ‘K’ with subscript ‘1/2’ as label and in bold. This worked without changing any of the rc parameters.
plt.figure()
plt.xlabel(r'$bf{K_{1/2}}$')
Update for recent Matplotlib versions
In more recent versions of Matplotlib, the preamble must be specified as a string.
import matplotlib.pyplot as plt
plt.rcParams.update(
{
"text.usetex": True,
"text.latex.preamble": r"usepackage{bm}",
# Enforce default LaTeX font.
"font.family": "serif",
"font.serif": ["Computer Modern"],
}
)
# ...
plt.xlabel(r"$bm{phi}$")
This uses the default LaTeX font "Computer Modern"
for a more natural look.
Instead of bm
, may can alternatively use the older boldsymbol
from usepackage{amsmath}
.