我想用NetworkX或多或少地复制下图(摘自F. Crick,《自然》 227,561(1970)):
我可以使用MultiDiGraph
重现基础图:
import networkx as nx
g = nx.MultiDiGraph()
weakEdges = [('RNA', 'DNA'), ('RNA', 'RNA'), ('RNA', 'protein')]
strongEdges = [('DNA', 'DNA'), ('DNA', 'RNA'), ('DNA', 'protein')]
g.add_edges_from(weakEdges)
g.add_edges_from(strongEdges)
,但是显然内置的matplotlib绘图不支持平行边,这是正确的多重图形所必需的。
另一方面,我可以将g
转换为PyGraphviz AGraph
并进行绘制:
a = nx.nx_agraph.to_agraph(g)
for etup in weakEdges:
a.get_edge(*etup).attr['style'] = 'dashed'
a.draw('test2.png', prog='circo')
这非常接近我想要的,但是我在弄清楚一些更好的细节时遇到了麻烦:
使用circo
布局,是否可以将“ DNA”节点居中于图的顶部?如果没有,如何控制每个节点的绝对位置?
如何调整自身边缘(例如“ DNA”->“ DNA”边缘)的位置,使其与原始图中的边缘更相似?
答案 0 :(得分:0)
使用普通的Graphviz /点语法进行的小型设置(将其馈送到http://www.webgraphviz.com/并可以看到结果):
digraph X {
{rank=same; RNA Protein}
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
}
基本部分在这里:
:n
放置阵列的位置(其他可能性是其他风向,例如:nw
)。rank=same;
将所提到的节点排成一行