Python中如何关联不同索引的for循环以替换子图内容?
问题描述
我有两段代码:
fig,axs = plt.subplots(11,11) for i in range(11): for j in range(11): axs[i,j].plots[] plt.tight_layout() plt.savefig('.png') for label in sections['ab0']: print(label) print(plots[label])
其中,plots是一个以唯一label为键、Figure对象为值的字典:
{'90.0_30.0_40.0': <Figure size 640x480 with 1 Axes>, '0.0_0.0_90.0': <Figure size 640x480 with 1 Axes>, '90.0_100.0_30.0': <Figure size 640x480 with 1 Axes>, ..}
sections是一个以列表为值的字典,列表元素为label:
{'ab0': ['0.0_0.0_0.0', '0.0_0.0_10.0', '0.0_0.0_20.0',..], 'ab10': ['0.0_10.0_0.0', '0.0_10.0_10.0', '0.0_10.0_20.0',..], 'ab20': ['0.0_20.0_0.0', '0.0_20.0_10.0', '0.0_20.0_20.0',..], ..}
需要将第一个嵌套for循环中的plots[]替换为第二个循环中的plots[label],同时不打乱原有的i、j索引,不知如何实现或寻找替代方案。
解决方案
核心是建立i、j索引与sections['ab0']中label的对应关系,以下是两种实用方案:
方案1:将label列表转为二维数组映射
先把sections['ab0']的一维列表转为11x11的二维数组,直接通过i、j索引匹配label:
import numpy as np # 把label列表重构为11行11列的二维数组 label_grid = np.array(sections['ab0']).reshape(11, 11) fig, axs = plt.subplots(11, 11) for i in range(11): for j in range(11): current_label = label_grid[i, j] # 获取对应Figure中的轴对象 src_ax = plots[current_label].axes[0] # 复制源轴的绘图数据和样式到当前子图 for line in src_ax.lines: axs[i,j].plot(line.get_xdata(), line.get_ydata(), **line.get_properties()) # 同步标题、坐标轴标签等元素 axs[i,j].set_title(src_ax.get_title()) axs[i,j].set_xlabel(src_ax.get_xlabel()) axs[i,j].set_ylabel(src_ax.get_ylabel()) plt.tight_layout() plt.savefig('grid_plot.png')
方案2:通过扁平化索引匹配
无需额外库,计算i、j对应的一维索引,直接从label列表中取值:
fig, axs = plt.subplots(11, 11) label_list = sections['ab0'] for i in range(11): for j in range(11): # 计算扁平化索引:行号*列数 + 列号 idx = i * 11 + j current_label = label_list[idx] # 复制源图内容到当前子图 src_ax = plots[current_label].axes[0] for line in src_ax.lines: axs[i,j].plot(line.get_xdata(), line.get_ydata(), **line.get_properties()) # 同步图表元素 axs[i,j].set_title(src_ax.get_title()) axs[i,j].set_xlabel(src_ax.get_xlabel()) axs[i,j].set_ylabel(src_ax.get_ylabel()) plt.tight_layout() plt.savefig('grid_plot.png')
关键注意点
- 原代码中
axs[i,j].plots[]是错误写法,matplotlib的Axes对象使用plot()方法绘制内容。 plots[label]是独立的Figure对象,无法直接嵌入子图,必须提取其内部轴的绘图数据和样式,复制到新的子图中。
内容的提问来源于stack exchange,提问作者Admin Córdoba
相关产品推荐
相关产品推荐

