根据网络中的条件为特定节点着色
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')
我想通过突出显示基于时间的节点来可视化网络中顶部列表(帐户时间)中的节点。
这可以通过以下方式实现:
- 要么绘制多个显示不同时间的图
- 或绘制图表,仅根据打开时间为节点着色。对于那些不在图中或没有分配时间的节点(例如,975235),最好分配一个默认颜色来区分它们。
我想更好地了解如何 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()
此代码的输出为:
我有一个数据集,其中包含按名为 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')
我想通过突出显示基于时间的节点来可视化网络中顶部列表(帐户时间)中的节点。 这可以通过以下方式实现:
- 要么绘制多个显示不同时间的图
- 或绘制图表,仅根据打开时间为节点着色。对于那些不在图中或没有分配时间的节点(例如,975235),最好分配一个默认颜色来区分它们。
我想更好地了解如何 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()
此代码的输出为: