从DataFrame生成NetworkX图后,如何设置S1-S4节点标签?
问题:为NetworkX有向图设置节点标签(S1-S4)
尝试用以下代码从DataFrame生成NetworkX有向图,但生成的图未显示节点名称,使用relabel_nodes方法也没成功:
import pandas as pd import numpy as np import networkx as nx data = [[0,0,0,1], [1,0,0,1], [1,0,0,1], [0,0,0,0]] df = pd.DataFrame(data, columns=['S1', 'S2', 'S3', 'S4']) df.index = ['S1', 'S2', 'S3', 'S4'] # 原创建图的代码,节点为0-3的整数 G = nx.DiGraph(df.values, with_labels=True) nx.draw(G) # 尝试重命名节点但未成功显示标签 G = nx.relabel_nodes(G, dict(enumerate(df.columns))) nx.draw(G)
解决方案
方法1:直接从DataFrame邻接矩阵创建带节点名的图
NetworkX提供了from_pandas_adjacency方法,可以直接基于DataFrame的索引和列名创建节点,无需手动重命名:
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt data = [[0,0,0,1], [1,0,0,1], [1,0,0,1], [0,0,0,0]] df = pd.DataFrame(data, columns=['S1', 'S2', 'S3', 'S4']) df.index = ['S1', 'S2', 'S3', 'S4'] # 直接用DataFrame创建有向图,节点自动使用df的索引/列名 G = nx.from_pandas_adjacency(df, create_using=nx.DiGraph) # 绘图时开启with_labels=True显示节点标签 nx.draw(G, with_labels=True, node_size=1500, font_size=12) plt.show()
方法2:修复原代码的节点重命名与绘图逻辑
原代码的问题在于:
nx.DiGraph(df.values)会生成节点为0-3的整数图,构造函数的with_labels=True参数无效(该参数属于nx.draw)- 重命名节点后,绘图时未开启
with_labels=True,导致标签不显示
修改后的代码:
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt data = [[0,0,0,1], [1,0,0,1], [1,0,0,1], [0,0,0,0]] df = pd.DataFrame(data, columns=['S1', 'S2', 'S3', 'S4']) df.index = ['S1', 'S2', 'S3', 'S4'] # 从邻接矩阵创建图(节点初始为0-3) G = nx.DiGraph(df.values) # 重命名节点为S1-S4 G = nx.relabel_nodes(G, dict(enumerate(df.columns))) # 绘图时必须设置with_labels=True才会显示节点标签 nx.draw(G, with_labels=True, node_size=1500, font_size=12) plt.show()
关键说明
nx.draw的with_labels=True是显示节点标签的核心参数,构造图时的with_labels参数无效- 使用
from_pandas_adjacency是最简洁的方式,直接复用DataFrame的索引/列作为节点名,无需额外重命名操作
内容的提问来源于stack exchange,提问作者user3046211
相关产品推荐
相关产品推荐

