【问题标题】:How to draw histograms under a curve?如何在曲线下绘制直方图?
【发布时间】:2021-12-31 19:22:49
【问题描述】:

假设我们有一个函数(比如正态分布的 pdf),我们想用函数下的直方图来近似它。我想指定箱的数量并在曲线下绘制直方图。在 Python 中怎么做?例如,如下图,但所有尖峰都在曲线下方,并且 bin 的数量是一个参数。

【问题讨论】:

标签: python matplotlib histogram


【解决方案1】:

您可以使用pdf 来决定条形的高度:

from scipy.stats import norm
import numpy as np
N = 20
x = np.linspace(norm.ppf([0.001, 0.999]), N)
y = norm.pdf(x)

条形的每个中心都与pdf 一样高,因此条形将切割曲线。只触及曲线,可以计算出最低点的pdf,正点为x + width/2。由于pdf 是对称的,abs 可用于为正 x 值和负 x 值创建单个表达式。

这是通过celluloid 库创建的动画。

import matplotlib.pyplot as plt
import numpy as np
import scipy
from scipy.stats import norm
from celluloid import Camera

fig, ax = plt.subplots(figsize=(8, 2))
fig.subplots_adjust(bottom=0.15, left=0.1, right=0.97)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
camera = Camera(fig)
x0, x1 = norm.ppf([0.001, 0.999])
x_pdf = np.linspace(x0, x1, 1000)
y_pdf = norm.pdf(x_pdf)
for N in range(10, 80):
    ax.plot(x_pdf, y_pdf, 'r', lw=2)
    x_bar = np.linspace(x0, x1, N)
    width = x_bar[1]-x_bar[0]
    y_bar = norm.pdf(np.abs(x_bar) + width/2)
    ax.bar(x_bar, y_bar, width=width, fc='DeepSkyBlue', ec='k')
    ax.margins(x=0)
    ax.set_ylabel('probability density')
    camera.snap()
animation = camera.animate(interval=600)
animation.save('gaussian_histogram.gif')
plt.show()

PS:以下是相关问题列表(由@TrentonMcKinney 收集),您可以在其中找到更多解释和想法:

【讨论】:

  • 非常感谢您的全面回答
  • 谢谢,约翰,是的,这正是我要找的。完成
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2019-11-04
相关资源
最近更新 更多