基于Label聚类的networkx颜色

networkx color based on Label clustering

我有一个 link 基础数据,我为每个数据做了聚类标签,数据如下所示:id_1 和 id_2 是 linked彼此之间,标签是每个 link.

的簇号
id_1,id_2,label
0,18427,1
1,21708,1
1,22208,1
1,22171,1
1,6829,1
1,16590,1
1,20135,1
1,8894,1
1,15785,1
1,10281,1
etc..

我使用 networkx 库来绘制它们之间的线。

有没有办法像我们在 seaborn 库中那样根据集群标签为数据节点着色?

nx.draw 有很多参数可以让您自定义生成的图。在这种情况下,您想要设置一个依赖于 label 属性的 edge_color。我在这里稍微修改了 labels 以更好地说明这一点。

为了重现您的示例,我从边缘列表生成了图形作为 pandas 数据框,这使得它非常简单。因为我设置了 edge_attr=Truelabel 将是一个属性。因此,我们可以使用 nx.get_edge_attributes.

将其保存为字典

然后我们可以使用 edge_color=list(labels.values()) 设置边缘颜色,选择 cmap 并绘制图形如下:

import matplotlib.cm as cm
from matplotlib import pyplot as plt

G = nx.from_pandas_edgelist(df, source='id_1', target='id_2', edge_attr=True)
cmap = cm.get_cmap('viridis', max(labels.values()))
labels = nx.get_edge_attributes(G, 'label')

plt.figure(figsize=(8,6))
nx.draw(G, with_labels=True, 
        edgelist=list(labels.keys()), 
        edge_color=list(labels.values()),
        edge_cmap= plt.cm.summer, 
        node_color='lightgreen', 
        node_size=1000, width=2)


设置-

s = StringIO('''
id_1,id_2,label
0,18427,1
1,21708,1
1,22208,3
1,22171,4
1,6829,1
1,16590,2
1,20135,3
1,8894,2
1,15785,2
1,10281,2
''')
df = pd.read_csv(s, delim_whitespace=False, sep=',')