如何在 Python 中绘制概率密度函数 (PDF) 图?

How to draw the Probability Density Function (PDF) plot in Python?

我想问一下如何在Python中绘制概率密度函数(PDF)图。

这是我的代码。

import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import scipy.stats as stats

.

x = np.random.normal(50, 3, 1000)
source = {"Genotype": ["CV1"]*1000, "AGW": x}
df=pd.DataFrame(source)
df

我生成了一个数据框。然后,我试着画了一个PDF图。

df["AGW"].sort_values()
df_mean = np.mean(df["AGW"])
df_std = np.std(df["AGW"])
pdf = stats.norm.pdf(df["AGW"], df_mean, df_std)

plt.plot(df["AGW"], pdf)

我得到了上图。我做错了什么?能否告诉我如何绘制概率密度函数 (PDF) 图,也称为正态分布图。

你能告诉我绘制PDF图形需要使用哪些代码(或库)吗?

非常感谢!!

您只需要对值进行排序(而不是真正检查 edit 之后的内容)

pdf = stats.norm.pdf(df["AGW"].sort_values(), df_mean, df_std)

plt.plot(df["AGW"].sort_values(), pdf)

它会起作用。

df["AGW"].sort_values()没有改变df。也许你的意思是 df.sort_values(by=['AGW'], inplace=True)。 在这种情况下,完整代码将是:

import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import scipy.stats as stats

x = np.random.normal(50, 3, 1000)
source = {"Genotype": ["CV1"]*1000, "AGW": x}
df=pd.DataFrame(source)

df.sort_values(by=['AGW'], inplace=True)
df_mean = np.mean(df["AGW"])
df_std = np.std(df["AGW"])
pdf = stats.norm.pdf(df["AGW"], df_mean, df_std)

plt.plot(df["AGW"], pdf)

给出:

编辑:

我想这里我们已经有了分布(x 是正态分布的)所以我们不需要生成 x 的 pdf。由于 pdf 的用途是这样的:

mu = 50
variance = 3
sigma = math.sqrt(variance)
x = np.linspace(mu - 5*sigma, mu + 5*sigma, 1000)
plt.plot(x, stats.norm.pdf(x, mu, sigma))
plt.show()

这里我们不需要从x点生成分布,我们只需要绘制我们已有的分布的密度。 所以你可以使用这个:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
x = np.random.normal(50, 3, 1000)  #Generating Data
source = {"Genotype": ["CV1"]*1000, "AGW": x}
df=pd.DataFrame(source) #Converting to pandas DataFrame
df.plot(kind = 'density'); # or df["AGW"].plot(kind = 'density');

给出:

如果你愿意,你可以使用其他包,比如 seaborn :

import seaborn as sns
plt.figure(figsize = (5,5))
sns.kdeplot(df["AGW"] , bw = 0.5 , fill = True)
plt.show()

或者这个:

import seaborn as sns
sns.set_style("whitegrid")  # Setting style(Optional)
plt.figure(figsize = (10,5)) #Specify the size of figure
sns.distplot(x = df["AGW"]   ,  bins = 10 , kde = True , color = 'teal'
            , kde_kws=dict(linewidth = 4 , color = 'black')) #kde for normal distribution
plt.show()

查看此 article 了解更多信息。