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

2024-10-01 13:27:01 发布

您现在位置:Python中文网/ 问答频道 /正文

图中有大约100个节点,社区的数量从5到20个不等。有没有办法画出这样的图,使同一个社区的节点彼此接近?在

我试着给不同的社区分配不同的颜色,但这在我的应用程序中效果不佳。在

我读过this和{a2},但没有找到一个好的解决方案。在

我使用的是python2.7.12和newtorkx-1.11


Tags: 应用程序a2数量节点颜色解决方案this社区
1条回答
网友
1楼 · 发布于 2024-10-01 13:27:01

对于小图,我发现^{}非常适合绘制社区。如果需要突出显示节点(及其社区),我建议您:

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

  • 增加节点的大小并

  • 使边缘变浅灰色(这样图形看起来就不那么明显了 杂乱无章,节点在视觉上更加突出)。

如果选择spring_layout,则可以另外使用k参数(文档说明:增加此值以将节点移动得更远一些。请注意,spring_layout每次运行代码时都会给出不同的图像(这样,您可以多次运行代码,只有当您对结果满意时才保存图像)。在

在下面的例子中,我使用了一个默认的图(nx.karate_club_graph),在这个图中,我使用python-louvain包(作为community导入)自动检测社区。节点大小是用node_size中的node_size参数定义的。节点颜色取决于它们所属的社区,我使用plt.cm.RdYlBu颜色映射(请参阅更多颜色映射here)。请注意,您还可以通过在plt.figure中定义一个更大或更小的图像来影响节点大小(和边长度)。在

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)

输出(我运行代码多次,并选择了“最漂亮”的图像):

enter image description here

但是,如果你有一个更大的图表和不太明显的社区呢?因此,这里的随机图(100)和随机图(100)是相同的,但更复杂的是绘制边缘:

^{pr2}$

输出:

enter image description here

在上图中我们看不到清晰的社区。这里至少有三种选择:

  • 手动定义图形布局(节点坐标/位置)(pos 在我的代码中),

  • 尝试不同的布局(找到here)和

  • 为每个社区树立一个形象(或者至少是最重要的 社区)。

如果选择第三个选项,则可以使一个高亮显示的社区的节点比其他节点大(当然,颜色也不同)。您还可以更改该社区中边缘的颜色和厚度(在下面的示例中未显示)。在

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)

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

enter image description here

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

相关问题 更多 >