微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您如何从具有组节点和值边的数据帧构建 networkx 可视化?

如何解决您如何从具有组节点和值边的数据帧构建 networkx 可视化?

如果我有以下数据框:

import pandas as pd

df = pd.DataFrame({'group' : ['A','B','C','D','A','B'],'value' : ['green','blue','orange','pink','green','black','yellow','yellow']})

我将如何清理数据以构建 networkx 可视化,将 df['group']显示为“节点”,而常见 df['value'] 值的数量决定了之间连接的粗细节点?

解决方法

我假设您指的是最简单的情况:无向图,没有自循环,仅计算每个 value 中显示为 group 的独特颜色。

如果您在上面的评论中另有说明,我会更改此答案。

from itertools import combinations
import networkx as nx


d = df.groupby('group').agg({'value': lambda x: x.tolist()}).to_dict()['value']

combos = list(combinations(d.keys(),2))
edge_lst = [(combo[0],combo[1],len(set(d[combo[0]]) & set(d[combo[1]])))
         for combo in combos if len(set(d[combo[0]]) & set(d[combo[1]])) > 0]

g = nx.Graph()
g.add_nodes_from(d)
g.add_weighted_edges_from(edge_lst)

给出 g.nodes() 作为

NodeView(('A','B','C','D'))

g.edges(data=True)

EdgeDataView([('A',{'weight': 2})])

如果你想用 edge_width 与边的权重成正比来做一个非常简单的可视化:

pos = nx.spring_layout(g)
edgewidth = [g[u][v]['weight'] for u,v in g.edges()]
nx.draw_networkx_nodes(g,pos)
nx.draw_networkx_edges(g,pos,width=edgewidth)
nx.draw_networkx_labels(g,pos)
plt.show()

network_viz

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。