如何在networkx中绘制具有社区结构的小图

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41238579/article/details/101775317

图有大约100个节点,社区数量从5到20。绘制图形,以使同一社区的节点彼此靠近?
对于小图,我发现spring_layout对于绘图社区来说还可以。
如果您需要突出显示节点(及其社区),我建议您。
·为不同的社区选择不同的颜色(颜色在视觉上越多越好),
·增加节点的大小
边缘变浅灰色
(这样,图形看起来不太混乱,节点在视觉上更加突出)

如果选择spring_layout,则可以另外使用k参数
(文档指出:增加该值可将节点移得更远)。
请注意,每次运行代码时spring_layout都可以提供不同的图像
(通过这种方式可以运行代码多次并仅在对结果满意的情况下保存图像)。
在下面的示例中,我使用默认图(nx.karate_club_graph),在其中使用python-louvain包(导入为社区)自动检测社区。
节点大小由nx.draw_networkx节点中的node size参数定义
节点颜色取决于它们所属的社区-我使用plt.cm.RdYlBu颜色图

import networkx as nx
import community
import matplotlib.pyplot as plt

G = nx.karate_club_graph()  # load a default graph

partition = community.best_partition(G)  # compute communities

pos = nx.spring_layout(G)  # compute graph layout
plt.figure(figsize=(8, 8))  # image is 8 x 8 inches
plt.axis('off')
nx.draw_networkx_nodes(G, pos, node_size=600, cmap=plt.cm.RdYlBu, node_color=list(partition.values()))
nx.draw_networkx_edges(G, pos, alpha=0.3)
plt.show(G)

在这里插入图片描述

但是,如果您有一个较大的图表,而社区却不那么明显呢?这是一个更复杂的图形,具有100个节点和100个随机边(以及随机社区),但是具有相同的绘制方法:

import networkx as nx
import community
import matplotlib.pyplot as plt
import random

H = nx.Graph()

nodes = list(range(100))  # 100 nodes

# add 100 random edges
for i in range(100):
    src = random.choice(nodes)
    dest = random.choice(nodes)
    # we don't want src to be the same as dest
    while src == dest:
        dest = random.choice(nodes)
	H.add_edge(src, dest)

partition = community.best_partition(H)  # compute communities

pos = nx.spring_layout(H)  # compute graph layout
plt.figure(figsize=(10, 10))
plt.axis('off')
nx.draw_networkx_nodes(H, pos, node_size=600, cmap=plt.cm.RdYlBu, node_color=list(partition.values()))
nx.draw_networkx_edges(H, pos, alpha=0.3)
plt.show(H)

在这里插入图片描述

我们在上图中看不到清晰的社区。在这里,您至少有三个选择:
·手动(在我的代码中为pos)定义图形布局(节点坐标/位置),
·试验不同的布局
·为每个社区(或至少是最重要的社区)建立形象
如果选择第三个选项,则可以使一个突出显示的社区的节点大于其他节点(当然,颜色也不同)。您还可以更改该社区中边缘的颜色和厚度(在下面的示例中未显示)。

node_size = []

# first community against the others
for node, community in partition.items():
    if community == 1:
        node_size.append(900)
    else:
        partition[node] = 0  # I put all the other communities in one communitiy
        node_size.append(300)

plt.figure(figsize=(10, 10))
plt.axis('off')
nodes = nx.draw_networkx_nodes(H, pos, node_size=node_size, cmap=plt.cm.winter, node_color=list(partition.values()))
nx.draw_networkx_edges(H, pos, alpha=0.3)
plt.show(H)

如果同一张图有多个图像,建议节点在所有图中都具有相同的位置(在图形之间需要具有相同的位置)。这样,图像更具可比性。

参考网站:
https://stackoverflow.com/questions/40941264/how-to-draw-a-small-graph-with-community-structure-in-networkx

猜你喜欢

转载自blog.csdn.net/qq_41238579/article/details/101775317
今日推荐