2016-10-14 8 views
1

Имеет ли NetworkX встроенный способ масштабирования узлов и ребер, пропорциональных частоте матрицы смежности/частоте узла-узла? Я пытаюсь масштабировать размер узлов и текста на основе частоты матрицы смежности и веса края на основе частоты узлов узла. Я создал частотный атрибут для графика, но это не решает мою проблему передачи информации на график о частоте узла-узла.Масштабирование узлов сети и краев пропорционально матрице смежности

Так что вопрос о двух частях:
1) Какие лучшие практики переносят матрицу смежности в граф сети X?
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

Прежде всего, реакция смежности не представлена ​​в виде матрицы, но ИМХО это слишком утомительно.

Во-вторых, nx.draw_networkx_labels не допускает разного размера шрифта для этикеток. Не могу с этим поделать.

Последнее, однако, ширина края и размер узла позволяют это. Таким образом, они масштабируются по частоте и суммированию входящей частоты соответственно.

Надеюсь, это поможет.