来自不同数据集的节点属性
Node's attributes from a different dataset
我需要合并来自不同数据集的一些信息来构建一个包含节点、边和节点属性的数据集。
第一个数据集(df1)是这样的:
Node Edge
A B
A D
B N
B A
B X
S C
第二个数据集包括唯一节点及其属性:
Node Attribute
A -1
B 0
C -1.5
D 1
...
N 1
...
X 0
Y -1.5
W -1.5
Z 1
我想使用第一个数据集 (df1) 中的链接创建一个图表,根据属性值对节点着色:
- if -1.5 then grey
- if -1 then red
- if 0 then orange
- if 1 then yellow
- if 1.5 then green
为了构建图表,我可以使用
G = nx.from_pandas_edgelist(edges, source='Node', target='Edge')
然后我需要设置上述分配颜色的规则并将它们添加为节点的属性。
我的问题是如何将这些规则包含在节点的属性中。
主要问题是将属性 DataFrame 变成更有用的东西。我们可以通过 set_index
to Node, and map
当前属性数值转换为颜色来创建从节点到颜色的映射:
import networkx as nx
import pandas as pd
edges_df = pd.DataFrame({
'Node': ['A', 'A', 'B', 'B', 'B', 'S'],
'Edge': ['B', 'D', 'N', 'A', 'X', 'C']
})
# Abridged but contains values for all nodes in `edges_df`
attributes_df = pd.DataFrame({
'Node': ['A', 'B', 'C', 'D', 'N', 'S', 'X'],
'Attribute': [-1, 0, -1.5, 1, 1, 1.5, 0]
})
mapper = {-1.5: 'grey', -1: 'red', 0: 'orange', 1: 'yellow', 1.5: 'green'}
colour_map = attributes_df.set_index('Node')['Attribute'].map(mapper)
colour_map
:
Node
A red
B orange
C grey
D yellow
N yellow
S green
X orange
Name: Attribute, dtype: object
*注意:值1.5
和节点S
均未在上述属性数据集中表示,因此设置了所有节点都带有颜色并表示所有颜色S
1.5
在 attributes_df
colour_map
可以用于 set_node_attributes
:
G = nx.from_pandas_edgelist(edges_df, source='Node', target='Edge')
# Add Attribute to each node
nx.set_node_attributes(G, colour_map, name="colour")
# Then draw with colours based on attribute values:
nx.draw(G,
node_color=nx.get_node_attributes(G, 'colour').values(),
with_labels=True)
或者我们可以通过 reindexing
基于 Graph 节点直接使用系列(不创建节点属性),以确保颜色的出现顺序与它们在 G.nodes()
中的顺序相同,这确保了正确的颜色与正确的节点对齐:
G = nx.from_pandas_edgelist(edges_df, source='Node', target='Edge')
# Then draw with colours based on the Series:
nx.draw(G,
node_color=colour_map.reindex(G.nodes()),
with_labels=True)
无论哪种方法,我们都会得到如下图表:
我需要合并来自不同数据集的一些信息来构建一个包含节点、边和节点属性的数据集。
第一个数据集(df1)是这样的:
Node Edge
A B
A D
B N
B A
B X
S C
第二个数据集包括唯一节点及其属性:
Node Attribute
A -1
B 0
C -1.5
D 1
...
N 1
...
X 0
Y -1.5
W -1.5
Z 1
我想使用第一个数据集 (df1) 中的链接创建一个图表,根据属性值对节点着色:
- if -1.5 then grey
- if -1 then red
- if 0 then orange
- if 1 then yellow
- if 1.5 then green
为了构建图表,我可以使用
G = nx.from_pandas_edgelist(edges, source='Node', target='Edge')
然后我需要设置上述分配颜色的规则并将它们添加为节点的属性。 我的问题是如何将这些规则包含在节点的属性中。
主要问题是将属性 DataFrame 变成更有用的东西。我们可以通过 set_index
to Node, and map
当前属性数值转换为颜色来创建从节点到颜色的映射:
import networkx as nx
import pandas as pd
edges_df = pd.DataFrame({
'Node': ['A', 'A', 'B', 'B', 'B', 'S'],
'Edge': ['B', 'D', 'N', 'A', 'X', 'C']
})
# Abridged but contains values for all nodes in `edges_df`
attributes_df = pd.DataFrame({
'Node': ['A', 'B', 'C', 'D', 'N', 'S', 'X'],
'Attribute': [-1, 0, -1.5, 1, 1, 1.5, 0]
})
mapper = {-1.5: 'grey', -1: 'red', 0: 'orange', 1: 'yellow', 1.5: 'green'}
colour_map = attributes_df.set_index('Node')['Attribute'].map(mapper)
colour_map
:
Node
A red
B orange
C grey
D yellow
N yellow
S green
X orange
Name: Attribute, dtype: object
*注意:值1.5
和节点S
均未在上述属性数据集中表示,因此设置了所有节点都带有颜色并表示所有颜色S
1.5
在 attributes_df
colour_map
可以用于 set_node_attributes
:
G = nx.from_pandas_edgelist(edges_df, source='Node', target='Edge')
# Add Attribute to each node
nx.set_node_attributes(G, colour_map, name="colour")
# Then draw with colours based on attribute values:
nx.draw(G,
node_color=nx.get_node_attributes(G, 'colour').values(),
with_labels=True)
或者我们可以通过 reindexing
基于 Graph 节点直接使用系列(不创建节点属性),以确保颜色的出现顺序与它们在 G.nodes()
中的顺序相同,这确保了正确的颜色与正确的节点对齐:
G = nx.from_pandas_edgelist(edges_df, source='Node', target='Edge')
# Then draw with colours based on the Series:
nx.draw(G,
node_color=colour_map.reindex(G.nodes()),
with_labels=True)
无论哪种方法,我们都会得到如下图表: