如何将边缘类型分类?特别是如何根据 G.edges() 重新索引 df?

How to make edge types into categories? Especially how to reindex the df according to G.edges()?

我正在 networkx 中绘制图表。 使用 pandas 从 csv 中读取节点列表和边缘列表。 edgelist的列包括:'source'、'target'、'value',像这样: 源目标值 一个 B 1 一个 C 2 一个 D 3 乙肝1 HE 2

我需要将颜色映射到每种类型的边缘。 我试图为这个过程申请 pd.Categorical() 。但是,它需要根据集合重新索引 df,我想它指的是 G.edges()。 但是,当我使用 edge = edge.reindex(G.edges() ) 时,edge['value'].cat.codes 变成错误的,像这样:

AB -1 C -1 丁-1 乙肝-1 E -1

源列中的重复节点似乎自动丢失了。这会导致错过颜色到边缘的映射。 如何解决问题?谢谢

如果您尝试将数据框的 value 列用作分类变量来为边缘着色,我认为您不需要对数据框执行任何操作。构建网络时,只需将 value 列作为边缘属性传递即可。

然后,当您绘图时,您可以按边属性列表着色:

import pandas as pd
import networkx as nx
from matplotlib.cm import get_cmap

data = {'source': {0: 'A', 1: 'A', 2: 'A', 3: 'H', 4: 'H'},
        'target': {0: 'B', 1: 'C', 2: 'D', 3: 'B', 4: 'E'},
        'value': {0: 1, 1: 2, 2: 3, 3: 1, 4: 2}}

df = pd.DataFrame.from_dict(data)

G = nx.from_pandas_edgelist(df, edge_attr='value')
colors = [d['value'] for (u, v, d) in G.edges(data=True)]
nx.draw(G, edge_color=colors, edge_cmap=get_cmap('jet'))

给予