python创建服从正态分布的频次直方图和KDE图

本文介绍了使用Python进行数据可视化的方法,包括用numpy生成正态分布数据,用matplotlib和seaborn绘制一维正态分布直方图,用KDE获取变量分布的平滑估计,将频次直方图和KDE结合,以及绘制二维KDE图等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

画频次直方图需要先用numpy生成服从正态分布的数据,然后用matplotlib画图。其中seaborn也是python的一个数据可视化的库。用seaborn画图比matplotlib更方便和好看点,其底层也是matplotlib.

import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

1.绘制一维正态分布直方图

data=np.random.normal(0,1,1000)#生成一组期望值=0,标准差=1的标准正太分布数组,数组中有1000个元素
plt.hist(data,bins=10,alpha=0.5)
data2=np.random.normal(0,1,1000)#生成第二组数据
plt.hist(data2,bins=10,alpha=0.5)

 

还可以用np.random.randn生成正态分布数据,sigma是标准差,mu是期望值

data= sigma* np.random.randn(1000) + mu

 2.用KDE获取变量分布的平滑估计。

sns.kdeplot(data,shade=True)
sns.kdeplot(data2,shade=True)

 

 3.频次直方图和KDE的结合

sns.distplot(data)
sns.distplot(data2)

4.绘制二维KDE图

当输入的数据是二维时,sns.kdeplot就可绘制一个二维的数据可视化图。

data0=pd.DataFrame(np.array([data,data2]).T,columns=['x','y'])#将data,data2封装成DataFrame的x,y列,方便后面进行联合分布。
sns.kdeplot(data0)

 

绘制两个变量的联合分布与单变量的独立分布。

with sns.axes_style('white'):#使用白色背景
    sns.jointplot('x','y',data0,kind='kde')

修改jointplot的参数,用六边形块代替频次直方图

同时绘制了相对应的散点图

<think>好的,我现在需要解决用户的问题:如何使用Pythonmatplotlib或seaborn绘制直方图并叠加正态分布曲线。首先,我得回忆一下这两个库的基本用法,特别是关于直方图分布曲线的绘制方法。 用户提到了matplotlibseaborn,所以我应该考虑这两种库的不同方法。首先,matplotlib中绘制直方图通常用hist函数,而叠加曲线可能需要计算正态分布的参数,然后使用plot函数绘制。对于seaborn,可能更简单,因为它有更高级的接口,比如distplot或者histplot结合kde参数,但需要注意版本问题,因为distplot可能在较新的版本中被弃用,改用histplot。 接下来,我需要确定正态分布曲线的参数,即均值标准差。这可以通过数据本身计算得到,使用numpy的meanstd函数。然后使用scipy.stats的norm函数生成对应的概率密度函数(PDF),再将其绘制在直方图上。 另外,用户提供的引用中有提到KDE,但用户明确想要的是正态分布曲线,而不是KDE估计。所以需要注意区分,KDE是核密度估计,而这里需要的是参数化的正态分布曲线,即基于数据均值标准差的理论曲线。 可能的步骤是: 1. 导入必要的库,如matplotlib.pyplot, numpy, scipy.stats。 2. 生成或加载数据。 3. 绘制直方图,设置density=True使得直方图归一化为密度形式,便于与正态分布曲线比较。 4. 计算数据的均值标准差。 5. 生成x轴的数值范围,覆盖数据的范围。 6. 计算对应的正态分布PDF值。 7. 在同一中用plot函数绘制曲线。 8. 使用seaborn时,可能需要结合histplotlineplot,或者直接使用distplot(如果版本允许)并调整参数。 需要检查代码是否正确处理了直方图的归一化,以及正态分布曲线的参数是否正确。例如,在matplotlib中,如果直方图的density参数设为True,那么曲线下面积总为1,对应的正态分布也应该用相同的比例绘制。 此外,引用[3]提到了在Pandas中绘制密度,并希望叠加直方图。这可能涉及到在同一个axes对象上多次绘,比如先画直方图,再画曲线,或者使用seaborn的FacetGrid等。 可能的错误点包括:忘记导入必要的库(如scipy.stats),直方图的bins设置不合理,或者没有正确计算正态分布的参数。此外,需要确保数据是连续型的,适合用正态分布拟合。 最后,应该给出示例代码,并解释每一步的作用,同时指出可能的调整参数,比如bins的数量,颜色,透明度等,以增强可视化效果。</think>### 逐步解答:使用Python绘制直方图并叠加正态分布曲线 以下是使用 **Matplotlib** **Seaborn** 的两种实现方法: --- #### **方法1:使用Matplotlib** ```python import matplotlib.pyplot as plt import numpy as np from scipy.stats import norm # 生成示例数据(假设数据服从正态分布) data = np.random.normal(loc=50, scale=10, size=1000) # 绘制直方图(归一化为密度) plt.figure(figsize=(8, 5)) plt.hist(data, bins=30, density=True, alpha=0.6, color='skyblue', edgecolor='black') # 计算正态分布参数 mu = np.mean(data) # 均值 sigma = np.std(data) # 标准差 # 生成正态分布曲线 xmin, xmax = plt.xlim() x = np.linspace(xmin, xmax, 100) p = norm.pdf(x, mu, sigma) plt.plot(x, p, 'r-', linewidth=2, label='正态分布曲线') # 添加标签例 plt.xlabel('数值') plt.ylabel('密度') plt.title('直方图正态分布曲线') plt.legend() plt.show() ``` --- #### **方法2:使用Seaborn(更简洁)** ```python import seaborn as sns import numpy as np from scipy.stats import norm # 生成示例数据 data = np.random.normal(loc=50, scale=10, size=1000) # 绘制直方图+KDE(需关闭KDE,手动添加正态曲线) plt.figure(figsize=(8, 5)) sns.histplot(data, bins=30, stat='density', kde=False, alpha=0.6, color='skyblue') # 计算正态分布参数 mu, sigma = np.mean(data), np.std(data) x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100) plt.plot(x, norm.pdf(x, mu, sigma), 'r-', label='正态分布曲线') # 美化表 plt.title('Seaborn直方图正态分布曲线') plt.legend() plt.show() ``` --- ### **关键说明** 1. **直方图归一化**:通过 `density=True`(Matplotlib)或 `stat='density'`(Seaborn)将直方图转换为密度形式,与概率密度函数(PDF)匹配[^1][^3]。 2. **正态分布参数**:使用 `np.mean()` `np.std()` 计算数据的均值 $\mu$ 标准差 $\sigma$。 3. **曲线绘制**:利用 `scipy.stats.norm` 生成理论正态分布曲线,覆盖数据范围(通常为 $\mu \pm 4\sigma$)[^2]。 4. **可视化优化**:调整 `bins`、颜色、透明度(`alpha`)等参数提升可读性。 --- ### **参数调整建议** - **直方图分箱**:增加 `bins` 数量(如 `bins=50`)可细化数据分布细节。 - **曲线颜色**:修改 `plot()` 中的颜色参数(如 `'b-'` 为蓝色)。 - **多数据对比**:在同一中叠加不同数据集的正态曲线,需分别计算参数并绘。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值