我有一个关于绘制概率密度函数(PDF)图的问题,无论 Python 中的样本大小如何。
这是我的代码。
# Library
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats
# Data frame
x = np.random.normal(45, 9, 1000)
source = {"Genotype": ["CV1"]*1000, "AGW": x}
df=pd.DataFrame(source)
# Calculating PDF
df_mean = np.mean(df["AGW"])
df_std = np.std(df["AGW"])
pdf = stats.norm.pdf(df["AGW"].sort_values(), df_mean, df_std)
# Graph
plt.plot(df["AGW"].sort_values(), pdf, color="black")
plt.xlim([0,90])
plt.xlabel("Grain weight (mg)", size=12)
plt.ylabel("Frequency", size=12)
plt.grid(True, alpha=0.3, linestyle="--")
plt.show()
这是图表。但是,当我将样本数从 1000 更改为 100 时,例如x = np.random.normal(45, 9, 100)
,图形形状会发生变化。
这是因为缺乏样本量不能代表完全的正态分布。如果我们在 Excel 中绘制一个样本量有限的正态分布图,我们可以发现同样的问题。
但是,在 R 中,stat_function()
无论样本大小如何,始终提供相同形状的正态分布图。
在 R 中,当我运行以下代码时,无论样本大小如何,我都可以获得相同形状的正态分布图。它假设给定均值和标准差的完全正态分布。
你能告诉我如何在 Python 中像 R 一样获得如此一致的正态分布图吗?无论样本大小如何,我都想在 Python 中获得相同形状的正态分布图。
总是,非常感谢!!
AGW<-rnorm(100, mean=45, sd=9)
Genotype<-c(rep("CV1",100))
df<- data.frame (Genotype, AGW)
ggplot () +
stat_function(data=df, aes(x=AGW), color="Black", size=1, fun = dnorm,
args = c(mean = mean(df$AGW), sd = sd(df$AGW))) +
scale_x_continuous(breaks = seq(0,90,10),limits = c(0,90)) +
scale_y_continuous(breaks = seq(0,0.05,0.01), limits = c(0,0.05)) +
labs(x="Grain weight (mg)", y="Frequency") +
theme_grey(base_size=15, base_family="serif")+
theme(axis.line= element_line(size=0.5, colour="black")) +
windows(width=6, height=5)