You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

图连通分量识别完成后,如何将各连通分量单独绘制为独立图表

问题原因

你的代码无法输出图像的核心原因是: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:30:06