2015-04-02 51 views
5

Sto utilizzando il pacchetto Phylo di Biopython per creare alberi filogenetici.In python, come posso modificare la dimensione del font dei nodi foglia quando si generano alberi filogenetici usando Bio.Phylo.draw()?

Per alberi grandi, ho bisogno di diminuire il carattere dei nodi foglia. È stato suggerito di cambiare matplotlib.pyplot.rcParams ['font.size'] ma questo mi permette solo di cambiare nomi e titoli degli assi, dato che Phylo definisce le proprie dimensioni dei caratteri. Non riesco a cambiare il codice sorgente Phylo mentre lo sto usando all'Università. La definizione di figure o assi non è un'opzione in quanto Phylo.draw() ne crea uno proprio.

Qualcuno ha qualche suggerimento su come risolvere il problema, magari allungando l'asse y?

Finora ho usato il seguente codice per produrre l'albero:

import matplotlib 
import matplotlib.pyplot as plt 
from Bio import Phylo 
from cStringIO import StringIO 

def plot_tree(treedata, output_file): 

    handle = StringIO(treedata) # parse the newick string 
    tree = Phylo.read(handle, "newick") 
    matplotlib.rc('font', size=6) 
    Phylo.draw(tree) 
    plt.savefig(output_file) 

    return 

Plot

risposta

3

Phylo.draw() può prendere come argomento gli assi. Dalla documentazione del metodo Biopython è possibile leggere le seguenti

assi: matplotlib/pylab assi Se un'istanza matplotlib.axes.Axes valida, il phylogram è tracciata in quel Assi. Per impostazione predefinita (Nessuno), viene creata una nuova figura.

Ciò significa che è possibile caricare i propri assi con le dimensioni desiderate. Per esempio

import matplotlib 
import matplotlib.pyplot as plt 
from Bio import Phylo 
from cStringIO import StringIO 

def plot_tree(treedata, output_file): 
    handle = StringIO(treedata) # parse the newick string 
    tree = Phylo.read(handle, "newick") 
    matplotlib.rc('font', size=6) 
    # set the size of the figure 
    fig = plt.figure(figsize=(10, 20), dpi=100) 
    # alternatively 
    # fig.set_size_inches(10, 20) 
    axes = fig.add_subplot(1, 1, 1) 
    Phylo.draw(tree, axes=axes) 
    plt.savefig(output_file, dpi=100) 

    return 

Fammi sapere se questo funziona per voi. Fábio

+0

Perfetto, grazie mille, questo è esattamente quello che volevo. Un'altra cosa che potresti anche sapere è come estendere il numero massimo di caratteri dei nodi foglia. Come puoi vedere, alcuni nomi sono abbreviati e completati con '...' – madcap

+0

@madcap Come hai fatto per le dimensioni del carattere prova qualcosa che si occupa della larghezza della linea (rcParams ["lines.linewidth"]). Potrebbe funzionare. Se no fammi sapere che guarderò oltre. Puoi in qualche modo inviarmi il tuo albero di esempio in modo che io possa effettivamente giocare con esso? Fábio –

+0

Provare la seguente parte dell'albero in cui cinque dei nomi dei nodi foglia sono troppo lunghi e non vengono visualizzati completamente. – madcap