基于Pandas Dataframe生成带权重边的网络图,解决Pyvis边长度一致问题
解决Pyvis网络图边权重体现长度差异的问题
你的问题核心是没有在代码中利用权重值控制边的长度,且未启用支持权重影响的布局算法。以下是修改后的实现方案:
关键修改点
- 给边绑定实际权重值,让布局算法能读取到权重
- 使用支持权重影响的布局(比如Force Atlas 2),并开启边权重对长度的影响
- 避免重复添加节点
- 正确显示边的权重标签
修改后的完整代码
import pandas as pd from IPython.display import display, HTML from pyvis.network import Network df = pd.read_csv('sample_data.csv') # 初始化网络图,可自定义尺寸 got_net = Network(notebook=True, cdn_resources='in_line', height='800px', width='100%') # 先收集所有唯一节点,避免重复添加 all_nodes = pd.concat([df['from'], df['to']]).unique() for node in all_nodes: got_net.add_node(node, title=node) # 遍历边数据,绑定权重 for _, row in df.iterrows(): src = row['from'] dst = row['to'] w = row['weight'] # 添加边时传入权重值,同时显示权重标签 got_net.add_edge(src, dst, label=str(w), value=w) # 生成邻居信息(保留原有逻辑) neighbor_map = got_net.get_adj_list() for node in got_net.nodes: node['title'] += ' 邻居: ' + ', '.join(neighbor_map[node['id']]) node['value'] = len(neighbor_map[node['id']]) # 启用Force Atlas 2布局,开启边权重对长度的影响 # edge_weight_influence值越大,权重对边长度的影响越明显 # 如果weight是距离(值越大边应该越长)用正数值;如果是相似度(值越大边越短)用负数值 got_net.force_atlas_2based(edge_weight_influence=1.0) # 保存并展示图 got_net.save_graph('graph.html') display(HTML("graph.html"))
额外说明
- 布局调整:Force Atlas 2是Pyvis中支持边权重影响的核心布局,
edge_weight_influence参数可根据数据情况调整(比如0.5~2.0区间),优化边长度的区分度。 - 权重映射:如果需要让权重和边长度的关联更贴合需求,可以对原始权重值做转换(比如用
1/w让距离越大的边更短,或w*0.1缩放影响程度)后再传入value参数。 - 多CSV处理:如果有多个CSV文件,可通过循环读取合并数据:
import glob df_list = [] for file in glob.glob('*.csv'): df_list.append(pd.read_csv(file)) df = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者jonson
相关产品推荐
相关产品推荐

