繁体   English   中英

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

[英]How to draw a small graph with community structure in networkx

该图有大约100个节点,社区的数目从5到20。是否有任何方法可以绘制该图,以使同一社区的节点彼此靠近?

我尝试为不同的社区分配不同的颜色,但是在我的应用程序中效果不佳。

我读过这个这个 ,但没有找到一个好的解决办法。

我正在使用python 2.7.12和newtorkx-1.11

对于小图,我发现spring_layout对于绘图社区来说还可以。 如果您需要突出显示节点(及其社区),我建议您:

  • 为不同的社区选择不同的颜色(颜色在视觉上越多越好),

  • 增加节点的大小并

  • 将边缘设置为较浅的灰色(通过这种方式,图形看起来不那么混乱,节点在视觉上更加突出)。

如果选择spring_layout ,则可以另外使用k参数(文档指出: 增加此值可将节点移得更远 )。 请注意,每次运行代码时spring_layout可以提供不同的图像(通过这种方式,您可以多次运行代码并仅在对结果满意的情况下保存图像)。

在下面的示例中,我使用默认图( nx.karate_club_graph ),在其中使用python-louvain包(导入为community )自动检测community 节点的大小与定义node_size在争论nx.draw_networkx_nodes 节点颜色取决于它们所属的社区-我使用plt.cm.RdYlBu颜色图(请参阅此处的更多颜色图)。 请注意,您还可以通过在plt.figure使用figsize定义更大或更小的图像来影响节点大小(和边缘长度)。

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)

输出(仅突出显示第一个社区):

在此处输入图片说明

如果您有相同的图形多张图片,我建议节点在所有的人都在相同的位置(你需要有相同的pos图纸之间)。 这样,图像更具可比性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM