Newline in das Matplotlib-Label mit TeX in Python einfügen?

71

Wie kann ich der Beschriftung eines Plots (z. B. xlabel oder ylabel) in matplotlib eine neue Zeile hinzufügen? Zum Beispiel,

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

Idealerweise möchte ich, dass das y-Label auch zentriert ist. Gibt es eine Möglichkeit, dies zu tun? Es ist wichtig, dass das Label sowohl TeX (in '$' eingeschlossen) als auch die Newline enthält.

BrechtDeMan
quelle

Antworten:

43

Ihr Beispiel ist genau das, was Sie verwenden \n. Sie müssen das Präfix r jedoch entfernen, damit Python es nicht als rohen String behandelt

Michael Mrozek
quelle
8
Möglicherweise möchten Sie LaTeX-Befehle proaktiv doppelt maskieren, um sicherzustellen, dass sie nicht von Python interpretiert werden:xlabel('$\\Sigma$')
Benjamin Bannier
8
Diese Antwort ist nicht korrekt. Du entkommst dem Latex entweder doppelt in einer normalen Zeichenfolge (no r) oder du folgst der Antwort von
@EOL
2
bezüglich der Zentrierung: ylabel('this is vertical\ntest', multialignment='center')von matplotlib.org/examples/pylab_examples/multiline.html
Faber
2
Leider funktioniert keine der vorgeschlagenen Lösungen mit der Option rcParams["text.usetex"] = True
Samuel
102

Sie können das Beste aus beiden Welten genießen: automatisches " Escape " von LaTeX-Befehlen und Zeilenumbrüchen:

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

(Anstatt drei Zeilen zu verwenden, können Sie die Zeichenfolgen auch durch einzelne Leerzeichen trennen.)

Tatsächlich verkettet Python automatisch aufeinanderfolgende Zeichenfolgenliterale, und Sie können rohe Zeichenfolgen ( r"…") und Zeichenfolgen mit Zeicheninterpolation ( "\n") mischen .

Eric O Lebigot
quelle
Nur ein kurzer Kommentar - dies war die perfekte Lösung für eine einfache Möglichkeit, Untergrundstücke mit einem (a), (b) usw. zu kennzeichnen, wenn sich dieses Etikett unterhalb des Diagramms befinden und mit dem xlabel zentriert sein sollte. Auf diese Weise sieht plt.tight_layout () auch das gesamte Label und passt es entsprechend an.
SeanM
2
Dies sollte die akzeptierte Antwort sein. Beachten Sie auch, dass es mit Python-String-Formatierung funktioniert, zBr"$\alpha$ : {0} " "\n" r"$\beta$ : {1}".format(a, b)
berkelem
12
plt.bar([1, 2], [4, 5])
plt.xlabel("My x label")
plt.ylabel(r"My long label with $\Sigma_{C}$ math" + "\n" + "continues here")

Verketten Sie einfach die Zeichenfolgen mit einer neuen Zeile, die nicht in roher Zeichenfolgenform vorliegt.

Brothaman
quelle
2

Das folgende Python-Skript von matplotlib erstellt Text mit einer neuen Zeile

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

Das Folgende hat keine neue Zeile. Beachten Sie das r vor dem Text

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