Matplotlib嵌套循环绘制子图问题:按外层循环分组展示子图
解决Python子图组合问题:将独立图表合并为按外层分类的组合图
嘿,我明白你现在的需求——原来的嵌套循环生成了30张独立图,现在要把每个外层时间段(morning、latemorning这些)对应的6个指标图都放到同一张画布上,对吧?这其实只需要调整一下子图的创建逻辑,把原来每次调用绘图函数生成独立图的方式,改成在每个外层循环里先创建一个包含6个子图的画布,然后把每个指标的图画到对应的子图位置上就行。
我给你整理了具体的实现思路和代码示例:
第一步:调整循环结构与子图布局
首先,你需要在外层循环的每一次迭代中,创建一个包含6个子图的画布。考虑到6个指标,把布局设成2行3列会比较美观(1行6列容易挤在一起),这里我就用这个布局来举例。
第二步:修改绘图函数的参数
原来的绘图函数应该是直接创建新图并绘制,现在需要让它接受一个ax参数,把图画到指定的子图对象上,而不是每次新建画布。
假设你原来的绘图函数大概是这样的:
def plot_metric(data, metric_name): plt.figure() # 这里是你的绘图逻辑,比如plt.plot(data)之类的 plt.title(metric_name) plt.savefig(f"{metric_name}.png")
那现在要改成:
def plot_metric(data, metric_name, ax): # 把绘图操作都绑定到传入的ax对象上 ax.plot(data) # 替换成你实际的绘图代码,比如bar、hist等等 ax.set_title(metric_name) ax.set_xlabel("X轴标签") # 根据你的数据添加合适的标签 ax.set_ylabel("Y轴标签")
第三步:重构循环逻辑
现在在外层循环中,先创建子图画布,然后内层循环依次把每个指标的图画到对应的子图上,最后保存整个组合图。
完整的代码示例大概是这样的:
import matplotlib.pyplot as plt # 假设你的外层时间段列表和内层指标列表 time_periods = ["morning", "latemorning", "afternoon", "evening", "night"] metrics = ["records", "counts", "avgrate", "avglen", "loccnt", "avgduration"] # 假设你有一个获取对应数据的函数,比如get_data(time_period, metric) def get_data(time_period, metric): # 这里替换成你实际获取数据的逻辑,返回要绘制的数据 return [1,2,3,4,5] # 示例数据 # 修改后的绘图函数 def plot_metric(data, metric_name, ax): ax.plot(data) ax.set_title(metric_name) ax.tick_params(axis='x', labelsize=8) # 调整刻度大小避免拥挤 # 外层循环处理每个时间段 for period in time_periods: # 创建2行3列的子图画布,figsize可以根据需要调整 fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 10)) # 把axes展平成一维数组,方便内层循环遍历 axes = axes.flatten() # 内层循环处理每个指标,绘制到对应的子图 for idx, metric in enumerate(metrics): data = get_data(period, metric) plot_metric(data, metric, axes[idx]) # 调整子图之间的间距,避免标题和标签重叠 plt.tight_layout() # 添加整个组合图的标题 fig.suptitle(f"Metrics Summary - {period}", fontsize=14, y=1.02) # 保存当前时间段的组合图 plt.savefig(f"{period}_metrics_summary.png", dpi=300, bbox_inches='tight') # 关闭画布,避免内存占用 plt.close(fig)
关键要点解释
plt.subplots(nrows=2, ncols=3):创建一个包含2行3列子图的画布,返回的axes是二维数组,用flatten()转成一维后更方便遍历。- 绘图函数接受
ax参数:这样就能把每个指标的图画到指定的子图位置,而不是每次新建独立图。 plt.tight_layout()和fig.suptitle():前者自动调整子图间距,后者添加整个组合图的大标题,让图表更美观清晰。bbox_inches='tight':保存图片时避免标题或标签被裁剪。
这样修改之后,你就会得到5张组合图,每个时间段对应一张,每张图里包含6个指标的子图,完美符合你的需求!
内容的提问来源于stack exchange,提问作者user8652079
相关产品推荐
相关产品推荐

