使用
绘制一个clique图import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))
生成以下图片:
显然,需要增加节点之间的间隔(例如,边缘长度)。我用谷歌搜索了这里,发现this suggestion:
对于某些布局算法,有一个“scale”参数 可能有帮助。 e.g。
在1中:将networkx导入为nx
在2中:G = nx.path_graph(4)
在[3]中:pos = nx.spring_layout(G)#default to scale = 1
在[4]中:nx.draw(G,pos)
在[5]中:pos = nx.spring_layout(G,scale = 2)#所有之间的双倍距离 节点
在[6]中:nx.draw(G,pos)
但是,scale
参数似乎没有任何效果。
获得更好绘图的正确方法是什么?
答案 0 :(得分:31)
好吧,我对这个问题的回答为时已晚。但是这个问题的解决方案在于NetworkX版本1.8尚未发布,但可以通过git hub获得。
执行以下操作以增加节点之间的距离:
pos = nx.spring_layout(G,k=0.15,iterations=20)
# k controls the distance between the nodes and varies between 0 and 1
# iterations is the number of times simulated annealing is run
# default k =0.1 and iterations=50
调整这些参数以查看其工作原理。但尽管如此,并不能保证所有节点都不重叠
答案 1 :(得分:5)
对您的问题的真实答案是您的原始图形不是单个fully-connected component。它是三个单独的图。
正在发生的事情是,三个零件飞到了无穷远,这在重新缩放后使每个组件看起来像一个微小的斑点。
算法spring_layout
指定所有节点之间的排斥力(反重力),以及 相连的节点之间的吸引力(“弹簧” )。
因此,如果未连接图形,则由于没有连接它们,各个零件将飞离排斥力。有两个选项:更改力定律(编辑networkx代码),或分别绘制零件图。
这是增加力将所有节点吸引到图表中心的方法。将此代码段的最后一行添加到layouts.py中的def _fruchterman_reingold
:
# displacement "force"
displacement = np.einsum('ijk,ij->ik',
delta,
(k * k / distance**2 - A * distance / k))
# ADD THIS LINE - prevent things from flying off into infinity if not connected
displacement = displacement - pos / ( k * np.sqrt(nnodes))
这一行代码使您可以制作如下图表: 而不是 但是,解决此问题的“最佳”方法是分别绘制组件图。
您可以使用here中描述的功能遍历组件,将它们绘制在单独的图中。
有关更多讨论,请参见this github issue。
答案 2 :(得分:3)
我使用了Kamada Kawai布局的最佳距离参数,并将非连接组件之间的距离设置为图表中的最大距离。可能有更好的方法来修改字典,但这很容易:
df = pd.DataFrame(index=G.nodes(), columns=G.nodes())
for row, data in nx.shortest_path_length(G):
for col, dist in data.items():
df.loc[row,col] = dist
df = df.fillna(df.max().max())
layout = nx.kamada_kawai_layout(G, dist=df.to_dict())