-
Notifications
You must be signed in to change notification settings - Fork 0
/
tree2phyloxml.py
55 lines (39 loc) · 1.32 KB
/
tree2phyloxml.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import sys
from Bio import Phylo
import matplotlib.pyplot as plt
ifile = sys.argv[1]
ofile = sys.argv[2]
childs = dict()
nodes = set()
for line in open(ifile):
c = line.strip().split(' ')
n = int(c[0])
p = int(c[1])
if p not in childs:
childs[p] = list()
childs[p].append(n)
nodes.add(p)
nodes.add(n)
def write_node(off, node, indent):
off.write(('\t'*indent)+'<clade>\n')
off.write(('\t'*indent)+'<name>'+str(node)+'</name>\n')
if node in childs:
for c in childs[node]:
write_node(off,c, indent+1)
off.write(('\t'*indent)+'</clade>\n')
off = open(ofile, 'w')
off.write('<?xml version="1.0" encoding="UTF-8"?>\n')
off.write('<phyloxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.phyloxml.org http://www.phyloxml.org/1.10/phyloxml.xsd" xmlns="http://www.phyloxml.org">\n')
off.write('<phylogeny rooted="true">')
off.write('<name>A PANPROVA tree</name>\n')
write_node(off, -1,1)
off.write('</phylogeny>\n')
off.write(' </phyloxml>\n')
off.flush()
off.close()
tree = Phylo.read(ofile, "phyloxml")
tree.ladderize() # Flip branches so deeper clades are displayed at top
fig = plt.figure(figsize=(20, len(nodes)/10), dpi=300)
axes = fig.add_subplot(1, 1, 1)
Phylo.draw(tree, axes=axes, do_show=False)
plt.savefig(ofile+'.png')