如何在Matplotlib中实现平滑演化分位数图的阴影填充?
用Matplotlib实现分位数曲线的阴影填充效果
你已经通过traj函数生成了误差轨迹,并计算出7个分位数的对数曲线。要实现分位数之间的阴影填充,只需借助Matplotlib的fill_between函数即可完成,以下是修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt def traj(p, d, B, alpha, num_steps): """Returns num_steps x B array of squared errors""" h = np.arange(1, d + 1) ** -p hsqrt = np.sqrt(h) E = np.ones((B, d)) traj = np.zeros((num_steps, B, d)) for step_idx in range(num_steps): X = hsqrt * np.random.randn(B, d) losses = np.einsum("BD,BD->B", E, X) E -= alpha * np.einsum("BD,B->BD", X, losses) traj[step_idx] = E return np.sum(traj * traj, axis=2) a = 2.421249521036836042 numQuantiles=7 errors = traj(p=0, d=1, B=3000, alpha=a, num_steps=100) quantiles=np.zeros((numQuantiles, errors.shape[0])) for q in range(numQuantiles): quantiles[q] = np.quantile(errors, (q+1)/(numQuantiles+1), axis=1) quantiles = np.log(quantiles) x = np.arange(1, 101) mid_idx = numQuantiles // 2 # 绘制中间中位数曲线 plt.plot(x, quantiles[mid_idx], marker='o', label='Median') # 从内到外填充分位数区间,用透明度区分层次 plt.fill_between(x, quantiles[mid_idx-1], quantiles[mid_idx+1], color='blue', alpha=0.3) plt.fill_between(x, quantiles[mid_idx-2], quantiles[mid_idx+2], color='blue', alpha=0.2) plt.fill_between(x, quantiles[0], quantiles[-1], color='blue', alpha=0.1) # 绘制其余分位数曲线 plt.plot(x, quantiles[mid_idx+1], marker='o') plt.plot(x, quantiles[mid_idx+2], marker='o') plt.plot(x, quantiles[mid_idx-1], marker='o') plt.plot(x, quantiles[mid_idx-2], marker='o') plt.xlabel('Step') plt.ylabel('Log Squared Error') plt.legend() plt.show()
关键说明
fill_between(x, y1, y2)负责填充两条曲线间的区域,alpha参数控制透明度,从内到外降低透明度能让区间层次更清晰。- 先绘制中间的中位数曲线,再依次填充相邻分位数、外层分位数的区域,最后绘制其余分位数曲线,确保曲线显示在阴影上方。
- 若需要区分不同区间的视觉效果,可修改
color参数使用不同深浅的颜色。
内容的提问来源于stack exchange,提问作者Yaroslav Bulatov
相关产品推荐
相关产品推荐

