每日小语
我只有忘掉自己,才能津津有味地进行沉思和遐想。——卢梭
gpt代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# 随机生成一个服从正态分布的长度为1000的数组
data = np.random.randn(1000)
# 划分为25个区间
num_bins = 25
# 画直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=num_bins, density=True, alpha=0.7, color='blue', edgecolor='black')
# 画密度图
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, np.mean(data), np.std(data))
plt.plot(x, p, 'k', linewidth=2)
# 设置图的标题和标签
plt.title('Histogram and Density Plot of Random Data')
plt.xlabel('Value')
plt.ylabel('Density')
# 显示图形
plt.show()
上一道题中的那个1000,如果改小就不光滑了。
拆解分析代码
1.
from scipy.stats import norm
`from scipy.stats import norm` 是导入了 SciPy 库中的 `norm` 模块。在这个上下文中,`norm` 模块提供了正态分布(normal distribution)的相关函数,比如概率密度函数(PDF)等。
在之前的代码示例中,使用了 `norm.pdf()` 函数,该函数用于计算正态分布的概率密度函数。这在画密度图时非常有用,因为我们可以使用正态分布的概率密度函数来拟合数据并绘制密度曲线。
具体来说,`norm.pdf(x, np.mean(data), np.std(data))` 计算了在给定数据 `data` 的均值和标准差下,每个 `x` 值对应的正态分布的概率密度。这样就可以在图上画出数据的密度图,与直方图进行比较。
2.
num_bins = 25
`num_bins = 25` 是用于设置直方图的分箱数量的变量。在这个例子中,设置 `num_bins = 25` 表示将数据分为25个等宽的区间,每个区间用于绘制直方图的柱状图。
通过设置 `num_bins = 25`,我们将数据划分为25个区间,即将 x 轴的范围分为25个小块,根据数据落在每个小块中的数量绘制柱状图。这样设置可以在保持可读性和细节之间取得合适的平衡。
3.
# 画直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=num_bins, density=True, alpha=0.7, color='blue', edgecolor='black')
这部分代码是用 Matplotlib 库画直方图的部分。
- `plt.figure(figsize=(10, 6))` 创建一个图形对象,并设置其大小为宽度10和高度6。这是为了确保图形具有适当的大小,以便清晰地显示直方图和密度图。
- `plt.hist(data, bins=num_bins, density=True, alpha=0.7, color='blue', edgecolor='black')` 使用 `plt.hist()` 函数来生成直方图。其中的参数包括:
- `data` 是要绘制直方图的数据数组。
- `bins=num_bins` 表示将数据划分为指定数量的区间,即25个区间。
- `density=True` 表示将直方图转换为概率密度图。
- `alpha=0.7` 设置柱状图的透明度。
- `color='blue'` 设置柱状图的颜色。
- `edgecolor='black'` 设置柱状图的边框颜色。
这样,通过 `plt.hist()` 函数,我们在图形中画出了数据的直方图。
4.
# 画密度图
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, np.mean(data), np.std(data))
plt.plot(x, p, 'k', linewidth=2)
- 首先通过 `plt.xlim()` 获取 x 轴的范围,将最小值和最大值分别赋值给 `xmin` 和 `xmax`。
- 然后使用 `np.linspace(xmin, xmax, 100)` 生成了一个包含 100 个等间距值的数组 `x`,用于绘制密度图的 x 轴。
- 接下来使用 `norm.pdf(x, np.mean(data), np.std(data))` 计算了在给定数据 `data` 的均值和标准差下,每个 `x` 值对应的正态分布的概率密度。
`norm.pdf(x, np.mean(data), np.std(data))` 是使用 SciPy 库中的 `norm` 模块计算正态分布的概率密度函数(Probability Density Function,PDF)。具体解释如下:
- `x`:是一个包含数值的数组,表示要在其上计算概率密度函数的点。
- `np.mean(data)`:均值。
- `np.std(data)`:标准差。
使用 `norm.pdf(x, np.mean(data), np.std(data))` 可以根据给定的均值和标准差计算 `x` 值上的概率密度。
在这个上下文中,这行代码的作用是计算在数据 `data` 的均值和标准差下,每个 `x` 值对应的正态分布的概率密度,并将结果作为密度图的 y 值。
- 最后使用 `plt.plot(x, p, 'k', linewidth=2)` 画出了密度图,使用黑色线条 `'k'`,线宽为 2。
5.
# 设置图的标题和标签
plt.title('Histogram and Density Plot of Random Data')
plt.xlabel('Value')
plt.ylabel('Density')
这个不多赘述。
自己敲写
其实后面很多可以省略。
density=True蛮重要的,它把直方图变成了一个曲线。
极限精简
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
#生成1000的数组
data=np.random.randn(1000)
#划分为25个区间
num_bins=25
#直方图
plt.figure(figsize=(10,6))
plt.hist(data,bins=num_bins,density=True)
#密度图
xmin,xmax=plt.xlim()
x=np.linspace(xmin,xmax,100)
p = norm.pdf(x,np.mean(data),np.std(data))
plt.plot(x,p,'k',linewidth=2)
#
plt.show()
撒花花~