NetworkX:中心点

时间:2018-02-17 20:33:56

标签: python python-2.7 matplotlib networkx

我有一个简单的网络,其中有多个不同的“源”连接到一个特定节点。消息来源之间没有边缘。

我正在尝试绘制一个漂亮的圆形图,其中该特定节点在中心处死亡,并且所有源节点整齐地位于围绕该中心节点的圆中,与其具有相同的距离(即半径) 。距离本身没有定义,应该相对于figsize。

我设法将目标节点放在中心,并设法让其他节点形成一个漂亮的圆圈,但不能同时形成两个节点。那就是:

enter image description here

或:

enter image description here

我要做的是将红色节点放在中心。

以下是用于创建图表和图表的代码:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline

n = 283
n_new = 41

df = pd.DataFrame({'source': range(1, n+1),
                   'target':[0]*n,
                   'new_user':[0]*(n-n_new) + [1]*n_new
})

G = nx.from_pandas_dataframe(df, source='source', target='target', create_using=nx.DiGraph())

第一个情节:

plt.figure(figsize=(16,16))

# Node colors
val_map = df.iloc[:,:2].set_index('source').to_dict()['new_user']
val_map[0] = 2
values = [val_map.get(node, 0.25) for node in G.nodes()]

pos = nx.circular_layout(G, scale=2)

node_sizes = [1000] + [200]*283

nx.draw(G, cmap=plt.get_cmap('jet'), node_color=values, font_size=18,
        alpha=0.4, node_size=node_sizes, arrows=True,
               pos=pos)

第二个情节:

plt.figure(figsize=(16,16))

# node colors
val_map = df.iloc[:,:2].set_index('source').to_dict()['new_user']
val_map[0] = 2
values = [val_map.get(node, 0.25) for node in G.nodes()]


# Nodes layout/ position
fixed_positions = {0:(0,0)}
fixed_nodes = fixed_positions.keys()
pos = nx.spring_layout(G,pos=fixed_positions, fixed = fixed_nodes, k=15)
# pos = nx.circular_layout(G, scale=2)

node_sizes = [1000] + [200]*283

nx.draw(G, cmap=plt.get_cmap('jet'), node_color=values, font_size=18,
        alpha=0.4, node_size=node_sizes, arrows=True,
               pos=pos)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

因此函数nx.circular_layout将值分布在原点(0,0)周围的半径为scale的圆上:

  

scale:float(默认值为1)       位置的比例因子,即圆的半径。

所以你需要做的就是定位源节点,在这种情况下是原点的节点0

pos[0] = np.array([0, 0])

pos = nx.circular_layout(G, scale=2)

做你的第一个情节

enter image description here

或者甚至更好,首先将节点围绕圆圈定位而不考虑源,然后添加源:

pos = nx.circular_layout(list(range(1,284)), scale=2)
pos[0] = np.array([0, 0])

这会略微改善您的绘图:

enter image description here