![image]()
import matplotlib.pyplot as plt
import numpy as np
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(10, 8), dpi=150)
ax = fig.add_subplot(111, projection='3d')
ax.set_axis_off()
# ========== 颜色分组定义 ==========
color_surface = 'black' # 高斯曲面:黑色实心半透明
color_axis = 'black' # 坐标轴、箭头:黑色
color_boundary = '#d62728' # 底面边界线 y=a 与斜线:红色
color_shadow = '#7f7f7f' # 底面阴影填充区域:灰色
color_intersect = '#00bfff' # 曲面截交线+垂直闭合轮廓:亮蓝色(与黑对比强烈)
color_point = '#d62728' # 交点标记点:红色(和边界线同色)
# ================= 1. 设定视角 =================
ax.view_init(elev=25, azim=-45)
# ================= 2. 绘制二维正态分布曲面 (黑色实心曲面) =================
peak_z = 4.2 # 峰值高度
sigma = 2.2 # 扩散范围
# 2.1 生成网格数据
x_grid = np.linspace(-6.0, 6.0, 80)
y_grid = np.linspace(-6.0, 6.0, 80)
X, Y = np.meshgrid(x_grid, y_grid)
Z = peak_z * np.exp(-(X**2 + Y**2) / (2 * sigma**2))
# 2.2 绘制黑色实心曲面
ax.plot_surface(X, Y, Z, color=color_surface, alpha=0.45,
edgecolor='none', antialiased=True,
rstride=2, cstride=2, shade=True)
# ================= 3. 绘制完整坐标轴 =================
# p(y, y') 垂直轴
ax.quiver(0, 0, 0, 0, 0, 5.5, color=color_axis, lw=1.5, arrow_length_ratio=0.1)
ax.text(0, 0, 5.8, r"$p(y, \dot{y})$", fontsize=16, fontfamily='serif', ha='center')
# y 轴
ax.quiver(0, 0, 0, -10.0, 0, 0, color=color_axis, lw=1, arrow_length_ratio=0.1)
ax.quiver(0, 0, 0, 10.0, 0, 0, color=color_axis, lw=1, arrow_length_ratio=0.1)
ax.text(-4.6, 0, 0, r"$y$", fontsize=16, fontfamily='serif')
# y' 轴
ax.quiver(0, 0, 0, 0, -10.0, 0, color=color_axis, lw=1, arrow_length_ratio=0.1)
ax.quiver(0, 0, 0, 0, 10.0, 0, color=color_axis, lw=1, arrow_length_ratio=0.1)
ax.text(0, 4.5, 0, r"$\dot{y}$", fontsize=16, fontfamily='serif')
# ================= 4. 绘制底面的两条边界线与阴影 =================
a_val = -4.0 # 交点 'a' 位置
# 4.1 平行于 y' 轴的直线 y = a
x_line_a = np.linspace(0, 6.0, 50)
y_line_a = np.full_like(x_line_a, a_val)
z_line_a = np.zeros_like(x_line_a)
ax.plot(x_line_a, y_line_a, z_line_a, color=color_boundary, lw=2.5)
# 4.2 斜线 (从交点 'a' 出发)
slope = 0.2
x_line_slope = np.linspace(0, 6.0, 50)
y_line_slope = a_val + slope * x_line_slope
z_line_slope = np.zeros_like(x_line_slope)
ax.plot(x_line_slope, y_line_slope, z_line_slope, color=color_boundary, lw=2.5, ls='--')
# 4.3 阴影区域
for x_val in np.linspace(0, 4.0, 30):
y_start = a_val
y_end = a_val + slope * x_val
ax.plot([x_val, x_val], [y_start, y_end], [0.01, 0.01], color=color_shadow, lw=1)
# ================= 5. 绘制曲面上的截交线及其垂直闭合轮廓 =================
# 5.1 平面 y=a 的截交线 (曲面上的轮廓线)
x_cross_a = np.linspace(0, 6.0, 100) # 对应 y' 轴,从 0 到 6
y_cross_a = np.full_like(x_cross_a, a_val)
z_cross_a = peak_z * np.exp(-(x_cross_a**2 + a_val**2) / (2 * sigma**2))
# 绘制曲面上的截交线(亮蓝色实线,与黑色形成强对比)
ax.plot(x_cross_a, y_cross_a, z_cross_a, color=color_intersect, lw=2.5)
# 绘制左侧垂直连接线(从底面交点到曲面截交线起点)
ax.plot([0, 0], [a_val, a_val], [0, z_cross_a[0]], color=color_intersect, lw=2.5)
# 绘制右侧垂直连接线(从曲面截交线终点垂直落到底面)
ax.plot([6, 6], [a_val, a_val], [z_cross_a[-1], 0], color=color_intersect, lw=2.5)
# 5.2 斜线平面的截交线 (第二个闭环,虚线)
x_cross_slope = np.linspace(0, 6.0, 100)
y_cross_slope = a_val + slope * x_cross_slope
z_cross_slope = peak_z * np.exp(-(x_cross_slope**2 + y_cross_slope**2) / (2 * sigma**2))
# 绘制曲面上的斜线截交线(亮蓝色虚线)
ax.plot(x_cross_slope, y_cross_slope, z_cross_slope, color=color_intersect, lw=2.5, ls='--')
# 垂直连接线
ax.plot([0, 0], [a_val, a_val], [0, z_cross_slope[0]], color=color_intersect, lw=2.5, ls='--')
ax.plot([6, 6], [y_cross_slope[-1], y_cross_slope[-1]], [z_cross_slope[-1], 0], color=color_intersect, lw=2.5, ls='--')
# ================= 6. 标注 =================
ax.scatter(0, a_val, 0, color=color_point, s=25)
ax.text(0, a_val - 0.5, 0, r"$a$", fontsize=16, fontfamily='serif')
ax.text(3.5, a_val - 0.5, 0, r"$y=a$", fontsize=14, fontfamily='serif')
ax.text(1.0, a_val + 0.6, 0, r"$\alpha$", fontsize=16, fontfamily='serif')
ax.text2D(0.05, 0.9, r"$(a)$", transform=ax.transAxes, fontsize=18, fontfamily='serif')
ax.set_xlim([-4.5, 4.5])
ax.set_ylim([-4.5, 4.5])
ax.set_zlim([0, 5.5])
plt.tight_layout()
plt.show()