求助:DataFrame多级分组后批量绘制子图的实现方法
解决DataFrame分组子图绘制折线图的轴分配问题
需求描述
- 按'Main'列分组生成df_M1(Main=A)和df_M2(Main=B),为每个分组创建独立的子图组
- 每个Main分组的DataFrame按'Sub'列再分组,生成4个Sub分组(如A1/A2/A3/A4、B1/B2/B3/B4)
- 每个Sub分组对应一个子图,以'Date'为X轴,在子图中绘制col1和col2的折线图;每个Main分组对应2×2布局的子图组(共4个子图)
现有代码问题
原代码未正确定义子图轴对象(ax未关联到具体子图),且绘图逻辑混乱,无法将每个Sub分组的图表对应到指定子图位置。
示例DataFrame代码
import pandas as pd import matplotlib.pyplot as plt data = {'Date': [2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001], 'Main': ['A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B'], 'Sub' : ['A1','A1','A2','A2','A3','A3','A4','A4','B1','B1','B2','B2','B3','B3','B4','B4'], 'col1' : [1,2,4,5,1,2,6,4,8,5,7,2,4,5,1,2], 'col2' : [5,6,1,4,5,4,5,1,5,4,5,6,4,5,8,4]} df = pd.DataFrame(data)
修正后的代码
import pandas as pd import matplotlib.pyplot as plt # 创建示例DataFrame data = {'Date': [2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001,2000,2001], 'Main': ['A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B'], 'Sub' : ['A1','A1','A2','A2','A3','A3','A4','A4','B1','B1','B2','B2','B3','B3','B4','B4'], 'col1' : [1,2,4,5,1,2,6,4,8,5,7,2,4,5,1,2], 'col2' : [5,6,1,4,5,4,5,1,5,4,5,6,4,5,8,4]} df = pd.DataFrame(data) # 按Main分组处理每个子图组 for main_name, main_group in df.groupby('Main'): # 创建2×2子图布局,将二维axes转为一维数组方便索引 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12,6), sharex=True, linewidth=1, edgecolor='black') axes = axes.flatten() # 遍历每个Sub分组,分配对应子图轴 for idx, (sub_name, sub_group) in enumerate(main_group.groupby('Sub')): current_ax = axes[idx] # 以Date为X轴,绘制col1和col2的折线图 current_ax.plot(sub_group['Date'], sub_group['col1'], label='col1', marker='o') current_ax.plot(sub_group['Date'], sub_group['col2'], label='col2', marker='s') # 配置子图细节 current_ax.set_title(f'Sub: {sub_name}') current_ax.legend() # 配置整个图组的标题和布局 fig.suptitle(f'Main Group: {main_name}', fontsize=14) fig.text(0.5, 0.04, 'Date', ha='center', fontsize=12) fig.tight_layout(rect=[0, 0.03, 1, 0.95]) # 避免标题与子图重叠 plt.show()
关键修正说明
- 将
axes二维数组扁平化(axes.flatten()),通过索引0-3直接对应4个Sub分组的子图 - 使用
enumerate获取Sub分组的顺序索引,确保每个Sub数据匹配到正确的子图位置 - 明确指定X轴为
sub_group['Date'],符合需求要求 - 添加标题、图例和布局优化,提升图表可读性
内容的提问来源于stack exchange,提问作者Jabbar
相关产品推荐
相关产品推荐

