簡體   English   中英

如何使用 python matplotlib 繪制正態分布的直方圖?

[英]How do I draw a histogram for a normal distribution using python matplotlib?

我的問題是 - 使用 NumPy 函數 np.random.randn 為 100,000 點的正態分布生成數據 x。 然后 plot 一個直方圖。

我的計算是 -

x = sp.norm.pdf(np.random.randn(100000))
plt.hist(x, bins = 20, facecolor='blue', alpha=0.5)

有什么問題,因為我無法獲得正態分布的直方圖嗎?

在此處輸入圖像描述

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(100_000)
plt.hist(x, bins=20, facecolor="blue", alpha=0.5)

plt.show()

要從標准正態分布中獲取 N 個隨機樣本,您可以使用np.random.randn(N)或 scipy 的stats.norm.rvs(size=N) 然后這些樣本可用於創建直方圖。

要繪制曲線,可以使用stats.norm.pdf(y) ,其中y是一系列后續 x 值。 這樣的pdf是歸一化的,即 plot 下的面積為 1。直方圖的總面積是樣本數乘以 bin 的寬度(每個樣本正好落在一個 bin 中)。 因此,將 pdf 乘以該因子會將其縮放到直方圖的高度。

stats.norm.pdf(np.random.randn(N))的結果將是 N 個隨機樣本的概率列表。 大多數樣本最終會接近曲線的中心(在y = 0處),其中 pdf 的高度約為0.40 這解釋了該最大值附近的高峰值。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

N = 100000
# x = np.random.randn(N)
x = stats.norm.rvs(size=N)
num_bins = 20
plt.hist(x, bins=num_bins, facecolor='blue', alpha=0.5)

y = np.linspace(-4, 4, 1000)
bin_width = (x.max() - x.min()) / num_bins
plt.plot(y, stats.norm.pdf(y) * N * bin_width)

plt.show()

示例圖

'import numpy as np
import seaborn as sns
N = 1000
x = np.random.randn(N)
sns.histplot(x,bins=20,kde=True,color='red')'

使用 seaborn 的 histplot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM