我已经用python编写了一个程序来编写化学图,以下是以下格式的示例:反应物>产物。
H2 > H2
H2 > H2
H2 > H2*
H2 > H2*
H2 > H + H
H2 > H2^
H2 > H* + H
H2 > H + H
H2^ > H2^
H2^ > H^ + H
H2^ > H + H
H3^ > H3^
H3^ > H^ + H2
H3^ > H + H2
H > H
H > H*
H > H^
H^ > H^
H^ > H
H + H2^ > H2 + H^
H2 + H2^ > H + H3^
CF4 > CF4
CF4 > F- + CF3
我希望我的程序为化学中的每个物种在图上创建节点,并绘制反应物与产物之间的路径,其中一个物种仅在图中出现一次,并且该图上的线条表示反应中每种反应物对每种产物的反应在反应中。
我已经编写了以下代码,但是该代码只是将每个反应绘制在地图上,并且没有连接它们,我不确定如何最好地进行反应中常见物种的连接。
import os
import sys
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import copy
try:
data = sys.argv[1]
except IndexError:
print('Insert filename')
sys.exit(1)
def parse_line(line):
new=line.split('>')
reactants=new[0].split('+')
products=new[1].split('+')
return reactants,products
all_edges=[]
edge_labels={}
all_reactants=[]
all_products=[]
with open(data) as fi:
for line in fi.readlines():
line = line.strip()
if not line or line[0] in '#%!':
# skip blank and comment lines
continue
reactants,products = parse_line(line)
for i in np.arange(len(reactants)):
other_reactants=copy.copy(reactants)
other_reactants.remove(reactants[i])
other_reactants=', '.join(other_reactants)
for j in np.arange(len(products)):
edge=(reactants[i],products[j])
all_edges.append(edge)
edge_labels[edge]=other_reactants
gr=nx.DiGraph()
gr.add_edges_from(all_edges)
pos=nx.random_layout(gr)
nx.draw_networkx_nodes(gr,pos,node_size=2000,node_shape='o',node_color='0.75',alpha=10)
nx.draw_networkx_edges(gr,pos, width=0.05,edge_color='b')
nx.draw_networkx_labels(gr, pos,font_size=12, font_color='k', font_weight='normal', alpha=1.0, ax=None)
nx.draw_networkx_edge_labels(gr,pos,edge_labels=edge_labels, label_pos=0.01, ax=None, rotate=False)
plt.show()
有人可以建议我进行此操作的最佳方法吗?我需要一个函数,该函数将识别所有反应中反应物和产物中的常见物种,并为每种独特的物种创建一个节点,并为每种反应物为每种产物创建一条直线。每个反应。
任何帮助将不胜感激
非常感谢你
最佳答案
您似乎遇到的问题之一是您没有从反应的“ qstrings”中剥离解析出的反应物/产物周围的空白。这意味着例如' H2'
和'H2 '
被视为不同的物种,因此在图形中获得了不同的节点。
您可能想通过以下方式处理此问题:
reactants = [s.strip() for s in new[0].split('+')]
products = [s.strip() for s in new[1].split('+')]
在您的
parse_line
函数中。关于python - Python程序用于映射一系列化学 react ,其中唯一的节点仅出现一次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39002631/