创建图表并设置几个位置:
import networkx as nx
G=nx.Graph()
G.add_edges_from([(1,2),(2,3),(3,1),(1,4)]) #define G
fixed_positions = {1:(0,0),2:(-1,2)}#dict with two of the positions set
fixed_nodes = fixed_positions.keys()
pos = nx.spring_layout(G,pos=fixed_positions, fixed = fixed_nodes)
nx.draw_networkx(G,pos)
您的问题似乎是您在设置固定节点的位置之前计算了所有节点的位置。
在为固定节点设置pos[p]后将pos = nx.spring_layout(G_pc,fixed=fixed_nodes)移动到pos = nx.spring_layout(G_pc,pos=pos,fixed=fixed_nodes)
dictpos 存储每个节点的坐标。您应该快速查看the documentation。特别是,
pos : dict 或 None 可选(默认=None)。
节点的初始位置作为字典,节点作为键,值作为列表或元组。如果没有,则使用随机初始位置。
固定:列表或无可选(默认=无)。
节点保持固定在初始位置。
列表或无可选(默认=无)
您告诉它将这些节点固定在其初始位置,但您没有告诉它们初始位置应该是什么。所以我相信它会随机猜测那个初始位置,并保持它固定。但是,当我对此进行测试时,似乎遇到了错误。看来,如果我告诉(我的版本)networkx 将[1,2] 中的节点固定为固定,但我没有告诉它它们的位置是什么,我会得到一个错误(在这个答案的底部)。所以我很惊讶你的代码正在运行。
关于使用列表推导对代码进行的其他一些改进:
def get_coordinates_in_circle(n):
thetas = [2*np.pi*(float(i)/n) for i in range(n)]
returnlist = [(np.cos(theta),np.sin(theta)) for theta in thetas]
return return_list
G_pc = nx.Graph()
G_pc.add_edges_from(edges_2212)
circular_positions = get_coordinates_in_circle(len(dps_2211))
#it's not clear to me why you don't define circular_positions after
#fixed_nodes with len(fixed_nodes) so that they are guaranteed to
#be evenly spaced.
fixed_nodes = [n for n in G_pc.nodes() if n in production_companies]
pos = {}
for i,p in enumerate(fixed_nodes):
pos[p] = circular_positions[i]
colors = get_node_colors(G_pc, "gender")
pos = nx.spring_layout(G_pc,pos=pos, fixed=fixed_nodes)
nx.draw_networkx_nodes(G_pc, pos, cmap=plt.get_cmap('jet'), node_color=colors, node_size=50, alpha=0.5)
nx.draw_networkx_edges(G_pc,pos, alpha=0.01)
plt.show()
这是我看到的错误:
import networkx as nx
G=nx.Graph()
G.add_edge(1,2)
pos = nx.spring_layout(G, fixed=[1,2])
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-4-e9586af20cc2> in <module>()
----> 1 pos = nx.spring_layout(G, fixed=[1,2])
.../networkx/drawing/layout.pyc in fruchterman_reingold_layout(G, dim, k, pos, fixed, iterations, weight, scale)
253 # We must adjust k by domain size for layouts that are not near 1x1
254 nnodes,_ = A.shape
--> 255 k=dom_size/np.sqrt(nnodes)
256 pos=_fruchterman_reingold(A,dim,k,pos_arr,fixed,iterations)
257 if fixed is None:
UnboundLocalError: local variable 'dom_size' referenced before assignment