根据网络中的条件为特定节点着色

Coloring specific nodes based on a condition within a network

我有一个数据集,其中包含按名为 time

的变量排序的帐户列表
Account Time
13124    1
215732   2 
76239    3
76054    4
975235   

我还有一个图表,其中考虑了完整的帐户列表:

Account1 Account2
13124    215732
215732   418954
5130953  214182
760524   5398723
975235   13124

该图是使用 networkx 构建的:

G = nx.from_pandas_edgelist(df, 'Account1', 'Account2')

我想通过突出显示基于时间的节点来可视化网络中顶部列表(帐户时间)中的节点。 这可以通过以下方式实现:

我想更好地了解如何 select(着色)仅网络中顶部列表中的节点。

实现此目的的一种方法是创建颜色图并将其与与节点关联的时间配对,然后使用 nx.draw 函数的 node_color 参数为节点着色。您还可以通过创建空的占位符散点图来为您的节点设置图例。有关更多详细信息,请参见下面的代码:

import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
from matplotlib import cm

df=pd.read_fwf('graph.txt') #(Account1, Account2) dataframe
df_time=pd.read_fwf('timestamp.txt') #(Account, Time) dataframe

G = nx.from_pandas_edgelist(df,'Account1', 'Account2')

#Setting up colormap
N_colors=4
cm_dis=np.linspace(0, 1,N_colors) 
colors = [ cm.viridis(x) for x in cm_dis]
color_edges=[]

#Pairing each node with the a color associated with time of the node
for node in G:
    temp=df_time.loc[df_time['Account']==node] #Finding time of node 

    if temp.empty or temp['Time'].isnull().values.any(): #Checking if there is atime associated to node

      color='tab:orange'
      if color not in color_edges: #Setting up legend
        plt.scatter([],[],color='tab:orange',label='No time')
      color_edges.append(color) 
      
    else:

      color=colors[int(temp['Time'])]

      if color not in color_edges:
         plt.scatter([],[],color=color, label='Time:'+str(int(temp['Time'])))
      color_edges.append(color)

#Drawing graph and legend
nx.draw(G,with_labels=True,node_color=color_edges)
plt.legend()
plt.show()

此代码的输出为: