首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Python绘制概率密度函数(PDF)图?

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

Stack Overflow用户
提问于 2022-02-28 15:05:08
回答 1查看 4K关注 0票数 2

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

这是我的密码。

代码语言:javascript
复制
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import scipy.stats as stats

代码语言:javascript
复制
x = np.random.normal(50, 3, 1000)
source = {"Genotype": ["CV1"]*1000, "AGW": x}
df=pd.DataFrame(source)
df

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

代码语言:javascript
复制
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图形吗?

总是非常感谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-28 15:16:51

您只需要对值进行排序(而不是真正检查编辑之后是什么)。

代码语言:javascript
复制
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)。在这种情况下,完整的代码是:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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点生成分布,我们只需要绘制我们已经拥有的分布的密度。所以你可以用这个:

代码语言:javascript
复制
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');

这意味着:

如果需要,可以使用其他包,如海运:

代码语言:javascript
复制
import seaborn as sns
plt.figure(figsize = (5,5))
sns.kdeplot(df["AGW"] , bw = 0.5 , fill = True)
plt.show()

或者这个:

代码语言:javascript
复制
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()

有关更多信息,请查看此文章

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71296986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档