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

将节点添加到固定主干使用graphviz绘制networkx图时,一些较大的节点最终会挤在一起,graph,graphviz,networkx,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=la

我使用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中添加新节点而不更改旧节点似乎有点棘手。可以“锁定”节点,但我不确定如何在networkx中执行此操作

这是图形当前的外观:


你的想法似乎是合理的。下面的代码生成一个图形,将初始位置分配给节点1和2,然后使用
nx.spring\u 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])}

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

你的想法似乎是合理的。下面的代码生成一个图形,将初始位置分配给节点1和2,然后使用
nx.spring\u 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])}
对于您的情况,您将获得主干的位置,然后将这些节点用作固定列表