【问题标题】:How to draw a small graph with community structure in networkx如何在networkx中绘制具有社区结构的小图
【发布时间】:2023-03-10 00:27:01
【问题描述】:

图有大约100个节点,社区的数量从5到20不等。有什么方法可以绘制图,使同一个社区的节点彼此靠近?

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

我已经阅读了thisthis,但没有找到好的解决方案。

我正在使用 python 2.7.12 和 newtorkx-1.11

【问题讨论】:

    标签: python data-mining networkx graph-visualization


    【解决方案1】:

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

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

    • 增加节点大小和

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

    如果您选择spring_layout,您还可以使用k 参数(文档指出:增加此值以将节点移得更远)。请注意,spring_layout 可以在每次运行代码时给出不同的图像(这样您可以多次运行代码并仅在对结果满意时才保存图像)。

    在以下示例中,我使用默认图表 (nx.karate_club_graph),在该图表中,我使用 python-louvain 包(导入为 community)自动检测社区。节点大小由nx.draw_networkx_nodes 中的node_size 参数定义。节点颜色取决于它们所属的社区——我使用plt.cm.RdYlBu 颜色映射(查看更多颜色映射here)。请注意,您还可以通过在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 在我的代码中),

    • 尝试不同的布局(找到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)
    

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

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

    【讨论】:

    • 这个详细的答案真的很有帮助。颜色图的使用使代码更整洁,图表更直观。
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2022-10-23
    • 2020-05-06
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多