我正在构建基因组学中我们称为“变异图”的方法,但在弄清楚如何使用Networkx进行操作时遇到了麻烦。我愿意创建自己的代码或其他图形包。
总体目的是比较下面的两个图,以计算在每个位置上发现nucelotide(A,G,T,C)的次数,然后返回每个位置上具有最高计数的字母以达成共识顺序。
首先,我需要构建一个图,该图首先创建一个参考图,如上面的第一行所示,跟踪在每个位置找到的字母(核苷酸)。
因此,对于下面的第一张图,每个节点将以以下位置命名:
node_list = [0,1,2,3,4,5,6,7,8]
具有以下优势:
edges = [
(A,T),
(T,C),
(C,G),
(G,A),
(A,A),
(A,T),
(T,A),
(A,C)]
然后代表图片第二行所示的变体,我们将在位置2和4之间添加替代边以表示空节点,并在位置7和8之间添加替代边以表示插入的“ T”。
由于图形需要跟踪多个有向边,因此我尝试了Networkx MultiDiGraph,但是在维护顺序和管理重复边方面遇到了麻烦。
我最终想对每个边缘增加权重,以计算在每个位置看到一个核苷酸(字母)的次数,并使用该信息来确定遍历图表。因此,在表格格式中,我想要的输出如下所示,显示每个字母在某个位置被看到的次数:
pos | A | T | G | C
0 53 29 101 23
1 153 9 10 555
2 53 29 72 13
3 53 29 101 23
4 53 29 101 39
5 53 29 101 39
6 53 29 101 39
7 53 29 101 39
8 154 9 10 66
从这些数据中,我将返回一个共识序列:
GCGGGGGGA
这是到目前为止我得到的代码:
testRef = "GTCTAGGTCTAGGTCTAGAGTTAG"
start = 100
def create_edgelist(seq, truncate=True):
while len(seq) >= 2:
yield seq[:2]
seq = seq[1:]
if len(seq) and not truncate:
yield seq
G = nx.MultiDiGraph()
# add each ref node to graph by pos, nuc
[G.add_node(x + int(start)) for x,y in enumerate(testRef)]
for x, y in create_edgelist(testRef):
G.add_edge(x, y)