📜  如何在Python绘制直方图上的正态分布?

📅  最后修改于: 2022-05-13 01:55:41.048000             🧑  作者: Mango

如何在Python绘制直方图上的正态分布?

在本文中,我们将讨论如何使用Python在直方图上绘制正态分布。首先,我们将分别讨论直方图和正态分布图,然后将这两个图合并在一起。

直方图

直方图是在用户定义的范围内排列的一组数据点的图形表示。与条形图类似,条形图通过将多个数据点分组到逻辑区域或容器中,将一系列数据压缩成易于解释的视觉对象。

为了绘制这个,我们将使用:

  • random.normal()方法用于查找数据的正态分布。它有三个参数:
    • loc –(平均值)钟形顶部所在的位置。
    • 比例-(标准偏差)您希望图形分布的均匀程度。
    • size – 返回数组的形状
  • Matplotlib 库Pyplot模块中的函数hist()用于绘制直方图。它有如下参数:
    • data :这个参数是一个数据序列。
    • bin :此参数是可选的,包含整数、序列或字符串。
    • 密度:此参数是可选的,包含一个布尔值。
    • Alpha :值是一个介于 0 和 1 之间的整数,表示每个直方图的透明度。 n 的值越小,直方图越透明。
Python3
import numpy as np
import matplotlib.pyplot as plt
  
# Generating some random data
# for an example
data = np.random.normal(170, 10, 250)
  
# Plotting the histogram.
plt.hist(data, bins=25, density=True, alpha=0.6, color='b')
  
plt.show()


Python3
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import statistics
    
# Plot between -30 and 30 with
# 0.1 steps.
x_axis = np.arange(-30, 30, 0.1)
    
# Calculating mean and standard 
# deviation
mean = statistics.mean(x_axis)
sd = statistics.stdev(x_axis)
    
plt.plot(x_axis, norm.pdf(x_axis, mean, sd))
plt.show()


Python3
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
  
# Generate some data for this 
# demonstration.
data = np.random.normal(170, 10, 250)
  
# Fit a normal distribution to
# the data:
# mean and standard deviation
mu, std = norm.fit(data) 
  
# Plot the histogram.
plt.hist(data, bins=25, density=True, alpha=0.6, color='b')
  
# Plot the PDF.
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
  
plt.plot(x, p, 'k', linewidth=2)
title = "Fit Values: {:.2f} and {:.2f}".format(mu, std)
plt.title(title)
  
plt.show()


输出:



正态分布

正态分布图的特点是两个参数:

  • 平均值,代表图表的最大值,图表总是对称的。
  • 还有标准偏差,它决定了超出平均值的变化量。较小的标准偏差(与平均值相比)显得更陡峭,而较大的标准偏差(与平均值相比)显得平坦。

绘制正态分布

  • NumPy arange() 用于创建和返回对均匀分布的 ndarray 实例的引用。
  • 借助mean()stdev()方法,我们计算了均值和标准差,并初始化为均值sd变量。
  • 在 plot() 方法中,我们使用了一种方法pdf()来显示概率密度函数。这个pdf()方法存在于scipy.stats.norm 中。

例子:

蟒蛇3

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import statistics
    
# Plot between -30 and 30 with
# 0.1 steps.
x_axis = np.arange(-30, 30, 0.1)
    
# Calculating mean and standard 
# deviation
mean = statistics.mean(x_axis)
sd = statistics.stdev(x_axis)
    
plt.plot(x_axis, norm.pdf(x_axis, mean, sd))
plt.show()

输出:

直方图上的正态分布

现在,我们已经完成了直方图和正态分布图的分离讨论,但是如果我们可以在具有相同比例的图形中将它们可视化,那就太好了。这可以通过访问同一单元格中的两个图表然后使用plt.show()轻松实现现在,让我们讨论使用Python在直方图上绘制正态分布。



我们认为某些数据的直方图服从正态分布。 SciPy 有多种方法可以用来估计随机变量的最佳分布,以及可以最好地模拟这种适应性的参数。例如,对于这个问题中的数据,可以找到最佳拟合正态分布的均值和标准差如下:

# Make the normal distribution fit the data: 
mu, std = norm.fit (data) # mean and standard deviation

Matplotlib 库的 Pyplot 模块中的函数xlim() 用于获取或设置此轴的 x 限制。

蟒蛇3

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
  
# Generate some data for this 
# demonstration.
data = np.random.normal(170, 10, 250)
  
# Fit a normal distribution to
# the data:
# mean and standard deviation
mu, std = norm.fit(data) 
  
# Plot the histogram.
plt.hist(data, bins=25, density=True, alpha=0.6, color='b')
  
# Plot the PDF.
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
  
plt.plot(x, p, 'k', linewidth=2)
title = "Fit Values: {:.2f} and {:.2f}".format(mu, std)
plt.title(title)
  
plt.show()

输出: