用pyplot绘制离散时间的分布图

时间:2018-09-27 16:40:47

标签: python matplotlib scipy data-visualization

我有一堆对应于离散时间的化学浓度分布。我想以这些图片(第一张图片来自Doing Bayesian Data Analysis,Kruschke)完成的方式,将这些分布全部绘制在同一图(图的图)上:enter image description here

现在,我将这些分布作为参数来配置分布对象,并能够单独绘制它们的图形,例如(其中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中制作一个像这样的图?

1 个答案:

答案 0 :(得分:2)

这是一种快速解决方案,可以实现您想要的目标。 它基于两个技巧:

  1. 使用ax.plot(y,x)代替ax.plot(x,y)来获得与示例类似的高斯方向
  2. 将所有高斯绘制在同一轴上,但是每次添加一个增加的偏移量以避免重叠。

这是通过以下代码实现的:

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()

其结果如下图所示:

enter image description here