基于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]
})