基于Dataframe创建加权图
Create a weighted graph based on Dataframe
考虑这样的数据框:
id
source
Target
Weight
1
A
B
1
2
A
C
2
3
A
D
3
4
A
E
4
我想用 networkX 描绘一个图表,它向我们展示了两件事:
1-具有更多连接的节点分别具有更大的尺寸。
权重更大的 2-Edge 之间的线更粗。
我们可以在创建图形 from_pandas_edgelist
then when we draw the graph we can get_edge_attributes
时将 edge_attr
设置为权重,并将其作为任何绘图操作的 width
传递。
对于node_size
,我们可以使用nx.degree
从图中获取度数:
nx.degree(G)
[('A', 4), ('B', 1), ('C', 1), ('D', 1), ('E', 1)]
然后我们可以通过一些因素扩大程度,因为这些值将非常小。我在这里选择了 200 的系数,但这可以调整:
[d[1] * 200 for d in nx.degree(G)]
[800, 200, 200, 200, 200]
加起来看起来像:
G = nx.from_pandas_edgelist(
df,
source='source',
target='Target',
edge_attr='Weight' # Set Edge Attribute to Weight Column
)
# Get Degree values and scale
scaled_degree = [d[1] * 200 for d in nx.degree(G)]
nx.draw(G,
# Weights Based on Column
width=list(nx.get_edge_attributes(G, 'Weight').values()),
# Node size based on degree
node_size=scaled_degree,
# Colour Based on Degree
node_color=scaled_degree,
# Set color map to determine colours
cmap='rainbow',
with_labels=True)
plt.show()
使用的设置:
import networkx as nx
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame({
'id': [1, 2, 3, 4],
'source': ['A', 'A', 'A', 'A'],
'Target': ['B', 'C', 'D', 'E'],
'Weight': [1, 2, 3, 4]
})
考虑这样的数据框:
id | source | Target | Weight |
---|---|---|---|
1 | A | B | 1 |
2 | A | C | 2 |
3 | A | D | 3 |
4 | A | E | 4 |
我想用 networkX 描绘一个图表,它向我们展示了两件事:
1-具有更多连接的节点分别具有更大的尺寸。
权重更大的 2-Edge 之间的线更粗。
我们可以在创建图形 from_pandas_edgelist
then when we draw the graph we can get_edge_attributes
时将 edge_attr
设置为权重,并将其作为任何绘图操作的 width
传递。
对于node_size
,我们可以使用nx.degree
从图中获取度数:
nx.degree(G)
[('A', 4), ('B', 1), ('C', 1), ('D', 1), ('E', 1)]
然后我们可以通过一些因素扩大程度,因为这些值将非常小。我在这里选择了 200 的系数,但这可以调整:
[d[1] * 200 for d in nx.degree(G)]
[800, 200, 200, 200, 200]
加起来看起来像:
G = nx.from_pandas_edgelist(
df,
source='source',
target='Target',
edge_attr='Weight' # Set Edge Attribute to Weight Column
)
# Get Degree values and scale
scaled_degree = [d[1] * 200 for d in nx.degree(G)]
nx.draw(G,
# Weights Based on Column
width=list(nx.get_edge_attributes(G, 'Weight').values()),
# Node size based on degree
node_size=scaled_degree,
# Colour Based on Degree
node_color=scaled_degree,
# Set color map to determine colours
cmap='rainbow',
with_labels=True)
plt.show()
使用的设置:
import networkx as nx
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame({
'id': [1, 2, 3, 4],
'source': ['A', 'A', 'A', 'A'],
'Target': ['B', 'C', 'D', 'E'],
'Weight': [1, 2, 3, 4]
})