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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:02:32