我有一个简单的网络,其中有多个不同的“源”连接到一个特定节点。消息来源之间没有边缘。
我正在尝试绘制一个漂亮的圆形图,其中该特定节点在中心处死亡,并且所有源节点整齐地位于围绕该中心节点的圆中,与其具有相同的距离(即半径) 。距离本身没有定义,应该相对于figsize。
我设法将目标节点放在中心,并设法让其他节点形成一个漂亮的圆圈,但不能同时形成两个节点。那就是:
或:
我要做的是将红色节点放在中心。
以下是用于创建图表和图表的代码:
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)
感谢您的帮助!
答案 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)
或者甚至更好,首先将节点围绕圆圈定位而不考虑源,然后添加源:
pos = nx.circular_layout(list(range(1,284)), scale=2)
pos[0] = np.array([0, 0])
这会略微改善您的绘图: