Python绘制带边权重的类别共现图:用边宽展示共现强度
解决方法:让网络图边宽对应共现强度
要实现边宽与共现强度/频率挂钩,核心是提取共现矩阵中的边权重,将其映射为绘图时的边宽度参数。以下是修改后的完整代码:
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt # 初始化数据 data = [{'0': 1, '1': 0, '2': 1}, {'0': 1, '1': 0, '2': 1}, {'0': 1, '1': 1, '2': 0}, {'0': 1, '1': 0, '2': 1}, {'0': 1, '1': 1, '2': 0}, {'0': 0, '1': 0, '2': 1}, {'0': 1, '1': 0, '2': 1}, {'0': 0, '1': 0, '2': 0}, {'0': 1, '1': 1, '2': 1}, {'0': 0, '1': 1, '2': 0}, {'0': 1, '1': 0, '2': 1}, {'0': 0, '1': 1, '2': 0}, {'0': 1, '1': 0, '2': 0}, {'0': 0, '1': 1, '2': 1}] # 创建DataFrame df = pd.DataFrame(data) # 计算共现矩阵并清空对角线 df_asint = df.astype(int) coocc = df_asint.T.dot(df_asint) np.fill_diagonal(coocc.values, 0) # 从共现矩阵构建图 G = nx.from_pandas_adjacency(coocc) # 提取边权重并映射为边宽(系数可按需调整) edge_weights = [G[u][v]['weight'] for u, v in G.edges()] edge_widths = [w * 2 for w in edge_weights] # 系数2用于放大宽度,提升可视化效果 # 绘图配置 plt.figure(figsize=(8, 6)) plt.axis('off') # 绘制网络图,指定边宽参数 nx.draw_networkx( G, node_color=["cyan", "Red", "yellow"], node_size=1000, edge_color='gray', width=edge_widths, with_labels=True, font_size=12 ) plt.show()
关键修改说明:
- 提取边权重:从构建的图
G中直接获取每条边的weight属性,该属性对应共现矩阵中的共现次数。 - 映射边宽:将原始权重乘以一个系数(示例中为2),把数值转换为适合可视化的宽度,避免边过细或过粗。
- 优化可视化细节:调整了节点大小、字体大小等参数,让图的可读性更强,同时保留了原有的节点颜色设置。
修改后,边的宽度会直观反映两个类别之间的共现频率——共现次数越多,边越粗。
内容的提问来源于stack exchange,提问作者Pranab
相关产品推荐
相关产品推荐

