繁体   English   中英

遍历DataFrame类别列以创建子图

[英]Iterate through DataFrame categorical columns to create subplots

我正在尝试为预定的x和y数据创建Subplots网格。 函数应遍历pandas DataFrame,标识类别变量,并为给定类别变量的每个级别用一行绘制x和y数据。 地块的数量等于分类变量的数量,并且每个地块上的行数应反映该变量的类别数量。

最初,我试图在给定类别变量的For循环中对Dataframe进行分组,但结果有些复杂。 我认为我的问题是如何分配绘制线条的轴。


def grouping_for_graphs(df,x_col, y_col,category,func):
    '''
    funtion to group dataframe given a variable and 
    aggregation function

    '''
    X = df[x_col].name
    y = df[y_col].name
    category = df[category].name

    df_grouped = df.groupby([X, category])[y].apply(func)
    return df_grouped.reset_index()


# create a list of categorical variables to plot
cat_list = []
col_list = list(df.select_dtypes(include = ['object']).columns)

for col in col_list:
    if len(df[col].unique()) < 7:
        cat_list.append(col)


# create plots and axes
fig, axs = plt.subplots(2, 2, figsize=(30,24))
axs = axs.flatten()
# pick plot function
plot_func = plt.plot

# plot this
for ax, category in zip(axs, cat_list):
    df_grouped = grouping_for_graphs(df,x_col, y_col,category,agg_func)
    x_col = df_grouped.columns[0]
    y_col = df_grouped.columns[-1]
    category = str(list(df_grouped.columns.drop([x_lab, y_lab]))[0])
    for feature in list(df_grouped[category].unique()):
        X = df_grouped[df_grouped[category] == feature][x_col]
        y = df_grouped[df_grouped[category] == feature][y_col]
        ax.plot = plot_func(X,y)
        ax.set_xlabel(x_col)
        ax.set_ylabel(y_col)
        ax.set_title(feature)

除了得到ax.plot是“列表”对象且不可调用的错误外,所有绘制的线都放在子图的最终图上。

我对您的plot_func感到困惑。 删除它并直接使用ax.plot(X, y)进行ax.plot(X, y) 修改后的行以注释突出显示

fig, axs = plt.subplots(2, 2, figsize=(30,24))
axs = axs.flatten()

for ax, category in zip(axs, cat_list):
    df_grouped = grouping_for_graphs(df,x_col, y_col,category,agg_func)
    x_col = df_grouped.columns[0]
    y_col = df_grouped.columns[-1]
    category = str(list(df_grouped.columns.drop([x_lab, y_lab]))[0])
    for feature in list(df_grouped[category].unique()):
        X = df_grouped[df_grouped[category] == feature][x_col]
        y = df_grouped[df_grouped[category] == feature][y_col]
        ax.plot(X,y) # <--- Modified here
        ax.set_xlabel(x_col)
        ax.set_ylabel(y_col)
        ax.set_title(feature)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM