绘制包含许多组件的图形时节点大小不正确
Node sizes not correct when drawing a graph with many components
我有一个图表,其中包含许多我想要可视化的组件。作为一个特殊特征,巨型组件中节点的节点点应与其特征向量中心性成比例。所有其他节点都具有相同的大小。
我使用以下脚本:
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()
一切都非常正确,因为我检查了不同的输出。但是,我收到一个输出,其中来自巨型组件以外的组件的一些节点是按比例缩放的。此外,巨大组件中的节点未正确缩放。
此快照显示了巨型组件和带有缩放节点的非组件:
但是,如果我只使用字典 eigenvector
打印巨型组件 G
作为节点大小,我会得到以下 - 正确 - 输出(:
我也做了一些故障排除。例如 dictionary/list node_sizes
都是正确的。有趣的是,使用随机图 H = nx.fast_gnp_random_graph(300, 0.005, seed=5)
returns 结果正确。因此我完全不知道我的 H
.
出了什么问题
您会注意到 node_sizes
是一个列表。您还没有向绘图命令发送节点列表。它将从网络中的节点动态生成它们。当这两个列表的顺序不同时,就会出现问题。我不认为拥有多个组件是个问题,但是您的网络越大,它们就越有可能没有按照相同的顺序排列。
所以而不是
node_sizes = [v*2000 for v in node_sizes.values()]
使用
nodelist, node_sizes = zip(*node_sizes.items())
这里的nodelist会得到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)
我有一个图表,其中包含许多我想要可视化的组件。作为一个特殊特征,巨型组件中节点的节点点应与其特征向量中心性成比例。所有其他节点都具有相同的大小。
我使用以下脚本:
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()
一切都非常正确,因为我检查了不同的输出。但是,我收到一个输出,其中来自巨型组件以外的组件的一些节点是按比例缩放的。此外,巨大组件中的节点未正确缩放。
此快照显示了巨型组件和带有缩放节点的非组件:
但是,如果我只使用字典 eigenvector
打印巨型组件 G
作为节点大小,我会得到以下 - 正确 - 输出(:
我也做了一些故障排除。例如 dictionary/list node_sizes
都是正确的。有趣的是,使用随机图 H = nx.fast_gnp_random_graph(300, 0.005, seed=5)
returns 结果正确。因此我完全不知道我的 H
.
您会注意到 node_sizes
是一个列表。您还没有向绘图命令发送节点列表。它将从网络中的节点动态生成它们。当这两个列表的顺序不同时,就会出现问题。我不认为拥有多个组件是个问题,但是您的网络越大,它们就越有可能没有按照相同的顺序排列。
所以而不是
node_sizes = [v*2000 for v in node_sizes.values()]
使用
nodelist, node_sizes = zip(*node_sizes.items())
这里的nodelist会得到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)