【问题标题】:Graphing Distributions in Discrete Time with pyplot用 pyplot 在离散时间绘制分布图
【发布时间】:2019-03-03 15:22:43
【问题描述】:

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

现在我将这些分布作为 scipy 分布对象的参数,并且能够单独绘制它们,例如(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 中制作类似于这些的绘图?

【问题讨论】:

  • 这是一个非常广泛的问题。 This 可能是一个不错的起点,然后在您尝试了一些事情后提出更具体的问题。

标签: python matplotlib scipy data-visualization


【解决方案1】:

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

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

结果如下图:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2012-06-27
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多