如何使用 matplotlib 在函数之上绘制直方图?

How do I plot histograms on top of a function with matplotlib?

希望你能从图中看到,我有'x'的一整套功能。对于每个输入点,都有这些函数的分布,即平均值 (AVG) 和方差 (VAR)。如果可能的话,我想使用 matplotlib 在函数图的顶部绘制直方图,如图像右侧所示,但是如何?

您可以使用 scipy.stats.gausian_kde 计算核密度估计并将其垂直绘制。

下面是一些使用 20 条曲线的示例代码:

from matplotlib import pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde

N = 100
K = 20
ys = np.random.normal(0.1, 1, (N, K)).cumsum(axis=0)
ys -= ys.min(axis=0, keepdims=True)
x = np.arange(N)
plt.plot(x, ys, color='cornflowerblue', alpha=0.2)
plt.plot(x, ys.mean(axis=1), color='navy', lw=3, label='mean y')
for i in range(10, len(x), 20):
    yi = ys[i, :]
    ymin, ymax = yi.min(), yi.max()
    y_range = ymax - ymin
    ymin -= y_range * 0.1
    ymax += y_range * 0.1
    kde = gaussian_kde(yi, bw_method=y_range / 100)
    plt.vlines(x[i], ymin, ymax, ls=':', color='black')
    y = np.linspace(ymin, ymax, 200)
    kde_y = kde(y)
    kde_y *= - 10 / kde(y).max()
    kde_y += x[i]
    plt.plot(kde_y, y, color='black')
    plt.fill_betweenx(y, x[i], kde_y, color='black', alpha=.2)
plt.xticks(x[::10])
plt.show()