使用Networkx绘制相似度矩阵

时间:2019-06-22 17:44:23

标签: python networkx

我正在尝试使用networkx可视化单词之间的相关性(相似性分数最高为1)

例如狗,猫,动物,人,狼之间的相似性得分

我尝试使用此代码绘制每个单词/节点之间的相似距离

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()

corr_data =([['Dog', 'Dog', 1.0],
       ['Cat', 'Dog', 0.8016854524612427],
       ['Wolf', 'Dog', 0.5206573009490967],
       ['Person', 'Dog', 0.3756750822067261],
       ['Animal', 'Dog', 0.6618534326553345],
       ['Cat', 'Cat', 1.0],
       ['Wolf', 'Cat', 0.5081626176834106],
       ['Person', 'Cat', 0.32475101947784424],
       ['Animal', 'Cat', 0.6260400414466858],
       ['Wolf', 'Wolf', 1.0],
       ['Person', 'Wolf', 0.23091702163219452],
       ['Animal', 'Wolf', 0.5261368751525879],
       ['Person', 'Person', 1.0],
       ['Animal', 'Person', 0.34220656752586365],
       ['Animal', 'Animal', 1.0]])

existing_edges = {}

def build_graph(w, lev):
  if (lev > 5)  :
      return
  for z in corr_data:
     ind=-1 
     if z[0] == w:
         ind=0
         ind1=1
     if z[1] == w:
         ind ==1
         ind1 =0

     if ind == 0 or ind == 1:
         if  str(w) + "_" + str(corr_data[ind1]) not in existing_edges :

             G.add_node(str(corr_data[ind]))
             existing_edges[str(w) + "_" + str(corr_data[ind1])] = 1;
             G.add_edge(w,str(corr_data[ind1]))

             build_graph(corr_data[ind1], lev+1)


existing_nodes = {}
def build_graph_for_all():
    count=0
    for d in corr_data:
        if (count > 40) :
            return
        if  d[0] not in existing_edges :
             G.add_node(str(d[0]))
        if  d[1] not in existing_edges :     
             G.add_node(str(d[1]))
        G.add_edge(str(d[0]), str(d[1]))     
        count=count + 1


build_graph_for_all()

print (G.nodes(data=True))
plt.show()
nx.draw(G, width=2, with_labels=True)
plt.savefig("path1.png")


w="design"
G.add_node(w)
build_graph(w, 0)

print (G.nodes(data=True))
plt.show()
nx.draw(G, width=2, with_labels=True)
plt.savefig("path.png")

我的节点之间的距离看起来很远,即猫和人的绘制比猫和狗的绘制更近。我在这里想念一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

您需要修复一些问题。最重要的是,you can read up on how networkx draws networks使用弹簧布局。基本上,您需要做的是将相关值添加到网络边缘。

  1. 您可以通过以下方式来替换:build_graph_for_all中的G.add_edge行:

    com.package.BATalgo1
  2. 您可以使用以下代码绘制网络,该代码应考虑边缘权重。

    pos = nx.spring_layout(G,weight ='weight')

    nx.draw(G,pos = pos,width = 2,with_labels = True)

  3. 如果您真的想强调高相关边缘和低相关边缘之间的差异,可以按以下方式变换权重:

    corr_data = [[x [0],x 1,1000 **(x 2)]对于corr_data中的x]

这将扩展您的权重-低相关性.3将被映射到大约8,而完美相关性1将被映射到1000。用这些新的权重重新制作图形并重复上面的绘图代码将得出下图:

enter image description here

编辑:这是合并的代码:

G.add_weighted_edges_from([[str(d[0]), str(d[1]),d[2]]])