首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在网络中绘制具有社区结构的小图

如何在网络中绘制具有社区结构的小图
EN

Stack Overflow用户
提问于 2016-12-02 21:41:43
回答 1查看 8.6K关注 0票数 7

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

我试图为不同的社区分配不同的颜色,但这在我的应用程序中并不有效。

我读过,但没有找到一个好的解决方案。

我使用python 2.7.12和newtorkx-1.11

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-03 23:37:30

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

  • 为不同的社区选择不同的颜色(颜色差异越大,效果越好),
  • 增加节点的大小
  • 使边缘变成较浅的灰色(这样,图看起来就不那么杂乱了,节点的视觉效果也更加突出)。

如果选择spring_layout,您还可以使用k参数(文档声明:增加此值以将节点移动到更远的位置)。请注意,每次运行代码时,spring_layout都可以提供不同的映像(这样,您可以多次运行代码,并且只有当您满意结果时才保存映像)。

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

代码语言:javascript
复制
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个随机边(因此也是随机社区),但是使用相同的绘图方法:

代码语言:javascript
复制
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),
  • 不同布局的实验(发现这里)和
  • 为每个社区(或至少是最重要的社区)树立形象。

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

代码语言:javascript
复制
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 )。这样,图像就更具有可比性了。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40941264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档