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

Python Matplotlib如何使用for循环高效创建多个子图

基于for循环的多子图通用绘制方案

完全不需要重复复制粘贴绘图代码,也不用手动为每个类别单独拆分DataFrame、逐个命名ax对象,通过遍历+数组扁平化的方式可以适配任意数量的子图,不管是4个还是14个类别只需要调整少量布局参数即可。

核心优化逻辑:

  • 直接读取DataFrame里category列的唯一值作为类别列表,省去手动筛选df_A/df_B/...的重复代码
  • 调用plt.subplots()返回的ax是二维数组,用flatten()方法拉成一维数组后可以直接按索引遍历,不用手动写嵌套的ax解包代码
  • 所有子图的绘图逻辑统一写在循环内,修改样式只需要改一次,不会出现复制粘贴漏改参数的问题

通用可直接运行的代码如下:

import matplotlib.pyplot as plt
import pandas as pd

# 按需调整配置参数即可
categories = sorted(df['category'].unique())  # 自动提取所有类别,无需手动枚举
n_categories = len(categories)
n_rows = 7    # 14个类别可以设为7行2列刚好排满,也可以选4行4列留2个空位
n_cols = 2
fig, axes = plt.subplots(n_rows, n_cols, figsize=(12, 20), dpi=100)

fig.suptitle('Distributions per category in minutes', fontweight="bold", fontsize=15)

# 将二维子图数组转为一维,方便按顺序匹配类别
axes = axes.flatten()

# 循环绘制每个子图
for i, cat in enumerate(categories):
    current_ax = axes[i]
    # 实时筛选当前类别数据,无需提前拆分存储
    cat_data = df[df['category'] == cat]['time_spent']
    current_ax.hist(cat_data, color="darkcyan", edgecolor='black', bins=20)
    current_ax.set_title(f'Category {cat}', fontsize=10)

# 如果子图总数多于类别数,隐藏多余的空白子图
for i in range(n_categories, len(axes)):
    axes[i].axis('off')

fig.tight_layout()
plt.show()

如果需要调整布局,只需要修改n_rows和n_cols的数值,保证二者乘积大于等于类别总数即可,比如14个类别也可以设置为3行5列(共15个位置,隐藏最后1个空白子图),其余绘图逻辑完全不需要改动。

内容的提问来源于stack exchange,提问作者Joehat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:42:38