2011-12-22 11 views
14

Io uso matplotlib per creare una figura con 4 sub-plot in essa.dividere il titolo di una figura in matplotlib

Vorrei suddividere uno dei miei titoli di sottotrama, in modo tale che ogni riga sia centrata rispetto a sottotrama.

ho cercato

import matplotlib.pylab as plt 

fig = plt.figure(num=0,figsize=(8.27, 11.69), dpi=300) 
ax = fig.add_subplot(2, 2, 1) 
ax.set_title(r'Normalized occupied \\ Neighbors') 

e quello che ottengo è che Neighbors è trattino lato sinistro.

Come posso correggere questo?

risposta

22

ho l'allineamento corretto quando formatto la stringa in questo modo:

import matplotlib.pylab as plt 

fig = plt.figure()#num=0,figsize=(8.27, 11.69), dpi=300) 
ax = fig.add_subplot(2, 2, 1) 
ax.set_title('Normalized occupied \n Neighbors') 

plt.show() 

enter image description here

7

Una soluzione migliore che è compatibile con r prefisso (soprattutto quando si ha la necessità di utilizzare LaTeX markup) è quello dividere il testo del titolo in due (o più parti), ad esempio,

import matplotlib.pylab as plt 

fig = plt.figure() 
plt.title('My Title\n' + r'$\alpha - \omega$ are LaTeX Markup') 
plt.plot([1,2,3,4]) 
plt.show() 
+0

grazie per il tuo commento - potrei avere 2 righe nel titolo e le proprietà separate per entrambi? Come caratteri più grandi e grassetto per la riga superiore e normale per il più basso? – spiff

0

In aggiunta alle risposte precedenti, se qualcuno vuole automatizzare l'operazione, ho codificato una funzione per renderla più semplice. ecco che:

def split_title_line(title_text, split_on='(', max_words=5): # , max_words=None): 
    """ 
    A function that splits any string based on specific character 
    (returning it with the string), with maximum number of words on it 
    """ 
    split_at = title_text.find (split_on) 
    ti = title_text 
    if split_at > 1: 
     ti = ti.split (split_on) 
     for i, tx in enumerate (ti[1:]): 
      ti[i + 1] = split_on + tx 
    if type (ti) == type ('text'): 
     ti = [ti] 
    for j, td in enumerate (ti): 
     if td.find (split_on) > 0: 
      pass 
     else: 
      tw = td.split() 
      t2 = [] 
      for i in range (0, len (tw), max_words): 
       t2.append (' '.join (tw[i:max_words + i])) 
      ti[j] = t2 
    ti = [item for sublist in ti for item in sublist] 
    ret_tex = [] 
    for j in range (len (ti)): 
     for i in range(0, len(ti)-1, 2): 
      if len (ti[i].split()) + len (ti[i+1].split()) <= max_words: 
       mrg = " ".join ([ti[i], ti[i+1]]) 
       ti = [mrg] + ti[2:] 
       break 

    if len (ti[-2].split()) + len (ti[-1].split()) <= max_words: 
     mrg = " ".join ([ti[-2], ti[-1]]) 
     ti = ti[:-2] + [mrg] 
    return '\n'.join (ti) 

Esempi:

In: split_title_line ('Primary school completion (% of girls)')

out:

Primary school completion 
(% of girls) 

In:split_title_line ('Primary school completion in the country as % of girls') Out:

Primary school completion in the 
country as % of girls 

Per la vostra domanda per dividere titoli in matplotlib o giù di lì, è possibile aggiungere questo ax.set_title(split_title_line(r'Normalized occupied Neighbors', max_words=2))

auguro che tutti i benefici da questa .

Problemi correlati