[英]How to draw a small graph with community structure in networkx
對於小圖,我發現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.