鱼C论坛

 找回密码
 立即注册
查看: 1548|回复: 1

[已解决]绘制德布鲁因图绘制出来了但报错了

[复制链接]
发表于 2023-9-22 17:48:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import numpy as np
  2. # 冗余序列不影响k_mer数量
  3. def getk_mer(str):
  4.     global k
  5.     n = len(str)
  6.     k_mer = []
  7.     step = n - k + 1
  8.     for i in range(step):
  9.         k_mer.append(str[i:i + k])
  10.     return k_mer
  11. # 对这条reads的反向互补序列再取一次Kmer
  12. def getinverst(str):
  13.     return str[::-1]

  14. k = int(input("输入k值:"))
  15. seq = input("输入序列:")
  16. list_seq = seq.split(" ")

  17. list_kmer = []
  18. for s in list_seq:
  19.     k_mer = getk_mer(s)
  20.     list_kmer.append(k_mer[:])

  21. new_list = np.array(list_kmer).flatten()   #flatten 扁平化,压成一维
  22. new_list = new_list.tolist()
  23. print(new_list)


  24. list_kmer_inv = []
  25. inverst = getinverst(seq)
  26. list_inv = inverst.split(" ")
  27. # print(inverst)
  28. for i in list_inv:
  29.     k_mer_inv = getk_mer(i)
  30.     list_kmer_inv.append(k_mer_inv[:])

  31. new_list_inv = np.array(list_kmer_inv).flatten()   #flatten 扁平化,压成一维
  32. new_list_inv = new_list_inv.tolist()
  33. print(new_list_inv)

  34. # 将reads分割成若干k_mer,可以统计各k_mer出现的次数,
  35. # 最多的次数为深度,深度可以估计基因组大小

  36. def getdbg(seq):
  37.     global k
  38.     length = len(seq)
  39.     overlap = k - 1
  40.     minigraph = {}
  41.     graph = {}
  42.     for i in range(length):
  43.         if i == length - 1:
  44.             break
  45.         mininode = seq[i][:overlap]
  46.         mininextnode = seq[i][1:overlap + 1]
  47.         node = seq[i][:k]
  48.         nextnode = seq[i + 1][:k + 1]
  49.         if mininode not in minigraph:
  50.             minigraph[mininode] = []
  51.         if node not in graph:
  52.             graph[node] = []
  53.         minigraph[mininode].append(mininextnode)
  54.         graph[node].append(nextnode)
  55.     return minigraph,graph

  56. minigraph = getdbg(new_list)[0]
  57. graph = getdbg(new_list)[1]
  58. print(graph)

  59. # ACTGCCTGACTA
  60. for node in graph:
  61.     print(node, '->', ', '.join(graph[node]))

  62. # print(list(graph.keys())[0],"-->",graph[0],"-->",)

  63. def getnum(dic):
  64.     listlen = []
  65.     for _,value in dic.items():
  66.         m = len(value)
  67.         listlen.append(m)
  68.     return listlen


  69. a = []
  70. n = len(new_list)
  71. listlen = getnum(graph)
  72. keys = list(graph.keys())
  73. lastkey = keys[-1]
  74. lastvalue = graph[lastkey]
  75. # keys.append()

  76. for i in range(n - 1):
  77.     if i == 0:
  78.         temp = keys[0]
  79.         a.append(temp)
  80.         m = keys.index(temp)  # 修改:将该节点在字典中的位置赋值给 m
  81.         t = temp  # 修改:将 temp 赋值给 t(上一节点)
  82.     # if a[-1] == lastvalue:
  83.     #     break
  84.     print('1',t)

  85.     # else:  # 更新变量 t 和 m
  86.     t = a[-1]  # 修改:将 a 的最后一个元素(上一节点)赋值给 t
  87.     # print('1',t)
  88.     m = keys.index(t)  # 修改:将 t 在字典中的位置赋值给 m

  89.     num_kids = listlen[m]  # 该节点的子节点个数
  90.     a.append(graph[t][0])
  91.     if num_kids > 1:
  92.         graph[t].pop(0)
  93.         listlen[m] = num_kids - 1

  94. print(a)


  95. import networkx as nx
  96. import matplotlib.pyplot as plt

  97. # 创建有向图
  98. G = nx.DiGraph()

  99. # 添加节点和边
  100. nodes = a
  101. # nodes1 = ['A', 'B', 'C']
  102. # nodes2 = [1, 2, 3]
  103. edges = [(a[i],a[i + 1])for i in range(len(a) - 1) ]
  104. # edges = [('A', 1), ('B', 2), ('C', 3)]

  105. G.add_nodes_from(nodes)
  106. # G.add_nodes_from(nodes2)
  107. G.add_edges_from(edges)

  108. # 绘制有向图
  109. pos = nx.spring_layout(G) # 设置节点位置
  110. nx.draw_networkx_nodes(G, pos, nodelist=nodes, node_color='r', node_size=500) # 绘制节点1
  111. # nx.draw_networkx_nodes(G, pos, nodelist=nodes2, node_color='b', node_size=500) # 绘制节点2
  112. nx.draw_networkx_labels(G, pos) # 绘制节点标签
  113. nx.draw_networkx_edges(G, pos, edgelist=edges, edge_color='black', arrows=True) # 绘制边

  114. plt.axis('off') # 关闭坐标轴
  115. plt.show() # 显示图形

  116. # CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCTGCGAGATATAG

  117. nodes = list(graph.keys())
  118. edges = []
  119. for node, targets in graph.items():
  120.     edges.extend((node, target) for target in targets)

  121. # 创建图形对象
  122. fig, ax = plt.subplots(figsize=(10, 10))

  123. # 绘制节点和边
  124. for edge in edges:
  125.     ax.annotate("", xy=(nodes.index(edge[1]), nodes.index(edge[0])), xycoords='data',
  126.                 xytext=(0, 10), textcoords='offset points',
  127.                 arrowprops=dict(arrowstyle="->", color='black'))

  128. # 绘制节点标签
  129. for i, node in enumerate(nodes):
  130.     ax.annotate(node, xy=(i, 0), xycoords='data',
  131.                 xytext=(0, -30), textcoords='offset points',
  132.                 ha='center', va='center', fontsize=12, fontweight='bold')
复制代码



所有print都有,图片也有,但关掉图片之后报错:
Traceback (most recent call last):
  File "E:\Pycharm\pythonProject\ROSALIND\DBG.py", line 154, in <module>
    ax.annotate("", xy=(nodes.index(edge[1]), nodes.index(edge[0])), xycoords='data',
ValueError: 'CTA' is not in list
最佳答案
2023-9-22 17:48:11
这个错误是由于节点列表nodes中没有包含边列表edges中的某个节点导致的。在这个特定的例子中,节点列表nodes是由字典graph的键组成的,而edges是由字典graph的键和对应值组成的元组列表。因此,出现这个错误的原因是edges中有一个元组包含一个不在nodes中的节点。检查字典graph中的节点是否正确,并确保节点列表nodes包含所有字典graph中的节点。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-22 17:48:11 | 显示全部楼层    本楼为最佳答案   
这个错误是由于节点列表nodes中没有包含边列表edges中的某个节点导致的。在这个特定的例子中,节点列表nodes是由字典graph的键组成的,而edges是由字典graph的键和对应值组成的元组列表。因此,出现这个错误的原因是edges中有一个元组包含一个不在nodes中的节点。检查字典graph中的节点是否正确,并确保节点列表nodes包含所有字典graph中的节点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表