使用函数绘制 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.
我正在尝试创建一个函数来作为正态分布的快速视觉评估,并为整个数据框自动执行此操作。我想创建一个没有。 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.