我不肯定你的问题是什么.我想你在问“如何让networkx将一些节点放在一起”
因此,您所询问的这个数字有4个不同的社区,这些社区基于每个社区内有很多边缘而在外部并不多.
如果你不想付出太多努力,spring_layout通常适合将紧密结合的社区放在一起. spring_layout的基本算法就像边缘是弹簧(和节点排斥)一样.因此,许多边缘使节点靠近在一起.请注意,它会随机初始化位置,因此每次您获得不同的输出.
最简单的方法就是这样做
nx.draw_spring(G)
但也许你想要更多.如果您愿意,可以修复每个节点的位置.定义一个dict,通常命名为pos.
pos = {}
for node in G.nodes_iter():
pos[node] = (xcoord, ycoord).
其中xcoord和ycoord是您希望节点所在的坐标.
然后就做
draw_networkx(G,pos = pos)
这通常需要付出很多努力.所以有时你只是说它们中的一些必须在特定的地方,让networkx做其余的事情
为几个节点定义fixedpos然后运行
spring_layout
告诉它什么节点被修复并给它fixedpos作为初始位置.然后它将固定那些固定并适合其他一切.
这里有一些代码生成一个网络,它有4个完全连接的部分和它们之间的一些其他边. (实际上它会生成一个完整的网络,然后删除这些部分之间的所有边缘).然后它用简单的弹簧布局绘制它.然后它将它们中的4个固定在正方形的角落,并将其他节点放在那些固定位置周围.
import networkx as nx
import random
import pylab as py
from math import floor
G = nx.complete_graph(20)
for edge in G.edges():
if floor(edge[0]/5.)!=floor(edge[1]/5.):
if random.random()<0.95:
G.remove_edge(edge[0],edge[1])
nx.draw_spring(G)
py.show()
fixedpos = {1:(0,0), 6:(1,1), 11:(1,0), 16:(0,1)}
pos = nx.spring_layout(G, fixed = fixedpos.keys(), pos = fixedpos)
nx.draw_networkx(G, pos=pos)
py.show()
您还可以为边指定权重,将权重传递给spring_layout,较大的权重将告诉它将相应的节点保持在一起.因此,一旦确定了社区,就必须在社区/群集中增加权重,以便将它们保持在一起.
请注意,您还可以指定每个节点的颜色,因此可以直接指定每个社区/群集的颜色.
如果你想在每个簇周围绘制曲线,你必须通过matplotlib来做到这一点.