从 pandas 数据帧在 python 中的 NetworkX 中创建无向图

Create undirected graph in NetworkX in python from pandas dataframe

我是 python 中 NetworkX 包的新手。我想解决以下问题。

假设这是我的数据集:

import pandas as pd 
d = {'label': [1, 2, 3, 4, 5], 'size': [10, 8, 6, 4, 2], 'dist': [0, 2, -2, 4, -4]}
df = pd.DataFrame(data=d)
df 

df 中的标签和大小是不言自明的。 dist 列测量从最大标签(标签 1)到其余标签的距离。因此,在标签 1 的情况下,dist 为 0。

我想制作类似下图的东西:

其中尺寸最大的标签位于中心位置 (1abel 1)。边是标签 1 到所有其他标签的距离,节点的大小与每个标签的大小成正比。可能吗?

非常感谢您。如果问题不清楚,请告诉我。

import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
for _, row in df.iterrows():
    G.add_node(row['label'], pos=(row['dist'], 0), size=row['size'])
biggest_node = 1
for node in G.nodes:
    if node != biggest_node:
        G.add_edge(biggest_node, node)

nx.draw(G,
        pos={node: attrs['pos'] for node, attrs in G.nodes.items()},
        node_size=[node['size'] * 100 for node in G.nodes.values()],
        with_labels=True
        )
plt.show()

哪个地块

备注:

你会注意到 1-3 和 1-2 中的边缘较粗,因为它们分别与 1-5 和 1-4 中的边缘部分重叠。您可以通过在每个方向上从中心到最远节点只有一条边来解决这个问题,因为每个节点都在同一条线上,所以它看起来是一样的。

coords = [(attrs['pos'][0], node) for node, attrs in G.nodes.items()]
nx.draw(G,
        # same arguments as before and also add
        edgelist=[(biggest_node, min(coords)[1]), (biggest_node, max(coords)[1])]
        )

node_size 参数列表中的 100 因子只是一个比例因子。您可以将其更改为任何您想要的。