我有一堆对应于离散时间的化学浓度分布。我想以这些图片(第一张图片来自Doing Bayesian Data Analysis,Kruschke)完成的方式,将这些分布全部绘制在同一图(图的图)上: >
现在,我将这些分布作为参数来配置分布对象,并能够单独绘制它们的图形,例如(其中normal_param
来自正常cdf上的scipy.optimize.curve_fit
)
from matplotlib import pyplot as plt
import numpy
# values = [some float, some other float] which is a list of cdf sample concentrations
values = [...,...]
mean = numpy.mean(values)
std = numpy.std(values)
x1 = numpy.linspace(mean - (4*std), mean + (6*std), num=200)
plt.plot(x1, stats.norm.pdf(x1, scale=normal_param[1], loc=normal_param[0]),
linewidth=2.0, color='g')
我是matplotlib的新手,并且不确定完全从哪里开始添加这些单个图以制作多分布图的过程。
如何在matplotlib中制作一个像这样的图?
答案 0 :(得分:2)
这是一种快速解决方案,可以实现您想要的目标。 它基于两个技巧:
ax.plot(y,x)
代替ax.plot(x,y)
来获得与示例类似的高斯方向这是通过以下代码实现的:
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np
# Dummy values and dummy gaussian for plotting
gauss = lambda x, mu, sig, offset: offset-stats.norm.pdf(x, loc=mu, scale=sig)
means = [0, 1.5, 2.4, 2.8, 3.2]
scales = [1, 0.8, 0.6, 0.8, 0.7]
timesteps = list(range(len(means)))
# The actual plotting
fig, ax = plt.subplots(figsize=(6,4))
for mean, scale, ts in zip(means, scales, timesteps):
y_plot = np.linspace(mean-2*scale, mean+2*scale, 500)
ax.plot(gauss(y_plot, mean, scale, ts), y_plot, color='b')
ax.plot(gauss(mean, mean, scale, ts), mean, 'o', color='b')
ax.set_xticks(timesteps)
ax.set_xlabel('timesteps')
ax.set_ylabel('Concentration')
ax.set_ylim([-3,6])
plt.show()
其结果如下图所示: