使用聚类标签作为配色方案绘制 Networkx 有向图

Draw Networkx Directed Graph using clustering labels as color scheme

我需要帮助绘制 networkx 有向图。我有一个从数据框创建的有向图,如下所示:

source    target    weight
ip_1      ip_2      3
ip_1      ip_3      6
ip_4      ip_3      7
.
.
.

之后,在使用 Node2Vec 将节点转换为嵌入后,我使用 elbow+kmeans 对该图进行了聚类:

https://github.com/eliorc/node2vec

最后,我得到了这个结果数据框:

source    target    weight    source_kmeans_label    target_kmeans_label    elbow_optimal_k
ip_1      ip_2      3         0                      1                      12
ip_1      ip_3      6         2                      0                      12
ip_4      ip_3      7         0                      3                      12
.
.
.

我想根据肘值使用不同的颜色可视化(绘制)此图(源、目标、权重);所以对于上面的例子,我会有 12 种不同的颜色。我非常感谢任何帮助实现这一目标,谢谢。

您可以使用 seaborn palette 生成 12 个不同的 RGB 颜色值,然后根据权重值在数据框中创建一个名为颜色的列:

import seaborn as sns
import networkx as nx
from pyvis.network import Network

palette = sns.color_palette("husl", n_colors=12)  # n_colors is your elbow value

假设您的数据框名为 df,您可以根据 weight 列添加新列 color,如下所示:

df['color'] = df.apply(lambda row: palette[row['weight'] - 1], axis=1)

现在您已经为每条边设置了 RGB 值,首先您需要根据数据框制作图表,然后您可以使用 pyvis:

可视化图表
G = nx.from_pandas_edgelist(df, 'source', 'target', edge_attr='color', create_using=nx.DiGraph())
N = Network(height='100%', width='100%', bgcolor='white', font_color='black', directed=True)

for n in G.nodes:
    N.add_node(n)
for e, attrs in G.edges.data():
    N.add_edge(e[0], e[1], color=attrs['color'])

N.write_html('path/to/your_graph.html')