如何在networkx中绘制带有社区结构的小图
How to draw a small graph with community structure in networkx
该图有大约100个节点,社区数量从5到20不等。请问有什么方法可以画出同一个社区的节点之间距离很近的图吗?
我曾尝试为不同的社区分配不同的颜色,但这在我的应用程序中效果不佳。
我已经阅读 this and this 但没有找到好的解决方案。
我正在使用 python 2.7.12 和 newtorkx-1.11
对于小图,我发现 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)
输出(我多次运行代码并选择了"prettiest"图像):
但是,如果您有一个更大的图表但社区不太明显怎么办?这是一个更复杂的图,有 100 个节点和 100 个 运行dom 边(因此 运行dom 社区)但使用相同的绘图方法:
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)
输出:
我们在上图中看不到清晰的社区。在这里你至少有三个选择:
手动定义图表布局(节点coordinates/positions)(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
)。这样图像更具可比性。
该图有大约100个节点,社区数量从5到20不等。请问有什么方法可以画出同一个社区的节点之间距离很近的图吗?
我曾尝试为不同的社区分配不同的颜色,但这在我的应用程序中效果不佳。
我已经阅读 this and this 但没有找到好的解决方案。
我正在使用 python 2.7.12 和 newtorkx-1.11
对于小图,我发现 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)
输出(我多次运行代码并选择了"prettiest"图像):
但是,如果您有一个更大的图表但社区不太明显怎么办?这是一个更复杂的图,有 100 个节点和 100 个 运行dom 边(因此 运行dom 社区)但使用相同的绘图方法:
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)
输出:
我们在上图中看不到清晰的社区。在这里你至少有三个选择:
手动定义图表布局(节点coordinates/positions)(
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
)。这样图像更具可比性。