按数据框分组并迭代每个组的子图

问题描述 投票:0回答:1

我有一个数据框。我想(在步骤 1 中)按“Main”列对其进行分组(创建 df_M1 和 df_M2 并为每个创建的 df 制作子图)。在(步骤 2)中,按“Sub”列对每个 df(df_M1 和 df_M2)进行分组(以创建 df_S1、df_S2、df_S3、df_S4)。比在(步骤 3)中循环每个 Sub df 的列(col1 和 col2),将它们绘制在其中一个图上。实际上,步骤 1 创建了两个数据帧,步骤 2 为步骤 1 中创建的每个数据帧创建了四个数据帧。所以我想为(df_M1和df_M2)创建两组子图(每个子图有4个图(2 * 2)),以及(df_S1,df_S2,df_S3,df_S4)的每个子图。每个图包含 col1 和 col2 线图。 我编写了以下脚本,但是在子图上绘制图形存在问题。

创建示例数据框

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)
df_M = [x for _, x in df.groupby(['Main'])]
for i in df_M:
    fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(12,6), 
sharex=True,linewidth=1, edgecolor='black')
    df_S = [z for _, z in i.groupby(['Sub'])]
    for j in df_S:
        for col in j.columns.values[3:5]:
            ax.plot(j[col])
            plt.show()
python pandas numpy matplotlib subplot
1个回答
0
投票

您需要解决

axes
对象中的各个轴属性,即子图中 2x2 网格的第一行和第一列中的轴中的
axes[0,0]
绘图。

import matplotlib.pyplot as plt
import pandas as pd

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)
df_M = [x for _, x in df.groupby(["Main"])]


for groupName, groupdf in df.groupby(["Main"]):
    fig, axes = plt.subplots(
        nrows=2, ncols=2, figsize=(12, 6), sharex=True, linewidth=1, edgecolor="black"
    )

    for idx, (subGroupName, subGroupdf) in enumerate(groupdf.groupby(["Sub"])):
        row = 0 if idx < 2 else 1
        col = idx % 2
        for plottingCol in subGroupdf.columns.values[3:5]:
            axes[row, col].plot(subGroupdf[plottingCol])

    plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.