使用networkx与matplotlib绘制并列网络图及中间运算符号的方法
实现多幅网络图横向排布并添加关系符号的正确方案
你之前的布局异常主要是因为子图宽度分配不合理、符号定位方式错误、未显式绑定绘图轴导致的,可通过Matplotlib的GridSpec自定义子图宽度比例实现需求,完整可运行代码如下:
import networkx as nx import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec # 模拟你封装的网络图绘制函数,注意必须接收ax参数指定绘制目标 def draw_model(G, ax): # 此处替换为你自己的绘图逻辑,nx.draw指定ax参数即可绘制到对应子图 nx.draw( G, ax=ax, with_labels=True, node_color="lightblue", edge_color="gray", node_size=500 ) # 构造示例网络图,替换为你自己的图对象即可 G_total = nx.grid_2d_graph(1, 5) G_part1 = nx.grid_2d_graph(1, 2) G_part2 = nx.grid_2d_graph(1, 2) # 创建画布,调整figsize适配横向布局 fig = plt.figure(figsize=(12, 3)) # 定义1行5列的网格,自定义宽度比例:网络图列宽,符号列窄 gs = GridSpec(1, 5, width_ratios=[3, 0.5, 3, 0.5, 3]) # 绘制第一张网络图 ax1 = fig.add_subplot(gs[0]) draw_model(G_total, ax1) # 添加等号 ax_eq = fig.add_subplot(gs[1]) ax_eq.axis("off") # 隐藏符号列的坐标轴边框、刻度 # 相对坐标居中放置符号,字号可按需调整 ax_eq.text(0.5, 0.5, "$=$", fontsize=30, ha="center", va="center") # 绘制第二张网络图 ax2 = fig.add_subplot(gs[2]) draw_model(G_part1, ax2) # 添加并集符号 ax_cup = fig.add_subplot(gs[3]) ax_cup.axis("off") ax_cup.text(0.5, 0.5, "$\cup$", fontsize=30, ha="center", va="center") # 绘制第三张网络图 ax3 = fig.add_subplot(gs[4]) draw_model(G_part2, ax3) # 自动调整布局避免元素重叠 plt.tight_layout() plt.show()
关键优化点
- 用GridSpec自定义子图宽度比例,避免符号列占用过多空间挤压网络图
- 符号列关闭坐标轴,使用相对坐标居中放置符号,适配不同画布大小
- 所有绘图操作显式指定ax参数,保证图形绘制到对应子图,不会出现位置错乱
内容的提问来源于stack exchange,提问作者Jsevillamol
相关产品推荐
相关产品推荐

