如何编写循环为28个站点的四季PM2.5/PM10比值生成子图直方图
解决多站点多季节PM2.5/PM10比值直方图绘制问题
问题背景
现有7年28个站点的每日PM2.5/PM10比值数据,已拆分为4个结构、列名完全一致的季节DataFrame(春季、夏季、秋季、冬季)。需要生成28个独立Figure,每个Figure包含4个子图,分别对应该站点四个季节的比值分布直方图。之前的代码出现AttributeError等错误,以下是可行的实现方案。
完整实现代码
假设四个季节的DataFrame分别命名为df_spring、df_summer、df_autumn、df_winter,列名为站点标识(如Site_01至Site_28):
import pandas as pd import matplotlib.pyplot as plt # 定义季节数据与对应名称的配对列表 season_datasets = [ (df_spring, '春季'), (df_summer, '夏季'), (df_autumn, '秋季'), (df_winter, '冬季') ] # 获取所有站点列名(根据实际列名调整筛选逻辑,排除日期等非站点列) site_list = [col for col in df_spring.columns if col.startswith('Site_')] # 循环每个站点生成独立Figure for site_id in site_list: # 创建2行2列的子图布局,设置画布尺寸 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 10)) # 将二维轴数组展平为一维,方便循环遍历 axes_flat = axes.flatten() # 为每个季节绘制子图 for ax, (season_df, season_name) in zip(axes_flat, season_datasets): # 提取当前站点当前季节的有效数据(剔除空值) ratio_data = season_df[site_id].dropna() # 绘制直方图,可自定义bins数量、颜色等参数 ax.hist(ratio_data, bins=30, edgecolor='black', alpha=0.7) # 设置子图标题与坐标轴标签 ax.set_title(f'{season_name} 比值分布') ax.set_xlabel('PM2.5/PM10 比值') ax.set_ylabel('天数') # 添加网格线提升可读性 ax.grid(axis='y', linestyle='--', alpha=0.6) # 调整子图间距,避免标题、标签重叠 plt.tight_layout() # 设置整个Figure的主标题 fig.suptitle(f'站点 {site_id} 各季节PM2.5/PM10比值分布', y=1.02, fontsize=14) # 保存图片(可自定义保存路径与格式) plt.savefig(f'{site_id}_seasonal_ratio_hist.png', dpi=300, bbox_inches='tight') # 显示图片(交互式环境下启用) plt.show() # 关闭画布释放内存,避免内存泄漏 plt.close(fig)
常见错误排查(针对AttributeError)
- 列名不匹配:确保四个季节DataFrame的站点列名完全一致,比如避免出现
Site01和Site_01的拼写差异。可通过print(df_spring.columns)对比其他季节DataFrame的列名验证。 - 无效列名调用:确认
site_list中的列名确实存在于所有季节DataFrame中,避免因筛选逻辑错误导致调用不存在的列。 - 轴对象遍历错误:若直接遍历二维的
axes数组(未用flatten()),会导致轴对象与季节数据无法正确配对,引发属性访问错误。
内容的提问来源于stack exchange,提问作者obscuredbyclouds
相关产品推荐
相关产品推荐

