基于Python与Networkx:节点标签与CSV值比对及节点着色需求
解决NetworkX网格图节点颜色匹配CSV值的问题
核心思路
- 隐藏边:仅绘制节点和编号,跳过边的绘制步骤
- 建立节点与CSV值的映射:将网格图的节点编号(元组或整数格式)转换为CSV的行列索引,匹配对应值后设置差异化颜色
完整可运行代码
import networkx as nx import pandas as pd import matplotlib.pyplot as plt # 创建10x10网格图(节点编号为(行,列)元组,可根据实际节点格式调整) G = nx.grid_2d_graph(10, 10) # 读取CSV矩阵,假设无表头,直接为纯矩阵值 df = pd.read_csv('matrix101.csv', header=None) # 生成节点颜色列表 node_colors = [] for node in G.nodes(): # 把节点元组转成CSV的行列索引 row, col = node # 如果你的节点是整数编号(比如0-99),替换成下面两行: # row = node // 10 # col = node % 10 # 获取CSV对应位置的值,处理可能的空格 csv_val = str(df.iloc[row, col]).strip() # 根据值设置颜色 node_colors.append('blue' if csv_val == 'X' else 'red') # 绘图:只显示节点和编号,隐藏边 plt.figure(figsize=(8, 8)) # 固定布局种子,保证节点位置不变 pos = nx.spring_layout(G, seed=42) # 绘制节点 nx.draw_networkx_nodes(G, pos=pos, node_color=node_colors, node_size=500) # 绘制节点编号 nx.draw_networkx_labels(G, pos=pos, font_size=10, font_color='white') # 关闭坐标轴 plt.axis('off') plt.show()
关键注意事项
- 节点编号适配:如果网格图节点不是
(行,列)元组而是整数ID,必须将ID转换为CSV的行列索引(比如10x10网格中,ID=23对应行2、列3),否则颜色匹配会出错。 - CSV读取细节:如果CSV有表头,需添加
header=0跳过;如果分隔符是制表符或其他,用sep='\t'指定。 - 值判断容错:用
strip()处理CSV值的空格,避免因空格导致'X'匹配失败。
调试小技巧
- 先打印
G.nodes()确认节点格式,再打印df.iloc[row, col]查看是否能正确获取CSV值,验证映射关系。 - 如果颜色不对,检查CSV中的
X是否为大写,或是否有其他格式问题,可临时打印csv_val排查。
内容的提问来源于stack exchange,提问作者user136819
相关产品推荐
相关产品推荐

