0

我有一个关于绘制概率密度函数(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)

在此处输入图像描述

4

0 回答 0