2015-04-03 35 views
3

我有许多想要形象化的组件的图。作为一个特殊的特征,巨组件中节点的节点应按照它们的特征向量中心性进行缩放。所有其他节点具有相同的大小。使用多个组件绘制图形时节点大小不正确

我使用下面的脚本:

import networkx as nx 
import pylab as py 
import matplotlib.pyplot as plt 

H = nx.read_gexf(input_file) 
print nx.info(H) 
#Name: 
#Type: Graph 
#Number of nodes: 719 
#Number of edges: 620 
#Average degree: 1.7246 

# Set draw() parameters 
node_sizes = dict.fromkeys(H.nodes(), 0.005) 
# Make node size of giant component nodes proportional to their eigenvector 
eigenvector = nx.eigenvector_centrality_numpy(G) 
for node, value in eigenvector.iteritems(): 
    node_sizes[node] = round(value, 4) 
node_sizes = [v*2000 for v in node_sizes.values()] # rescale 
node_positions = nx.pygraphviz_layout(H, prog="neato") 

# Draw graph with different color for each connected subgraph 
plt.figure(3, figsize=(90,90)) 
nx.draw(H, font_size=10, pos=node_positions, node_size=node_sizes, vmin=0.0, vmax=1.0, with_labels=True) 
plt.show() 

一切都是非常正确,我在不同输出检查。但是,我收到一个输出,其中来自巨型组件以外的组件的一些节点是可扩展的。此外,巨型组件中的节点未正确缩放。

该快照显示了巨大的分量和关闭组件与缩放节点: enter image description here

但是,如果我只使用字典eigenvector的节点尺寸打印的巨组G,我得到如下 - 正确 - 输出(:

enter image description here

我做了一些故障排除,太例如,词典/名单node_sizes是正确有趣的是,采用了随机图。返回正确的结果。所以我完全不知道我的H有什么问题。

+0

- 但因为我没有你输入网络没有测试它。请检查它并让我知道 - 特别是如果它不起作用。 – Joel 2015-04-03 20:32:38

回答

2

您会注意到node_sizes是一个列表。您尚未将绘制命令发送给节点列表。它将从网络中的节点实时生成它们。当这两个列表最终以不同的顺序出现时,就会出现问题。我认为这不是一个有多个组件的问题,而是您的网络越大,它们就不会被放入相同的顺序。

因此,而不是

node_sizes = [v*2000 for v in node_sizes.values()] 

使用

nodelist, node_sizes = zip(*node_sizes.items()) 

此节点列表将得到node_sizes.items和node_sizes的每个条目的第一个号码的名单将获得第二个数字的列表每个条目。

然后在绘图命令给它我提供了一个答案的节点列表

nx.draw(H, font_size=10, pos=node_positions, node_size=node_sizes, vmin=0.0, vmax=1.0, with_labels=True, nodelist=nodelist) 
+0

它的工作原理。我期望这样的事情 - 在哪里可以发生错误。为了缩放节点尺寸(我使用了2000倍),现在必须在特征向量循环中以及在'node_sizes'字典的初始化中进行乘法运算。 – MERose 2015-04-03 20:48:27