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

如何在单个Figure中紧凑清晰地可视化多个NetworkX图?

多图同画布可视化实现方案(NetworkX + Matplotlib)

核心思路

利用Matplotlib的子图网格布局,将5个图(原Graph + Graph2~Graph5)紧凑排列在同一画布上,通过统一视觉参数、优化布局间距来保证每个图的边、节点及字体清晰可读,同时避免空间浪费。

具体实现步骤

  • 构建子图网格:选择2行3列的布局(容纳5个图后空出1个位置),通过调整画布尺寸保证每个子图有足够展示空间。
  • 批量处理图数据:将所有图的边与权重数据存入列表,循环遍历完成绘制,减少重复代码。
  • 统一视觉配置:固定节点大小、字体尺寸、边宽映射规则,确保不同图的视觉风格一致且元素清晰。
  • 优化布局细节:隐藏子图坐标轴、调整子图间距,避免元素重叠干扰。

完整代码示例

import networkx as nx
import matplotlib.pyplot as plt

# 定义各图的边与权重数据(替换为你的实际数据)
graph1_edges = [("A", "B", 0.8), ("A", "C", 0.5), ("B", "C", 0.3)]
graph2_edges = [("X", "Y", 1.0)]
graph3_edges = [("P", "Q", 0.6), ("Q", "R", 0.7)]
graph4_edges = [("M", "N", 0.4), ("N", "O", 0.9), ("M", "O", 0.2)]
graph5_edges = [("S", "T", 0.5), ("T", "U", 0.5), ("U", "V", 0.5), ("V", "S", 0.5)]

# 打包所有图数据,便于批量处理
graphs = [
    ("Graph 1", graph1_edges),
    ("Graph 2", graph2_edges),
    ("Graph 3", graph3_edges),
    ("Graph 4", graph4_edges),
    ("Graph 5", graph5_edges)
]

# 创建画布与2行3列的子图网格,设置合适的画布尺寸
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(16, 10))
# 将二维子图数组转为一维列表,方便索引
axes = axes.flatten()

# 循环绘制每个图
for idx, (title, edges) in enumerate(graphs):
    ax = axes[idx]
    # 初始化图对象并添加带权重的边
    G = nx.Graph()
    G.add_weighted_edges_from(edges)
    # 固定布局种子,保证每次绘制的节点位置一致
    pos = nx.spring_layout(G, seed=42)
    
    # 绘制节点:设置足够大的节点尺寸,保证清晰
    nx.draw_networkx_nodes(G, pos, ax=ax, node_size=800, node_color="#61a5c2")
    # 绘制边:根据权重缩放宽度,让权重差异可视化
    edge_widths = [d["weight"] * 3 for u, v, d in G.edges(data=True)]
    nx.draw_networkx_edges(G, pos, ax=ax, width=edge_widths, edge_color="#2c3e50")
    # 绘制节点标签:加粗字体,设置合适字号
    nx.draw_networkx_labels(G, pos, ax=ax, font_size=12, font_weight="bold")
    # 绘制边权重标签(可选,按需保留)
    edge_labels = {(u, v): round(d["weight"], 1) for u, v, d in G.edges(data=True)}
    nx.draw_networkx_edge_labels(G, pos, ax=ax, edge_labels=edge_labels, font_size=10)
    
    # 设置子图标题并隐藏坐标轴
    ax.set_title(title, fontsize=14, fontweight="bold")
    ax.axis("off")

# 隐藏多余的第6个子图
axes[5].axis("off")

# 自动调整子图间距,避免元素重叠
plt.tight_layout()
plt.show()

关键优化技巧

  • 固定布局种子:spring_layout的seed参数固定节点位置,保证图的布局可复现,便于对比不同图的结构。
  • 视觉参数统一:节点大小、字体尺寸、边宽缩放系数统一设置,避免不同图之间视觉风格混乱。
  • 画布尺寸适配:根据子图数量调整figsize,2行3列布局使用(16,10)的尺寸能平衡紧凑性与可读性。
  • 边宽映射:将权重乘以系数(如3),放大权重差异,同时保证细边也能清晰显示。
  • 干扰元素隐藏:关闭子图坐标轴,减少无关视觉元素对图结构的干扰。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:03:16