问题描述
我在理解 networkx 库的工作原理和节点标签时遇到了一些麻烦。假设我在 Pandas 数据框中有一个相关矩阵:
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
D = pd.DataFrame\
({'A': [1,0.5,0.1],'B': [0.5,1,0.3],'C': [0.1,0.3,1]},index = ['A','B','C'])
我现在想绘制这个相关矩阵的简单图形表示(在这个例子中是一个三角形),然后为更大的相关矩阵/距离矩阵生成最小生成树。
corr_graph = nx.from_pandas_adjacency(D)
pos = nx.spring_layout(corr_graph)
nx.draw_networkx_nodes(corr_graph,pos=pos,label = ['A','C'])
nx.draw_networkx_edges(corr_graph,pos=pos)
nx.draw_networkx_edge_labels(corr_graph,pos=pos)
plt.axis('off')
plt.show()
这样就生成了图,每条边都有正确的标签。在节点上,我有自循环边 {'weight':1}
但节点本身没有标签,我想将它们作为初始数据帧中的 A、B 和 C,以便我可以识别它们。我的另一个问题是如何去除自环边缘标签。
我想对最小生成树做同样的事情,但首先我只是想在简单的图上做。
谢谢,
解决方法
绘制节点标签
(内置函数):
nx.draw_networkx_labels(corr_graph,pos=pos)
删除自循环:
方法 1:
将对角线设置为零,然后创建图形:
# for example
E = D - np.eye(D.shape[0])
corr_graph = nx.from_pandas_adjacency(E)
方法 2:
创建图形,只绘制源和目的不同的边。
corr_graph = nx.from_pandas_adjacency(D)
edges = [(a,b) for (a,b) in corr_graph.edges() if a != b]
nx.draw_networkx_edges(corr_graph,edgelist=edges,pos=pos)