在使用graphviz绘制networkx图时,将节点添加到固定主干网,一些较大的节点最终被挤在一起

时间:2015-07-23 19:38:52

标签: graph graphviz networkx

我使用networkx创建了一个图表。我正在使用graphviz绘制图形,特别是这些代码行:

pos = nx.graphviz_layout(G2, prog='neato', args='-Goverlap=prism')

plt.figure(figsize=(10, 14))

nx.draw(G2, pos, node_size=sizes, alpha=1, nodelist=nodes, node_color=colors, with_labels=True, labels=labelDict, font_size=8)

图表由一个"骨干"一些较大的节点,连接了几百个较小的节点。

我使用args='-Goverlap=prism'(在上面的第一行代码中)来分隔图表,但这造成了一个问题。重要的是更大的节点间隔开来,但是,由于有多少个小节点,一些较大的节点最终被挤在一起。

我对解决方案的想法是生成仅包含较大节点的图形以确保它们间隔适当,然后将较小的节点添加到此图形而不更改原始节点的布局。我做了一些研究,在graphviz中添加新节点而不改变旧节点似乎有些棘手。有可能" pin"节点,但我不确定如何在networkx中执行此操作。

这就是图表目前的样子:

enter image description here

1 个答案:

答案 0 :(得分:0)

你的想法似乎很合理。以下代码生成图形,为节点1和2分配初始位置,然后使用nx.spring_layout为所有节点分配位置。我允许节点2移动,但节点1保持固定。

import networkx as nx
G=nx.path_graph(6)
originalpos = {1:(0,0), 2:(1,0)}
newpos = nx.spring_layout(G, pos=originalpos, fixed=[1])
newpos
> {0: array([-0.39442754, -0.35733777]),
 1: array([ 0.,  0.]),
 2: array([ 0.44050048,  0.3734393 ]),
 3: array([ 0.8658906 ,  0.80306291]),
 4: array([ 1.21367619,  1.27878715]),
 5: array([ 1.45676553,  1.72154196])}

对于您的情况,您将获得主干的位置,然后将这些节点用作固定列表。