簡體   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