【发布时间】:2019-12-12 13:23:31
【问题描述】:
我有一个与之前已回答的问题类似的问题 (matplotlib: make plots in functions and then add each to a single subplot figure)。但是,我想要更高级的情节。我正在使用这个函数进行绘图(取自https://towardsdatascience.com/an-introduction-to-bayesian-inference-in-pystan-c27078e58d53):
def plot_trace(param, param_name='parameter', ax=None, **kwargs):
"""Plot the trace and posterior of a parameter."""
# Summary statistics
mean = np.mean(param)
median = np.median(param)
cred_min, cred_max = np.percentile(param, 2.5), np.percentile(param, 97.5)
# Plotting
#ax = ax or plt.gca()
plt.subplot(2,1,1)
plt.plot(param)
plt.xlabel('samples')
plt.ylabel(param_name)
plt.axhline(mean, color='r', lw=2, linestyle='--')
plt.axhline(median, color='c', lw=2, linestyle='--')
plt.axhline(cred_min, linestyle=':', color='k', alpha=0.2)
plt.axhline(cred_max, linestyle=':', color='k', alpha=0.2)
plt.title('Trace and Posterior Distribution for {}'.format(param_name))
plt.subplot(2,1,2)
plt.hist(param, 30, density=True); sns.kdeplot(param, shade=True)
plt.xlabel(param_name)
plt.ylabel('density')
plt.axvline(mean, color='r', lw=2, linestyle='--',label='mean')
plt.axvline(median, color='c', lw=2, linestyle='--',label='median')
plt.axvline(cred_min, linestyle=':', color='k', alpha=0.2, label='95% CI')
plt.axvline(cred_max, linestyle=':', color='k', alpha=0.2)
plt.gcf().tight_layout()
plt.legend()
我希望这两个子图用于不同的参数。如果我使用此代码,它只会覆盖绘图并忽略 ax 参数。请您帮助我如何使其不仅适用于 2 个参数吗?
params = [mu_a,mu_tau]
param_names = ['A mean','tau mean']
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(16,16))
fig.subplots_adjust(hspace=0.5)
fig.suptitle('Convergence and distribution of parameters')
plot_trace(params[0], param_name=param_names[0], ax = ax1)
plot_trace(params[1], param_name=param_names[1], ax = ax2)
预期的结果是让这些地块彼此相邻 How one subplot should look like (what the function makes)。谢谢。
【问题讨论】:
-
您必须使用
ax1.plot/ax2.plot进行绘图,例如:matplotlib.org/3.1.1/api/_as_gen/… -
是的,您的函数需要采用 两个 轴并专门针对这些轴进行绘图。
标签: python matplotlib subplot