2016-04-29 11 views
0

理論上NetworkXを使ってソーシャルグラフを作成しようとしていますが(私が考えるように)すべてが良い仕事ですが、実際には間違っています。 このような形式のグループに関する情報があります: members = {'グループ名1':[ユーザー1 ID、ユーザーID 2 ...]、...、 'グループ名N':[ユーザー1 ID、...、ユーザKイド]}たとえば :成果でグループの一般的なユーザーの社会的なグラフ

members={'Group 1' : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     'Group 2' : [10, 11, 12, 13, 14, 9], 
     'Group 3':[21,22,23,24] } 

私がしたグラフが必要になります。

  • 頂点 - 社会グループ
  • エッジ - 一般的な加入者の存在を(ユーザID)
  • 頂点サイズ - ユーザ数
  • 01頂点間
  • の距離 - 一般的な加入者(ユーザーID)

マイコード:

matrix={} 
for i in members: 
    for j in members: 
     if i!=j: 
      matrix[i+j]=len(set(members[i]) & set(members[j]))*1.0/min(len(set(members[i])),len(set(members[j]))) 
max_matrix = max(matrix.values()) 
min_matrix = min(matrix.values()) 
for i in matrix: 
    matrix[i] = (matrix[i] - min_matrix)/(max_matrix - min_matrix) 

g = networkx.Graph(directed=False) 
for i in members: 
    for j in members: 
     if i != j: 
      g.add_edge(i, j, weight=matrix[i+j]) 

members_count = {x:len(members[x]) for x in members} 

max_value = max(members_count.values()) * 1.0 
size = [] 
max_size = 900 
min_size = 100 
for node in g.nodes(): 
    size.append(((members_count[node]/max_value)*max_size + min_size)*10) 

import matplotlib.pyplot as plt 
pos=networkx.spring_layout(g) 
plt.figure(figsize=(20,20)) 
networkx.draw_networkx(g, pos, node_size=size, width=0.5, font_size=8) 
plt.axis('off') 
plt.show() 

しかし、共通のIDを持っていないグループのために描いたエッジ、なぜ私が理解することはできません。

+0

また、あなたがやろうとしているのと同じように役割を果たしているので、二部構成の投影も見てください。 – Joel

答えて

0

NetworkXはエッジの属性としてウェイトのみを使用します。エッジがあるかどうかは、エッジの重みに依存しません。

つまり、重み0のエッジもエッジとしてカウントされ、描画関数で表示されます。

関連する問題