让networkx图看起来不错

2024-01-10

我需要使用以下数据构建一个良好的网络:

result_set = {('name1', 'job1'), ('name2', 'job2'), ('name3', 'job3'), ('name4', 'job4'), ('name5', 'job5'), ('name6', 'job6'), ('name7', 'job7'), ('name8', 'job8'), ('name9', 'job3'), ('name10', 'job6'), ('name11', 'job3'), ('name12', 'job1'), ('name13', 'job5'), ('name14', 'job9'), ('name15', 'job10'), ('name16', 'job6'), ('name17', 'job7'), ('name18', 'job11'), ('name19', 'job12'), ('name20', 'job13'), ('name21', 'job7'), ('name22', 'job14'), ('name23', 'job15'), ('name24', 'job7'), ('name25', 'job14'), ('name26', 'job9'), ('name27', 'job3'), ('name28', 'job16'), ('name29', 'job16'), ('name30', 'job1'), ('name31', 'job10'), ('name32', 'job9'), ('name33', 'job12'), ('name34', 'job5'), ('name35', 'job7'), ('name36', 'job3'), ('name37', 'job17'), ('name38', 'job3'), ('name39', 'job18'), ('name40', 'job16 / job3'), ('name41', 'Il Foglio'), ('name42', 'job7'), ('name43', 'job19'), ('name44', 'job9'), ('name45', 'job20'), ('name46', 'job18'), ('name47', 'job21')}

正如你所看到的,名字是唯一的,但工作却不是。因此,我想建立一个可以按职位显示姓名集群的网络。

我使用以下代码完成了此操作,但是我遇到了一些问题,无法以良好的格式进行可视化,而无需重叠标签并根据程度更改节点大小。

我的代码如下:

result = zip(names, jobs)

# Converting itertor to set
result_set = set(result)
print(result_set)


G = nx.Graph()
for node_tuple in result_set:
        G.add_edges_from(result_set) # edited after comment
nx.draw(G, with_labels=True)
plt.show()

您能否看一下它并告诉我如何相应地更改它以使其更好地可读并根据节点的度数显示节点?

随时欢迎建议和意见。


您可以使用 networkx 中实现的多种布局算法之一nx.drawing.layout https://networkx.github.io/documentation/stable/_modules/networkx/drawing/layout.html以一种使网络可视化更容易的方式定位节点。您可以通过设置进一步调整节点之间的距离k到一个合适的值。

您还可以通过构建一个字典来将节点大小设置为与度数成比例Graph.degree https://networkx.github.io/documentation/stable/reference/classes/generated/networkx.Graph.degree.html并设置node_size in nx.draw相应地,并通过应用乘法因子将其放大到所需的大小。这是一个使用的示例spring_layout https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.layout.spring_layout.html:

from pylab import rcParams
rcParams['figure.figsize'] = 14, 10
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
d = dict(G.degree)
nx.draw(G, pos, node_color='lightblue', 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d])

您还可以根据节点是否为自定义节点颜色job or a name使用node_color参数(我猜这不是真实情况,但它给出了如何继续的想法):

rcParams['figure.figsize'] = 14, 10
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
colors = [['lightgrey', 'lightblue'][node.startswith('job')] 
          for node in G.nodes()]
d = dict(G.degree)
nx.draw(G, pos, 
        with_labels=True, 
        nodelist=d, 
        node_size=[d[k]*300 for k in d],
        node_color=colors)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让networkx图看起来不错 的相关文章

随机推荐