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

问题描述

我需要帮助来绘制networkx有向图。我有一个有向图,它是根据一个数据帧创建的,如下所示:

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

然后,在使用Node2Vec将节点转换为嵌入后,我使用肘部+ 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颜色值,然后根据权重值在数据框中创建一个名为color的列:

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,则可以基于color列添加新列weight,如下所示:

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')

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...