如何将边缘类型分类?特别是如何根据 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'))
给予
我正在 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'))
给予