2016-10-14 19 views
1

NetworkXには、隣接行列の周波数/ノードノードの周波数に比例したノードとエッジをスケーリングする組み込みの方法がありますか?私はノードとノードの周波数に基づいて隣接行列の周波数とエッジの重みに基づいてノードとテキストのサイズを調整しようとしています。私はグラフの頻度属性を作成しましたが、ノードノードの頻度に関する情報をグラフに渡すという私の問題は解決しません。スケーリングNetworkXのノードとエッジは隣接行列に比例します

2つの質問:
1)隣接行列をnetworkXグラフに転送するベストプラクティスは何ですか?
2)ノードのサイズとエッジの重さをスケールするには、どのようにその情報を使用しますか?

## Compute Graph (G) 
G = nx.Graph(A) 

## Add frequency of word as attribute of graph 
def Freq_Attribute(G, A): 
    frequency = {} # Dictionary Declaration 
    for node in G.nodes(): 
     frequency[str(node)] = A[str(node)][str(node)] 
    return nx.set_node_attributes(G, 'frequency', frequency) 

Freq_Attribute(g,A) # Adds attribute frequency to graph, for font scale 

## Plot Graph with Labels 
plt.figure(1, figsize=(10,10)) 

# Set location of nodes as the default 
pos = nx.spring_layout(G, k=0.50, iterations=30) 

# Nodes 
node_size = 10000 
nodes1 = nx.draw_networkx_nodes(G,pos, 
         node_color='None', 
         node_size=node_size, 
         alpha=1.0) # nodelist=[0,1,2,3], 
nodes1.set_edgecolor('#A9C1CD') # Set edge color to black 

# Edges 
edges = nx.draw_networkx_edges(G,pos,width=1,alpha=0.05,edge_color='black') 
edges.set_zorder(3) 

# Labels 
nx.draw_networkx_labels(G,pos,labels=nx.get_node_attributes(G,'label'), 
         font_size=16, 
         font_color='#062D40', 
         font_family='arial') # sans-serif, Font=16 
# node_labels = nx.get_node_attributes(g, 'name') 
# Use 'g.graph' to find attribute(s): {'name': 'words'} 

plt.axis('off') 
#plt.show() 

私はラベルFONT_SIZEを設定しようとしたが、これは: FONT_SIZE = nx.get_node_attributes(G '周波数')を動作しませんでした)+ 8)

答えて

1

私はあなたに合うように、以下を試してみました必要性:すべての

import networkx as nx 
import matplotlib.pyplot as plt 

## create nx graph from adjacency matrix 
def create_graph_from_adj(A): 
    # A=[(n1, n2, freq),....] 
    G = nx.Graph() 
    for a in A: 
     G.add_edge(a[0], a[1], freq=a[2]) 
    return G 

A = [(0, 1, 0.5), (1, 2, 1.0), (2, 3, 0.8), (0, 2, 0.2), (3, 4, 0.1), (2, 4, 0.6)] 
## Compute Graph (G) 
G = create_graph_from_adj(A) 

plt.subplot(121) 

# Set location of nodes as the default 
spring_pose = nx.spring_layout(G, k=0.50, iterations=30) 

nx.draw_networkx(G,pos=spring_pose) 


plt.subplot(122) 
# Nodes 
default_node_size = 300 
default_label_size = 12 
node_size_by_freq = [] 
label_size_by_freq = [] 
for n in G.nodes(): 
    sum_freq_in = sum([G.edge[n][t]['freq'] for t in G.neighbors(n)]) 
    node_size_by_freq.append(sum_freq_in*default_node_size) 
    label_size_by_freq.append(int(sum_freq_in*default_label_size)) 

nx.draw_networkx_nodes(G,pos=spring_pose, 
         node_color='red', 
         node_size=node_size_by_freq, 
         alpha=1.0) 
nx.draw_networkx_labels(G,pos=spring_pose, 
         font_size=12, #label_size_by_freq is not allowed 
         font_color='#062D40', 
         font_family='arial') 

# Edges 
default_width = 5.0 
edge_width_by_freq = [] 
for e in G.edges(): 
    edge_width_by_freq.append(G.edge[e[0]][e[1]]['freq']*default_width) 
nx.draw_networkx_edges(G,pos=spring_pose, 
         width=edge_width_by_freq, 
         alpha=1.0, 
         edge_color='black') 

plt.show() 

enter image description here

まず、隣接反応が行列形式で与えられたが、それはあまりにも退屈だ私見されていません。

第2に、nx.draw_networkx_labelsは、ラベルの異なるフォントサイズを許可しません。助けてくれない。

最後に、エッジの幅とノードのサイズはこれを可能にします。したがって、それらの周波数および入力周波数の合計に基づいてそれぞれスケーリングされます。

希望します。

関連する問題