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
相关产品推荐
相关产品推荐

