如何在单个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
相关产品推荐
相关产品推荐

