图连通分量识别完成后,如何将各连通分量单独绘制为独立图表
问题原因
你的代码无法输出图像的核心原因是:S是存储所有连通分量子图的列表对象,而nx.draw()仅支持接收单个NetworkX图对象作为输入,无法直接处理列表。
修正后可运行代码
首先确保你已经导入了必要的依赖库:
import networkx as nx import matplotlib.pyplot as plt
你原有提取连通分量的逻辑无需修改:
G = nx.karate_club_graph() # 该行用于统计各连通分量的大小,无相关需求可直接删除 connected_com=[len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)] # 生成所有连通分量的子图列表 S = [G.subgraph(c).copy() for c in nx.connected_components(G)]
方案1:每个连通分量生成独立图表
# 遍历所有连通分量子图 for idx, sub_graph in enumerate(S): # 每个分量单独创建画布,可自定义画布名称标识不同分量 plt.figure(f"连通分量{idx+1} | 节点数:{len(sub_graph)}", figsize=(6,6)) # 绘制子图,可按需添加参数调整样式,比如with_labels=True显示节点标签 nx.draw(sub_graph, with_labels=True, node_color="lightblue", edge_color="gray") # 一次性展示所有生成的独立图表 plt.show()
注:空手道俱乐部网络本身是全连通结构,测试时仅会生成1张图表,替换为你自己的5连通分量网络后,将自动生成5个独立图表。
方案2(可选):所有连通分量放在同一张画布的不同子图中
如果需要同时对比所有分量,可以用子图布局实现:
# 2行3列的子图布局,适配5个连通分量的展示需求 fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(18, 10)) # 将二维子图数组展平为一维,方便遍历 axes = axes.flatten() for idx, sub_graph in enumerate(S): current_ax = axes[idx] current_ax.set_title(f"连通分量{idx+1} | 节点数:{len(sub_graph)}") nx.draw(sub_graph, ax=current_ax, with_labels=True, node_color="lightblue", edge_color="gray") # 隐藏多余的空白子图 for empty_ax in axes[len(S):]: empty_ax.axis("off") # 自动调整子图间距 plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

