如果我使用Biopython Phylo模块创建系统发育树,它是从左到右的,例如:
import matplotlib.pyplot as plt
from Bio import Phylo
from io import StringIO
handle = StringIO("(((A,B),(C,D)),(E,F,G));")
tree = Phylo.read(handle, "newick")
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
Phylo.draw(tree, axes=ax, do_show=False)
plt.savefig("./tree_rect.png")
plt.close(fig)
生产
如果我现在尝试使用matplotlib的内置极坐标变换将其转换为循环树,我会得到:
fig, ax = plt.subplots(subplot_kw=dict(polar=True), figsize=(6, 6))
Phylo.draw(tree, axes=ax, do_show=False)
plt.savefig("./tree_circ.png")
plt.close(fig)
我获得
也就是说matplotlib将y轴作为径向轴,x轴作为Angular 。这与我获得正确布局所需的相反,我可以这样做,例如,使用ete3:
from ete3 import Tree, TreeStyle
t = Tree("(((A,B),(C,D)),(E,F,G));")
circular_style = TreeStyle()
circular_style.mode = "c"
circular_style.scale = 20
t.render("tree_ete3.png", w=183, units="mm", tree_style=circular_style)
(How)这可以用生物Phylo来完成吗?我想可能性是
- 更改
Phylo.draw
中的布局,使树向上 - 告诉matplotlib polar transformation使用x轴作为径向向量,y轴作为Angular
但我不知道如何做到这两点(以及是否可以做到这一点)。
相关问题:Python: How to convert a phylogenetic tree into a circular format?
1条答案
按热度按时间5jdjgkvh1#
这里是一个例子,在matplotlib极坐标图中交换“
x
“和“y
“坐标,以便径向系统发育树正确分支下面,我将展示代码中的缩放参数(
'Scale'
→z
)如何影响生成的树,并提供普通的Bio.Phylo.draw(tree)
版本的Map进行比较。可以做进一步的细节工作来模拟在分支点处绘制极圈圆周(即弧)的部分,就像通常在径向系统发育图中看到的那样。而且,照目前的情况,在这里对坐标进行的变换似乎在圆内和整个圆内的完美平衡延伸方面做得不好。
plot_tree
:ax.plot([y1, y2], [x1, x2], "k-")
中x和y坐标的交换。