如何使用 Pandas 中的列为 networkx 中的节点着色

How to color nodes within networkx using a column in Pandas

我有这个数据集:

    User    Val     Color   
92  Laura   NaN      red
100 Laura   John    red
148 Laura   Mike    red
168 Laura   Mirk    red
293 Laura   Sara    red
313 Laura   Sim     red
440 Martyn  Pierre  orange
440 Martyn  Hugh    orange
440 Martyn  Lauren  orange
440 Martyn  Sim     orange

我想为每个用户(没有重复)分配相应的颜色:在这个例子中,名为劳拉的节点应该是红色的;名为 Martyn 的节点应该是橙色的;其他节点(John、Mike、Mirk、Sara、Sim、Pierrre、Hugh 和 Lauren)应该是绿色的。 我曾尝试使用此列(颜色)通过使用 networkx 在我的代码中定义一组颜色,但该方法似乎是错误的,因为节点没有像我之前描述的那样着色,即正如我所期望的那样。 请看下面我使用的代码:

我正在使用以下代码:

G = nx.from_pandas_edgelist(df, 'User', 'Val')
labels = [i for i in dict(G.nodes).keys()]
labels = {i:i for i in dict(G.nodes).keys()}
colors = df[["User", "Color"]].drop_duplicates()["Color"]

plt.figure(3,figsize=(30,50)) 
pos = nx.spring_layout(G) 
nx.draw(G, node_color = df.Color, pos = pos)
net = nx.draw_networkx_labels(G, pos = pos) 

看来您的方向是正确的,但有几处地方出错了。在使用 drop_duplicates 的同时,构建一个字典并使用它来查找 nx.draw 中的颜色。此外,您不需要构建 labels 字典,nx.draw 可以为您处理。

G = nx.from_pandas_edgelist(df, 'User', 'Val')

d = dict(df.drop_duplicates(subset=['User','Color'])[['User','Color']]
           .to_numpy().tolist())
# {'Laura': 'red', 'Martyn': 'orange'}

nodes = G.nodes()
plt.figure(figsize=(10,6)) 
pos = nx.draw(G, with_labels=True, 
              nodelist=nodes,
              node_color=[d.get(i,'lightgreen') for i in nodes], 
              node_size=1000)