如何用Numpy和Matplotlib绘制一矮窄一高宽的双正态分布曲线
实现自定义高度和宽度的正态分布曲线
正态分布的概率密度函数(PDF)有固有特性:曲线宽度由标准差$\sigma$决定,$\sigma$越小曲线越窄;同时峰值高度为$\frac{1}{\sigma\sqrt{2\pi}}$,$\sigma$越小峰值越高——这是因为概率密度曲线下的总面积必须为1。如果要让窄曲线同时更矮,需要手动缩放曲线的y值,打破概率密度的总面积约束,以下是两种实现方法:
方法1:直接计算理论PDF并缩放高度
基于正态分布的数学公式生成曲线,精度高且无抽样误差:
import numpy as np import matplotlib.pyplot as plt # 生成连续的x轴取值范围 x = np.linspace(-6, 6, 1000) # 定义两条曲线的参数 mu_narrow, sigma_narrow = -2, 0.5 # 左侧矮窄曲线:均值-2,标准差0.5 mu_wide, sigma_wide = 0, 2 # 右侧高宽曲线:均值0,标准差2 # 计算原始概率密度 pdf_narrow = (1 / (sigma_narrow * np.sqrt(2 * np.pi))) * np.exp(-(x - mu_narrow)**2 / (2 * sigma_narrow**2)) pdf_wide = (1 / (sigma_wide * np.sqrt(2 * np.pi))) * np.exp(-(x - mu_wide)**2 / (2 * sigma_wide**2)) # 缩放窄曲线的高度,因子可按需调整 pdf_narrow_scaled = pdf_narrow * 0.3 # 绘制曲线 plt.plot(x, pdf_narrow_scaled, color='blue', linestyle='--', label='矮窄曲线') plt.plot(x, pdf_wide, color='red', linestyle='--', label='高宽曲线') plt.xlabel('x') plt.ylabel('缩放后的值') plt.legend() plt.show()
方法2:基于Seaborn KDE绘图后修改曲线高度
如果需要基于真实抽样数据绘制核密度估计曲线,可在绘图后手动调整曲线的y轴数据:
import seaborn as sns import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots() # 生成抽样数据 data_narrow = np.random.normal(loc=-2, scale=0.5, size=1000) data_wide = np.random.normal(loc=0, scale=2, size=1000) # 绘制两条KDE曲线 sns.kdeplot(x=data_narrow, ax=ax, linestyle="--", color="blue", label='矮窄曲线') sns.kdeplot(x=data_wide, ax=ax, linestyle="--", color="red", label='高宽曲线') # 找到蓝色曲线并缩放其高度 for line in ax.lines: if line.get_color() == '#1f77b4': # Seaborn默认蓝色的RGB值 y_data = line.get_ydata() line.set_ydata(y_data * 0.3) # 调整缩放因子改变高度 break plt.legend() plt.show()
注意事项
- 缩放后的曲线不再满足概率密度总面积为1的约束,仅适用于可视化展示需求。
- 缩放因子可根据视觉效果自由调整(如0.2、0.4等)。
内容的提问来源于stack exchange,提问作者hbstha123
相关产品推荐
相关产品推荐

