使用函数绘制 matplotlib 子图

Plotting matplotlib subplots with functions

我正在尝试创建一个函数来作为正态分布的快速视觉评估,并为整个数据框自动执行此操作。我想创建一个没有。 cols x 2 子图(2 列,数据框的每一列一行),左侧图是直方图,右侧是概率图。我已经为这些图中的每一个都编写了函数并且它们工作正常,而且我添加的 ax 参数可以成功地将它们绘制在特定的子图坐标中。当我尝试在最终函数中调用这些函数时,打算将它们应用于数据框中的每一列,仅返回第一个直方图,其余图表为空。

不确定我哪里出错了。请参阅下面的功能代码。注意,没有返回错误:

#Histogram for normality
def normal_dist_hist(data, ax):
    #Format data for plotting
    #Included ax for subplot coordinate
    if data.isnull().values.any() == True:
        data.dropna(inplace=True)
    if data.dtypes == 'float64':
        data.astype('int64')
    #Plot distribution with Gaussian overlay
    mu, std = stats.norm.fit(data)
    ax.hist(data, bins=50, density=True, alpha=0.6, color='g')
    xmin, xmax = ax.get_xlim()
    x = np.linspace(xmin, xmax, 100)
    p = stats.norm.pdf(x, mu, std)
    ax.plot(x, p, 'k', linewidth=2)
    title = "Fit results: mu = %.2f,  std = %.2f" % (mu, std)
    ax.set_title(title)
    plt.show()

    #Probability plot
def normal_test_QQplots(data, ax):
    #added ax argument for specifying subplot coordinate, 
    data.dropna(inplace=True)
    probplt = stats.probplot(data,dist='norm',fit=True,plot=ax)
    plt.show()

def normality_report(df):
    fig, axes = plt.subplots(nrows=len(df.columns), ncols=2,figsize=(12,50))
    ax_y = 0
    for col in df.columns[1:]:
        ax_x = 0
        normal_dist_hist(df[col], ax=axes[ax_y, ax_x])
        ax_x = 1
        normal_test_QQplots(df[col], ax=axes[ax_y, ax_x])
        ax_y += 1

从您的方法 normal_dist_hist(...)normal_test_QQplots(...) 中删除 plt.show()。在 normality_report(...).

末尾添加 plt.show()
def normal_dist_hist(data, ax):
    ...
    plt.show() # Remove this

#Probability plot
def normal_test_QQplots(data, ax):
    ...
    plt.show() # Remove this

def normality_report(df):
    ...
    for col in df.columns[1:]:
        ax_x = 0
        normal_dist_hist(df[col], ax=axes[ax_y, ax_x])
        ax_x = 1
        normal_test_QQplots(df[col], ax=axes[ax_y, ax_x])
        ax_y += 1
    plt.show() # Add it here.