Reputation:
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
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:
Upvotes: 0
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
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
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
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