2017-02-15 412 views
0

我试图用python的networkx绘制网络。networkx:将网络划分为两种类型的节点

我有两种类型的节点,这些类型的节点应该分开放置。我如何分别放置不同类型的节点?

作为一个例子,请看下面的节点。

enter image description here

我想分开蓝色节点(汽车,笔,纸,杯子),如下面的图片红色节点(狗,牛,猫)。

enter image description here

enter image description here

所以,我的问题是如何可以networkx绘制这些类型的网络,类似的上述图像节点的单独的群体?

作为参考,我粘贴绘制第一幅图像的代码。

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.Graph() 
target_word_list = ["dog", "cow", "cat"] # represented by red nodes 
attribute_word_list = ["car", "pen","paper", "cup"] # represented by blue nodes 
word_list = target_word_list + attribute_word_list 

for i in range(0, len(word_list)): 
    G.add_node(i) 

pos=nx.spring_layout(G) # positions for all nodes 
# draw nodes 
nx.draw_networkx_nodes(G,pos, 
         nodelist=range(0, len(target_word_list)), 
         node_color='r', 
         node_size=50, alpha=0.8) 
nx.draw_networkx_nodes(G,pos, 
         nodelist=range(len(target_word_list), len(word_list)), 
         node_color='b', 
         node_size=50, alpha=0.8)  
labels = {} 
for idx, target_word in enumerate(target_word_list): 
    labels[idx] = target_word 
for idx, attribute_word in enumerate(attribute_word_list): 
    labels[len(target_word_list)+idx] = attribute_word 
nx.draw_networkx_labels(G,pos,labels,font_size=14) 

plt.axis('off') 

回答

1

您可以手动将某个组中的节点的y坐标向上或向下移动。 所以,如果你有你的节点坐标pos

for i in range(0, len(word_list)): 
    if word_list[i] in attribute_word_list: 
     pos[i][1] += 4 

这将在第二组拉升的节点。

你的整个代码:

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.Graph() 
target_word_list = ["dog", "cow", "cat"] # represented by red nodes 
attribute_word_list = ["car", "pen","paper", "cup"] # represented by blue nodes 
word_list = target_word_list + attribute_word_list 

for i in range(0, len(word_list)): 
    G.add_node(i) 

pos=nx.spring_layout(G) # positions for all nodes 

# if node is in second group, move it up 
for i in range(0, len(word_list)): 
    if word_list[i] in attribute_word_list: 
     pos[i][1] += 4 

# draw nodes 
nx.draw_networkx_nodes(G,pos, 
         nodelist=range(0, len(target_word_list)), 
         node_color='r', 
         node_size=50, alpha=0.8) 
nx.draw_networkx_nodes(G,pos, 
         nodelist=range(len(target_word_list), len(word_list)), 
         node_color='b', 
         node_size=50, alpha=0.8)  
labels = {} 
for idx, target_word in enumerate(target_word_list): 
    labels[idx] = target_word 
for idx, attribute_word in enumerate(attribute_word_list): 
    labels[len(target_word_list)+idx] = attribute_word 
nx.draw_networkx_labels(G,pos,labels,font_size=14) 

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

输出:

enter image description here