user248237
user248237

Reputation:

Putting newline in matplotlib label with TeX in Python?

How can I add a newline to a plot's label (e.g. xlabel or ylabel) in matplotlib? For example,

plt.bar([1, 2], [4, 5])
plt.xlabel("My x label")
plt.ylabel(r"My long label with $\Sigma_{C}$ math \n continues here") 

Ideally I'd like the y-labeled to be centered too. Is there a way to do this? It's important that the label have both TeX (enclosed in '$') and the newline.

Upvotes: 97

Views: 166182

Answers (5)

Matthias Luh
Matthias Luh

Reputation: 623

In case anyone wants TeX (e.g. for partly bold text) and a new line AND has a percentage sign in it (I struggled longer than I wanted):

import matplotlib.pyplot as plt

plt.plot([10, 20], [10, 20])  # dummy plot
value = 20  # dummy value

bold_text_base = f"Value = %u\ \%%"  # "\ " for protected space, "\%%" for percentage sign that survives formatting and math mode
regular_text = "(2nd line here)"
bold_text = bold_text_base % value
_ = plt.ylabel(r"$\bf{{{x}}}$".format(x=bold_text) + f"\n%s" % regular_text )  # suppress output with "_ = "

Returns:

Matplotlib plot with TeX, newline and percentage sign in title

Upvotes: 0

Eric O. Lebigot
Eric O. Lebigot

Reputation: 94575

You can have the best of both worlds: automatic "escaping" of LaTeX commands and newlines:

plt.ylabel(r"My long label with unescaped {\LaTeX} $\Sigma_{C}$ math"
           "\n"  # Newline: the backslash is interpreted as usual
           r"continues here with $\pi$")

(instead of using three lines, separating the strings by single spaces is another option).

In fact, Python automatically concatenates string literals that follow each other, and you can mix raw strings (r"…") and strings with character interpolation ("\n").

Upvotes: 143

Brothaman
Brothaman

Reputation: 309

plt.bar([1, 2], [4, 5])
plt.xlabel("My x label")
plt.ylabel(r"My long label with $\Sigma_{C}$ math" + "\n" + "continues here")

Just concatenate the strings with a newline that isn't in raw string form.

Upvotes: 19

Ranaivo
Ranaivo

Reputation: 1578

The following matplotlib python script creates text with new line

ax.text(10, 70, 'shock size \n $n-n_{fd}$')

The following does not have new line. Notice the r before the text

ax.text(10, 70, r'shock size \n $n-n_{fd}$')

Upvotes: 3

Michael Mrozek
Michael Mrozek

Reputation: 175665

Your example is exactly how it's done, you use \n. You need to take off the r prefix though so python doesn't treat it as a raw string

Upvotes: 56

Related Questions