【问题标题】:Plotting multigraphs with NetworkX/PyGraphviz: fine tuning node/edge position使用 NetworkX/PyGraphviz 绘制多重图:微调节点/边缘位置
【发布时间】:2019-04-13 13:26:15
【问题描述】:

我想使用 NetworkX 或多或少地重现下图(来自 F. Crick, Nature 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”边缘)的位置,使其更接近原始图中的位置?

【问题讨论】:

    标签: python networkx graph-theory graphviz pygraphviz


    【解决方案1】:

    一个简单的 Graphviz / dot 语法的小设置(将它提供给http://www.webgraphviz.com/ 并且可以看到结果):

    digraph X {
    {rank=same; RNA Protein}
    DNA -> RNA
    DNA -> Protein
    Protein -> RNA
    DNA:n -> DNA:n
    }
    

    基本部分在这里:

    • :n 获取阵列的位置(其他可能性是其他风向,包括例如:nw)。
    • rank=same; 将提到的节点对齐在一行中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-02
      • 2023-04-05
      • 2016-03-08
      • 2015-03-08
      • 2012-10-24
      • 2021-06-03
      • 2014-04-08
      • 2016-02-22
      相关资源
      最近更新 更多