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

如何在Matplotlib中将概率密度函数(PDF)叠加到基线图上

用Matplotlib将概率分布叠加到基线图上

我需要把概率分布曲线叠加到基线曲线图上,实现类似PowerPoint中复制、旋转、压缩图表后的效果。要求关闭PDF图的坐标轴,且PDF的右边缘(直边)要放在x=0.1125的位置。

以下是最小可复现示例(MRE):

示例PDF图代码

# 导入Python库
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 绘制示例PDF
x1 = np.logspace(start=np.log(0.1), stop=np.log(3), num=200, base=np.e)
ln_mu, ln_sigma = 1.1, 0.3
y1 = np.exp(stats.norm.pdf(x1, ln_mu, ln_sigma))
fig, ax = plt.subplots()
ax.fill_between(x1, min(y1), y1, alpha=0.5)
ax.set(xscale="log", xlim=[min(x1), max(x1)])
plt.show()

示例PDF图:对数X轴的填充曲线,呈现正态分布的概率密度形态,填充区域透明度为0.5。

示例基线曲线图代码

# 绘制示例基线曲线
x2 = np.arange(0, 1.05, 0.05)
y2 = 2*np.sqrt(np.pi*x2)
fig, ax = plt.subplots()
ax.plot(x2,y2)
ax.set(yscale="log", ylim=[min(x1), max(x1)])
plt.show()

示例基线曲线图:对数Y轴的曲线,符合2*sqrt(πx)的函数走势。

预期效果:基线图上叠加经过旋转、压缩后的PDF分布,PDF的右边缘对齐在x=0.1125处,PDF自身的坐标轴完全隐藏。


实现代码

核心思路是利用Matplotlib的嵌入坐标轴,对其做旋转、缩放变换后绘制PDF,最后隐藏嵌入轴的所有元素。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from matplotlib.transforms import Affine2D

# 1. 绘制基线曲线
x2 = np.arange(0, 1.05, 0.05)
y2 = 2*np.sqrt(np.pi*x2)
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x2, y2)
ax.set(yscale="log", ylim=[0.1, 3], xlabel="X", ylabel="Y")

# 2. 准备PDF数据:反转x轴让直边移到右侧
x1 = np.logspace(start=np.log(0.1), stop=np.log(3), num=200, base=np.e)
ln_mu, ln_sigma = 1.1, 0.3
y1 = np.exp(stats.norm.pdf(x1, ln_mu, ln_sigma))
x1_reversed = x1[::-1]
y1_reversed = y1[::-1]

# 3. 创建嵌入坐标轴并设置变换
# 嵌入轴位置:[左, 下, 宽, 高],单位为基线轴的占比
inset_ax = ax.inset_axes([0, 0, 0.15, 0.5])
# 顺时针旋转90度+垂直缩放,匹配预期形态
transform = Affine2D().rotate_deg(-90).scale(1, 0.8) + inset_ax.transData
inset_ax.set_transform(transform)

# 4. 绘制PDF并设置轴范围
inset_ax.fill_between(x1_reversed, min(y1_reversed), y1_reversed, alpha=0.5)
inset_ax.set(xscale="log", xlim=[min(x1), max(x1)])

# 5. 隐藏嵌入轴的所有可见元素
inset_ax.set_xticks([])
inset_ax.set_yticks([])
inset_ax.spines[['top', 'right', 'bottom', 'left']].set_visible(False)

plt.tight_layout()
plt.show()

代码说明:

  • 反转PDF的x数据,让原左侧的直边移到右侧,方便对齐基线图的x=0.1125位置
  • 通过Affine2D实现旋转变换和缩放,匹配预期的倾斜压缩效果
  • 完全隐藏嵌入轴的刻度和边框,只保留填充的PDF区域

内容的提问来源于stack exchange,提问作者a11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:12:55