这是我之前几个问题的后续。这是我正在玩的代码:
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats
import numpy as np
dictOne = {'Name':['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh', 'Eighth', 'Ninth'],
"A":[1, 2, -3, 4, 5, np.nan, 7, np.nan, 9],
"B":[4, 5, 6, 5, 3, np.nan, 2, 9, 5],
"C":[7, np.nan, 10, 5, 8, 6, 8, 2, 4]}
df2 = pd.DataFrame(dictOne)
column = 'B'
df2[df2[column] > -999].hist(column, alpha = 0.5)
param = stats.norm.fit(df2[column].dropna()) # Fit a normal distribution to the data
print(param)
pdf_fitted = stats.norm.pdf(df2[column], *param)
plt.plot(pdf_fitted, color = 'r')
我正在尝试制作数据框中单个列中数字的直方图——我可以这样做——但有一条重叠的正态曲线……类似于 here 上的最后一张图.我正在尝试让它在这个玩具示例中工作,以便我可以将它真正应用于我更大的数据集。我上面粘贴的代码给了我这张图:
为什么 pdf_fitted
与该图中的数据不匹配?如何叠加正确的 PDF?
最佳答案
如果您希望将直方图与真实的 PDF 进行比较,您应该使用 density=True
绘制直方图。否则,您的归一化(振幅)将关闭。
此外,您需要在绘制 pdf 时指定 x 值(作为有序数组):
fig, ax = plt.subplots()
df2[df2[column] > -999].hist(column, alpha = 0.5, density=True, ax=ax)
param = stats.norm.fit(df2[column].dropna())
x = np.linspace(*df2[column].agg([min, max]), 100) # x-values
plt.plot(x, stats.norm.pdf(x, *param), color = 'r')
plt.show()
顺便说一句,使用直方图将连续变量与分布进行比较并不总是最好的。 (您的示例数据是离散的,但链接使用连续变量)。 bin 的选择可以混淆直方图的形状,这可能会导致不正确的推断。相反,ECDF 是连续变量分布的更好(无选择)说明:
def ECDF(data):
n = sum(data.notnull())
x = np.sort(data.dropna())
y = np.arange(1, n+1) / n
return x,y
fig, ax = plt.subplots()
plt.plot(*ECDF(df2.loc[df2[column] > -999, 'B']), marker='o')
param = stats.norm.fit(df2[column].dropna())
x = np.linspace(*df2[column].agg([min, max]), 100) # x-values
plt.plot(x, stats.norm.cdf(x, *param), color = 'r')
plt.show()
关于python - 绘制带有叠加 PDF 的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56015457/