如何绘制曲线下的直方图?
How to draw histograms under a curve?
假设我们有一个函数(比如正态分布的pdf),我们想用函数下的直方图来逼近它。我想指定 bins 的数量并在曲线下绘制直方图。 Python怎么可能呢?比如像下面这样的图,但是所有的尖峰都在曲线下方,bin的数量是一个参数。
您可以使用 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收集),在这里你可以找到额外的解释和想法:
假设我们有一个函数(比如正态分布的pdf),我们想用函数下的直方图来逼近它。我想指定 bins 的数量并在曲线下绘制直方图。 Python怎么可能呢?比如像下面这样的图,但是所有的尖峰都在曲线下方,bin的数量是一个参数。
您可以使用 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收集),在这里你可以找到额外的解释和想法: