You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:14:38