Frage:
Der phylogenetische Biopython-Baum ersetzt die Markierungen der Verzweigungsspitzen durch Sequenzlogos
Boris Schnider
2018-05-21 17:41:02 UTC
view on stackexchange narkive permalink

Nachdem ich kürzlich viele phylogenetische Bäume mit dem Modul TreeConstruction from Phylo-Paket von Biopython erstellt habe, wurde ich gebeten, die Beschriftungen der Verzweigungsspitzen durch die entsprechenden Sequenzlogos (die ich im selben Ordner habe) zu ersetzen. Ich dachte, es wäre effizienter, einen Code zu erstellen, um die Logo-Bäume automatisch zu generieren, da ich viele davon erstellen müsste.

Die erste Idee, die ich hatte, war zu sehen, ob Die Funktionen, die zum Erstellen des Baums verwendet wurden, hatten ein Argument, um die Beschriftungen der Verzweigungsspitzen zu ersetzen oder zu entfernen, was ich nicht finden konnte. Daher habe ich die Beschriftungen der Verzweigungsspitzen entfernt, indem ich ihre Schriftgröße auf 0 gesetzt habe: (Im Folgenden finden Sie den Code zum Erstellen des Baums)

  # Module zum Erstellen des Baums aus Bio.Phylo.TreeConstruction import DistanceCalculator, DistanceTreeConstructorfrom Bio.Phylo import drawfrom Bio import Phylo, AlignIOimport subprocessimport matplotlibimport matplotlib.pyplot as pltalignment = AlignIO.read ('MotifSeqAligned.fasta', 'fasta') # Lesen des Ausrichtungsdateikalkulators = ' (Ausrichtung) # distance matrixconstructor = DistanceTreeConstructor () tree = constructor.nj (dm) # Erstellt mit dem Nachbarverbindungsalgorithmus einen Baum aus dmPhylo.write (Baum, 'TreeToCutOff.nwk', 'newick') plt.rc ('font') , size = 0) # steuert die Standardtextgröße #HIER IST DIE EINSTELLUNG, MIT DER ICH DEN ZWEIGTIPP LABELSplt.rc ('Achsen', Titelgröße = 14) # Schriftgröße der Achsen titleplt.rc ('xtick', Beschriftungsgröße) ausblenden kann = 10) # Schriftgröße des Ticksetikettenplt.rc ('ytick', Beschriftungsgröße = 10) # Schriftgröße des Häkchens labelplt.rc ('figure', titleize = 18) # Schriftgröße der Figur titleraw (tree, do_show = False) plt.savefig ("TreeToCutOff.svg", format = 'svg', dpi = 1200)  

Aus diesem Code konnte ich den Baum erhalten: enter image description here

Da ich nicht weiß, wie ich die y-Koordinaten der Zweige ermitteln kann, um die Logos einzeln hinzuzufügen, habe ich mit matplotlib eine Spalte mit Logos erstellt, die ich dann in Python in den Baum einfügen wollte. Der Code zum Erstellen der Logospalte lautet wie folgt:

  #Extraktname aus newicknewickFile = open ("TreeToCutOff.nwk", 'r') extrahieren. Read () orderedLogos = ["{} .eps ".format (i) für i in re.split ('(\ W)', newickFile) wenn" Profile "in i] #Initialize the figurefig = plt.figure () # Fügen Sie jedes Bild nacheinander in hinzu die richtige Reihenfolge für i, Dateien in Aufzählung (geordnete Logos): img1 = mpimg.imread (Dateien) ax1 = fig.add_subplot (len (geordnete Logos), 1, 1 + i) ax1.imshow (img1) ax1.set_xticks ([]) ax1.set_yticks ([]) # plt.show () plt.savefig ("RowsOfLogos.svg", Format = 'svg', dpi = 1200) plt.clf () plt.cla ()  

enter image description here

Da mein Baum und die Logospalte in .svg oder .png enthalten sind, konnte ich sie nicht richtig stapeln. Meine erste Idee war, die Bibliothek svgutils zu verwenden, die mit dem folgenden Code einfach zu handhaben schien: (aus svgutils-Tutorials entnommen)

  svgutils.transform als sg # Assemble # importiere neues SVG erstellen figurefig = sg.SVGFigure ("14cm", "14cm") # load figurenfig1 = sg.fromfile ('TreeToCutOff.svg') fig2 = sg.fromfile ('RowsOfLogos.svg') # erhalte die Plotobjekteplot1 = fig1.getroot ( ) plot2 = fig2.getroot () plot2.moveto (280, 100, scale = 0.05) # Plots und Beschriftungen an figurefig.append ([plot1, plot2]) anhängen  

Aber das Problem mit der Ausgabe war, dass der Hintergrund der Logospalte weiß war und ich daher ein riesiges weißes Bild mit einer dünnen Logospalte auf dem Baum einfügte. Und ich konnte keinen Weg finden, die Logosäule mit Svgutils zu beschneiden. Ich habe versucht, mit dem Modul Image from PIL-Paket einen Baum von Logos aus PNG-Dateien zu erstellen, konnte jedoch den als Hintergrund verwendeten Baum nach dem Einfügen der Logospalte nicht sehen.

Es gibt möglicherweise eine Möglichkeit, mit matplotlib das zu erreichen, was ich anstrebe (nämlich 2 Dateien .png zu stapeln und die Logos die ganze Zeit im gleichen Abstand zu platzieren), aber ich konnte es nicht herausfinden .

Weiß jemand, was die beste Lösung ist, um einen Baum von Logos (wie im folgenden Bild, den ich nur manuell mit inkscape erstellen konnte) mit Python-Bibliotheken zu erstellen, um den Prozess zu automatisieren, ohne sich anpassen zu müssen Der Code hängt von der Anzahl der Zweige ab.

enter image description here

Es folgt eine Teilmenge von "MotifSeqAligned.fasta", die die zum Erstellen verwendeten ausgerichteten Sequenzen enthält die Bäume:

  >ProfileCluster0.meme --- SSNDTTTCCAGGAAD->ProfileCluster1.memeYBNRD --- TTCYYGGAAT->ProfileCluster10.meme --- VDKDWTTCTYGpre   3 entsprechende Logos:  enter image description here  enter image description here  enter image description here  

Das vollständige "MotifSeqAligned.fasta" und alle Die logos.eps (wie ich sie anstelle von .png verwendet habe, dem vom Forum angeforderten Format) finden Sie hier.

Vielen Dank, dass Sie sich so viel Mühe gegeben haben! Wenn ich noch etwas verlangen könnte, wäre es großartig, wenn Sie uns ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) geben könnten, Code, den wir direkt auf unserem verwenden können System, um Ihr Problem zu replizieren, damit wir damit spielen und sehen können, ob wir eine Lösung finden können.
Vielen Dank für den Vorschlag, ich habe die Eingaben am Ende des Themas hinzugefügt. Beachten Sie, dass die Logos .eps-Dateien sind und ich sie hier als Bilder (.png) hinzugefügt habe. Die vollständigen Eingaben finden Sie auf dem Link am Ende des Themas.
Wenn es keine offensichtliche Biopython-Lösung gibt, schauen Sie sich das [ETE Toolkit] an (http://etetoolkit.org).
Einer antworten:
heathobrien
2018-05-22 14:29:01 UTC
view on stackexchange narkive permalink

Um meinen Kommentar von gestern zu erweitern. Sie können dies mit dem ETE Toolkit tun (ich habe nur eine Logo-Datei kopiert, anstatt alle 26 von ete3 in png ):

  zu konvertieren Importieren Sie Tree, TreeStyle ,acesdef mylayout (node): Wenn node.is_leaf (): logo_face = features.ImgFace (str.split (node.name, '.') [0] + ".png") # ist dies nicht der Fall scheinen mit EPS-Dateien zu funktionieren. Sie können auch andere Formate ausprobieren. Faces.add_face_to_node (logo_face, node, column = 0) node.img_style ["size"] = 0 # Entfernen Sie blaue Punkte aus nodest = Tree ("tree.nwk", format = 3) ts = TreeStyle ( ) ts.layout_fn = mylayoutts.show_leaf_name = False # Sequenz entfernen labelsts.scale = 10000 # Verzweigungslängen neu skalieren, damit sie länger als die Breite der logost.render sind ("formatierte.png", tree_style = ts, h = 3000, w = 3000) # Möglicherweise müssen Sie mit den Abmessungen und der Skalierung herumspielen, um das gewünschte Aussehen zu erhalten.  

enter image description here

Wenn Sie möchten Alle in einer Spalte aufgereihten Logos fügen align = True zu faces.add_face_to_node

hinzu
Vielen Dank! Genau das habe ich gesucht! Ich werde es mit all meinen Logos versuchen und Sie wissen lassen, wenn ich weitere Probleme habe.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...