python - 具有重复的有序节点和/或边的 Python Networkx 或 igraph DAG
问题描述
问题
我正在努力在基因组学中构建我们所谓的“变异图”,但我无法弄清楚如何使用 Networkx 来做到这一点。我愿意创建自己的代码或其他图形包。
目的
总体目的是比较下面的两张图,以计算在每个位置找到了多少次核苷酸(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)
解决方案
推荐阅读
- java - 异常处理 Camel Apache
- node.js - Twitter - 我只收到来自 user_timeline 的 20 条推文
- c# - 获取除 IndexFields 和 BatchFields 之外的 KofaxValues
- python - 如何使这种“裁剪”/背景颜色更改功能更有效?
- pandas - 不同条件的买入和卖出信号
- django-models - Django - 邮政编码问题
- c# - 如何使用 VRTK 创建自定义光线投射
- angular - 如何在角度中使用 *ngFor 获取多个值
- javascript - 从对象的子数组中删除数组的每个元素?
- javascript - 需要专家帮助如何在jQuery中只选择第一段