如何从具有组(节点)和值(边)的数据框中构建 networkx 可视化?
How do you build a networkx visualization from dataframe with groups (nodes) and values (edges)?
如果我有以下数据框:
import pandas as pd
df = pd.DataFrame({'group' : ['A', 'B', 'B', 'C', 'B', 'B', 'D', 'A', 'A', 'C', 'B'],
'value' : ['green', 'blue', 'orange', 'pink', 'green', 'green', 'black', 'yellow',
'green','pink','yellow']})
我将如何清理数据以构建 networkx
可视化效果,将 df['group']
值显示为 'nodes',而常见 df['value']
值的数量决定厚度节点之间的连接?
我假设您指的是最简单的情况:无向图,没有自循环,只计算每个 group
.
显示为 value
的唯一颜色
如果您在上面的评论中另有说明,我会更改此答案。
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', 'B', {'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()
给予
如果我有以下数据框:
import pandas as pd
df = pd.DataFrame({'group' : ['A', 'B', 'B', 'C', 'B', 'B', 'D', 'A', 'A', 'C', 'B'],
'value' : ['green', 'blue', 'orange', 'pink', 'green', 'green', 'black', 'yellow',
'green','pink','yellow']})
我将如何清理数据以构建 networkx
可视化效果,将 df['group']
值显示为 'nodes',而常见 df['value']
值的数量决定厚度节点之间的连接?
我假设您指的是最简单的情况:无向图,没有自循环,只计算每个 group
.
value
的唯一颜色
如果您在上面的评论中另有说明,我会更改此答案。
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', 'B', {'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()
给予