更改networkx图中节点的顺序/位置

时间:2019-06-19 11:56:22

标签: python pandas matplotlib networkx

我有一个熊猫数据框,并希望根据该数据框绘制网络。当前图如下: enter image description here

它从右上角开始,到左一个。如果我下次绘制它,它可能会有不同的起始位置,如何避免呢?而且,如何将起始节点设置在左上角的左端,而将结束节点(我也可以预先拒绝)设置在右下角?

到目前为止,我的代码是:

###make the graph based on my dataframe
G3 = nx.from_pandas_edgelist(df2, 'Activity description', 'Activity followed', create_using=nx.DiGraph(), edge_attr='weight')

#plot the figure and decide about the layout
plt.figure(3, figsize=(18,18))
pos = nx.spring_layout(G3, scale=2)

#draw the graph based on the labels
nx.draw(G3, pos, node_size=500, alpha=0.9, labels={node:node for node in G3.nodes()})

#make weights with labels to the edges
edge_labels = nx.get_edge_attributes(G3,'weight')
nx.draw_networkx_edge_labels(G3, pos, edge_labels = edge_labels)
plt.title('Main Processes')

#save and plot the ifgure
plt.savefig('StandardProcessflow.png')
plt.show() 

我使用的软件包是networkx和matlotlib

1 个答案:

答案 0 :(得分:2)

您可以使用spring_layout的{​​{3}}属性来防止图形节点移动每个绘制:

  

种子

     

(int, RandomState instance or None optional (default=None)) –设置确定性节点布局的随机状态。如果为int,则seed为随机数生成器使用的种子;如果为numpy.random.RandomState实例,则seed为随机数生成器;如果为None,则随机数生成器为随机数生成器使用的RandomState实例。 numpy.random。

或自己指定布局,例如:

pos = {
    1: [0, 1],
    2: [2, 4]
    ...
}

您可以同时使用两种方法:

G3 = nx.Graph()
G3.add_weighted_edges_from([
    (1,2,1),
    (2,3,2),
    (3,4,3),
    (3,6,1),
    (4,5,4)
])

pos = nx.spring_layout(G3, scale=2, seed=84)
pos[1] = [-20, 0]
pos[5] = [20, 0]

nx.draw(
    G3,
    pos,
    node_size=500,
    alpha=0.9,
    labels={node:node for node in G3.nodes()}
)

edge_labels = nx.get_edge_attributes(G3,'weight')
nx.draw_networkx_edge_labels(G3, pos, edge_labels = edge_labels)

seed

如果要在特殊位置设置特定节点,可以使用它。