2010-04-17 16 views
39

Come posso aggiungere una nuova riga all'etichetta di un grafico (ad esempio xlabel o ylabel) in matplotlib? Ad esempio,Mettendo newline in etichetta matplotlib con TeX in Python?

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

Idealmente mi piacerebbe che anche l'etichetta Y fosse centrata. C'è un modo per fare questo? È importante che l'etichetta abbia sia TeX (incluso in '$') che la nuova riga.

risposta

21

L'esempio è esattamente come è fatto, si utilizza \n. È necessario togliere il prefisso r anche se così pitone non lo tratta come una stringa grezzo

+6

Si potrebbe voler forzare in modo proattivo i comandi LaTeX per assicurarsi che non vengano interpretati da Python: 'xlabel ('$ \\ Sigma $')' –

+4

Questa risposta non è corretta. Si * o * si esce doppiamente dal '' 'in una stringa normale (no r) * o * si segue @EOL [risposta] (http://stackoverflow.com/a/2666270/1157089) – aaren

+1

per il centraggio:' ylabel ('questo è verticale \ ntest', multialignment = 'center') 'da http://matplotlib.org/examples/pylab_examples/multiline.html – Faber

58

Si può avere il meglio dei due mondi: automatico "fuga" dei comandi LATEX e nuove righe:

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

(invece di usare tre linee, separare le stringhe per singoli spazi è un'altra opzione).

In effetti, Python concatena automaticamente stringhe letterali che si susseguono e si possono mischiare stringhe non elaborate (r"…") e stringhe con interpolazione caratteri ("\n").

+0

Solo un rapido commento: questa era la soluzione perfetta per un modo semplice per etichettare sottotrots con un (a), (b), ecc. quando quell'etichetta deve essere sotto il grafico e centrata con xlabel. In questo modo plt.tight_layout() vede anche l'intera etichetta e si adegua di conseguenza. – SeanM

2

Il seguente script python matplotlib crea il testo con la nuova linea

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

Il seguente non ha nuova linea. Si noti la r prima del testo

ax.text(10, 70, r'shock size \n $n-n_{fd}$') 
7
plt.bar([1, 2], [4, 5]) 
plt.xlabel("My x label") 
plt.ylabel(r"My long label with $\Sigma_{C}$ math" + "\n" + "continues here") 

Basta concatenare le corde con un ritorno a capo che non è in forma di stringa grezza.