使用NetworkX / PyGraphviz绘制多图:微调节点/边缘位置

时间:2018-11-10 00:02:58

标签: python networkx graph-theory graphviz pygraphviz

我想用NetworkX或多或少地复制下图(摘自F. Crick,《自然》 227,561(1970)):

enter image description here

我可以使用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')

enter image description here

这非常接近我想要的,但是我在弄清楚一些更好的细节时遇到了麻烦:

  • 使用circo布局,是否可以将“ DNA”节点居中于图的顶部?如果没有,如何控制每个节点的绝对位置?

  • 如何调整自身边缘(例如“ DNA”->“ DNA”边缘)的位置,使其与原始图中的边缘更相似?

1 个答案:

答案 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;将所提到的节点排成一行