识别网络中最中心的节点(使用 Networkx)
Identify the most central nodes in a network (using Networkx)
我正在尝试生成查看特定节点的子图。具体来说,我希望使用不同的颜色和标签,只看到那些在我的图中具有高度中心性或介数中心性的节点。例如,可以使用 Zachary 的空手道俱乐部模型(我的图表是无向的)。
为了计算度中心性和介数,我使用了以下函数(在 NetworkX 中):
degCent = nx.degree_centrality(G)
betCent = nx.betweenness_centrality(G, normalized=True, endpoints=True)
我的图表由大约 5000 个节点组成(所以不是一个巨大的图表),我只对基于度数和中介中心性的前 10 个节点感兴趣,只是想看看这些节点与谁相连以及它们在哪里位于然后图表中。
我的方法是 select 根据度中心性和介数中心性分配不同颜色的前 10 个节点(如果它们在 degree/betweenness 中心性列表的前 10 名中则为绿色;否则为红色),将网络中的节点过滤为 select 只有那些感兴趣的节点(也为它们分配一个标签,只是为了查看它们在网络中的位置)。
我们绝对欢迎任何帮助和建议。
这是一种执行您描述的操作的方法。首先,让我们生成一个带有 fast_gnp_random_graph
的随机图来说明这个过程。从那里,您可以使用 nx.degree_centrality
和 nx.betweenness_centrality
计算度中心度度量和中间中心度度量。因为您只对每个度量的前 10 个节点感兴趣,所以您可以按降序对结果进行排序并保留前 10 个项目。请注意,前 10 个度数节点可能与前 10 个中间节点不同。找到每个度量的前 10 个节点后,您可以将颜色关联到该节点。下面,如果节点不属于任何前 10 名,则节点为 lightsteelblue
,如果它们仅属于前 10 度中心性的一部分,则为 tab:orange
,如果它们仅属于前 10 名,则为 tab:blue
10 betweeness centrality 和 tab:green
如果它们都是前 10 名的一部分。最后,您可以绘制结果并设置图例。
请参阅下面的代码:
import networkx as nx
from networkx.generators import *
import numpy as np
import matplotlib.pyplot as plt
N_nodes=50
G=fast_gnp_random_graph(N_nodes,p=0.1,seed=0)
#Computing centrality
degCent = nx.degree_centrality(G)
#Descending order sorting centrality
degCent_sorted=dict(sorted(degCent.items(), key=lambda item: item[1],reverse=True))
#Computing betweeness
betCent = nx.betweenness_centrality(G, normalized=True, endpoints=True)
#Descending order sorting betweeness
betCent_sorted=dict(sorted(betCent.items(), key=lambda item: item[1],reverse=True))
#Color for regular nodes
color_list=N_nodes*['lightsteelblue']
#Getting indices on top 10 nodes for each measure
N_top=10
colors_top_10=['tab:orange','tab:blue','tab:green','lightsteelblue']
keys_deg_top=list(degCent_sorted)[0:N_top]
keys_bet_top=list(betCent_sorted)[0:N_top]
#Computing centrality and betweeness intersection
inter_list=list(set(keys_deg_top) & set(keys_bet_top))
#Setting up color for nodes
for i in inter_list:
color_list[i]=colors_top_10[2]
for i in range(N_top):
if keys_deg_top[i] not in inter_list:
color_list[keys_deg_top[i]]=colors_top_10[0]
if keys_bet_top[i] not in inter_list:
color_list[keys_bet_top[i]]=colors_top_10[1]
#Draw graph
pos= nx.circular_layout(G)
nx.draw(G,pos,with_labels=True,node_color=color_list)
#Setting up legend
labels=['Top 10 deg cent','Top 10 bet cent','Top 10 deg and bet cent','no top 10']
for i in range(len(labels)):
plt.scatter([],[],label=labels[i],color=colors_top_10[i])
plt.legend(loc='center')
plt.show()
并且输出给出:
下面是将相同方法应用于 Zachary 的空手道俱乐部数据集的结果。只有前两行代码发生了变化。我替换了
N_nodes=50
G=fast_gnp_random_graph(N_nodes,p=0.1,seed=0)
和
G = nx.karate_club_graph()
N_nodes=G.number_of_nodes()
并且输出给出:
我正在尝试生成查看特定节点的子图。具体来说,我希望使用不同的颜色和标签,只看到那些在我的图中具有高度中心性或介数中心性的节点。例如,可以使用 Zachary 的空手道俱乐部模型(我的图表是无向的)。
为了计算度中心性和介数,我使用了以下函数(在 NetworkX 中):
degCent = nx.degree_centrality(G)
betCent = nx.betweenness_centrality(G, normalized=True, endpoints=True)
我的图表由大约 5000 个节点组成(所以不是一个巨大的图表),我只对基于度数和中介中心性的前 10 个节点感兴趣,只是想看看这些节点与谁相连以及它们在哪里位于然后图表中。
我的方法是 select 根据度中心性和介数中心性分配不同颜色的前 10 个节点(如果它们在 degree/betweenness 中心性列表的前 10 名中则为绿色;否则为红色),将网络中的节点过滤为 select 只有那些感兴趣的节点(也为它们分配一个标签,只是为了查看它们在网络中的位置)。
我们绝对欢迎任何帮助和建议。
这是一种执行您描述的操作的方法。首先,让我们生成一个带有 fast_gnp_random_graph
的随机图来说明这个过程。从那里,您可以使用 nx.degree_centrality
和 nx.betweenness_centrality
计算度中心度度量和中间中心度度量。因为您只对每个度量的前 10 个节点感兴趣,所以您可以按降序对结果进行排序并保留前 10 个项目。请注意,前 10 个度数节点可能与前 10 个中间节点不同。找到每个度量的前 10 个节点后,您可以将颜色关联到该节点。下面,如果节点不属于任何前 10 名,则节点为 lightsteelblue
,如果它们仅属于前 10 度中心性的一部分,则为 tab:orange
,如果它们仅属于前 10 名,则为 tab:blue
10 betweeness centrality 和 tab:green
如果它们都是前 10 名的一部分。最后,您可以绘制结果并设置图例。
请参阅下面的代码:
import networkx as nx
from networkx.generators import *
import numpy as np
import matplotlib.pyplot as plt
N_nodes=50
G=fast_gnp_random_graph(N_nodes,p=0.1,seed=0)
#Computing centrality
degCent = nx.degree_centrality(G)
#Descending order sorting centrality
degCent_sorted=dict(sorted(degCent.items(), key=lambda item: item[1],reverse=True))
#Computing betweeness
betCent = nx.betweenness_centrality(G, normalized=True, endpoints=True)
#Descending order sorting betweeness
betCent_sorted=dict(sorted(betCent.items(), key=lambda item: item[1],reverse=True))
#Color for regular nodes
color_list=N_nodes*['lightsteelblue']
#Getting indices on top 10 nodes for each measure
N_top=10
colors_top_10=['tab:orange','tab:blue','tab:green','lightsteelblue']
keys_deg_top=list(degCent_sorted)[0:N_top]
keys_bet_top=list(betCent_sorted)[0:N_top]
#Computing centrality and betweeness intersection
inter_list=list(set(keys_deg_top) & set(keys_bet_top))
#Setting up color for nodes
for i in inter_list:
color_list[i]=colors_top_10[2]
for i in range(N_top):
if keys_deg_top[i] not in inter_list:
color_list[keys_deg_top[i]]=colors_top_10[0]
if keys_bet_top[i] not in inter_list:
color_list[keys_bet_top[i]]=colors_top_10[1]
#Draw graph
pos= nx.circular_layout(G)
nx.draw(G,pos,with_labels=True,node_color=color_list)
#Setting up legend
labels=['Top 10 deg cent','Top 10 bet cent','Top 10 deg and bet cent','no top 10']
for i in range(len(labels)):
plt.scatter([],[],label=labels[i],color=colors_top_10[i])
plt.legend(loc='center')
plt.show()
并且输出给出:
下面是将相同方法应用于 Zachary 的空手道俱乐部数据集的结果。只有前两行代码发生了变化。我替换了
N_nodes=50
G=fast_gnp_random_graph(N_nodes,p=0.1,seed=0)
和
G = nx.karate_club_graph()
N_nodes=G.number_of_nodes()
并且输出给出: