使用 python 将 newick 转换为 graphml
conversion newick to graphml using python
我想将一棵树从 newick 转换为像 graphml 这样的格式,我可以用 cytoscape 打开它。
所以,我有一个文件 "small.newick",其中包含:
((raccoon:1,bear:6):0.8,((sea_lion:11.9, seal:12):7,((monkey:100,cat:47):20, weasel:18):2):3,dog:25);
到目前为止,我是这样做的 (Python 3.6.5 |Anaconda):
from Bio import Phylo
import networkx
Tree = Phylo.read("small.newick", 'newick')
G = Phylo.to_networkx(Tree)
networkx.write_graphml(G, 'small.graphml')
Clade 有问题,我可以使用此代码修复:
from Bio import Phylo
import networkx
def clade_names_fix(tree):
for idx, clade in enumerate(tree.find_clades()):
if not clade.name:
clade.name=str(idx)
Tree = Phylo.read("small.newick", 'newick')
clade_names_fix(Tree)
G = Phylo.to_networkx(Tree)
networkx.write_graphml(G, 'small.graphml')
给我一些看起来不错的东西:
我的问题是:
这样做好吗?我觉得这个函数不处理内部节点名称似乎很奇怪
如果你用一个足够长的字符串替换一个节点名,它会被命令Phylo.to_networkx(Tree)修剪掉。如何避免这种情况?
示例:将 "dog" 替换为 "test_tring_that_create_some_problem_later_on"
看来您已经在这方面取得了很大进展。我只能对你的方法提出一些建议 alternatives/extensions...
遗憾的是,我找不到可以读取这种格式的 Cytoscape 应用程序。我尝试搜索 PHYLIP、NEWICK 和 PHYLO。你可能有更多的运气:
有一个旧的 Cytoscape 2.x 插件可以读取这种格式,但是要 运行 这个你需要安装 Cytoscape 2.8.3,导入网络,然后导出为 xGMML(或另存为 CYS),然后尝试在 Cytoscape 3.7 中打开,以便迁移回动态代码领域。话又说回来,如果 2.8.3 满足您对这种特殊情况的需求,那么也许您不需要迁移:
最好的方法是程序化,您已经探索过了。找到将 NEWICK 转换为 iGraph 或 GraphML 的 R 或 Python 包是一个可靠的策略。请注意,这些语言也有更新和灵活的 Cytoscape 库,因此您可以在脚本环境中进行所有标签清理、布局、数据可视化、分析、导出等:
经过一些研究,我实际上找到了一个可行的解决方案。
我决定在这里为您link提供,亲爱的reader:
going to github
供遇到此问题的任何人参考,我认为此处提到的第一个问题现已在 BioPython 中得到解决。使用与上述相同的数据,构建的 networkx 图包含树的所有内部节点以及终端节点。
import matplotlib.pyplot as plt
import networkx
from Bio import Phylo
Tree = Phylo.read("small.newick", 'newick')
G = Phylo.to_networkx(Tree)
networkx.draw_networkx(G)
plt.savefig("small_graph.png")
规格:
Python 3.8.10,
生物 1.78,
网络 x 2.5
我想将一棵树从 newick 转换为像 graphml 这样的格式,我可以用 cytoscape 打开它。
所以,我有一个文件 "small.newick",其中包含:
((raccoon:1,bear:6):0.8,((sea_lion:11.9, seal:12):7,((monkey:100,cat:47):20, weasel:18):2):3,dog:25);
到目前为止,我是这样做的 (Python 3.6.5 |Anaconda):
from Bio import Phylo
import networkx
Tree = Phylo.read("small.newick", 'newick')
G = Phylo.to_networkx(Tree)
networkx.write_graphml(G, 'small.graphml')
Clade 有问题,我可以使用此代码修复:
from Bio import Phylo
import networkx
def clade_names_fix(tree):
for idx, clade in enumerate(tree.find_clades()):
if not clade.name:
clade.name=str(idx)
Tree = Phylo.read("small.newick", 'newick')
clade_names_fix(Tree)
G = Phylo.to_networkx(Tree)
networkx.write_graphml(G, 'small.graphml')
给我一些看起来不错的东西:
我的问题是:
这样做好吗?我觉得这个函数不处理内部节点名称似乎很奇怪
如果你用一个足够长的字符串替换一个节点名,它会被命令Phylo.to_networkx(Tree)修剪掉。如何避免这种情况?
示例:将 "dog" 替换为 "test_tring_that_create_some_problem_later_on"
看来您已经在这方面取得了很大进展。我只能对你的方法提出一些建议 alternatives/extensions...
遗憾的是,我找不到可以读取这种格式的 Cytoscape 应用程序。我尝试搜索 PHYLIP、NEWICK 和 PHYLO。你可能有更多的运气:
有一个旧的 Cytoscape 2.x 插件可以读取这种格式,但是要 运行 这个你需要安装 Cytoscape 2.8.3,导入网络,然后导出为 xGMML(或另存为 CYS),然后尝试在 Cytoscape 3.7 中打开,以便迁移回动态代码领域。话又说回来,如果 2.8.3 满足您对这种特殊情况的需求,那么也许您不需要迁移:
最好的方法是程序化,您已经探索过了。找到将 NEWICK 转换为 iGraph 或 GraphML 的 R 或 Python 包是一个可靠的策略。请注意,这些语言也有更新和灵活的 Cytoscape 库,因此您可以在脚本环境中进行所有标签清理、布局、数据可视化、分析、导出等:
经过一些研究,我实际上找到了一个可行的解决方案。 我决定在这里为您link提供,亲爱的reader: going to github
供遇到此问题的任何人参考,我认为此处提到的第一个问题现已在 BioPython 中得到解决。使用与上述相同的数据,构建的 networkx 图包含树的所有内部节点以及终端节点。
import matplotlib.pyplot as plt
import networkx
from Bio import Phylo
Tree = Phylo.read("small.newick", 'newick')
G = Phylo.to_networkx(Tree)
networkx.draw_networkx(G)
plt.savefig("small_graph.png")
规格: Python 3.8.10, 生物 1.78, 网络 x 2.5