如何在Pyplot中实现类似Tensorboard的平滑均值曲线效果?
如何在Matplotlib中复现TensorBoard的平滑曲线+原始阴影效果?
我太懂你想要的这种可视化效果了——TensorBoard里用阴影展示原始数据的波动方差,同时叠加一条清晰的平滑曲线来抓趋势,确实在高方差数据场景下特别实用。下面我就给你一步步实现这个需求,而且完全避开你提到的「插值」问题。
核心思路
咱们的实现逻辑完全贴合你的要求:
- 用低透明度的线条/填充区域绘制原始数据,既能保留方差波动细节,又不会喧宾夺主
- 对原始数据做滑动平均处理(仅基于已有数据点计算均值,不生成任何插值点),用纯色实线叠加在原始数据上方凸显趋势
完整代码实现
1. 导入依赖并生成模拟数据
先搞一组带高噪声的模拟数据,贴近你说的方差大的场景:
import matplotlib.pyplot as plt import numpy as np # 生成带高噪声的原始数据 np.random.seed(42) # 固定随机种子保证可复现 x = np.arange(0, 100) y_raw = np.sin(x * 0.1) + np.random.normal(0, 0.3, size=len(x))
2. 实现无插值的滑动平均函数
这个函数是关键——它只基于相邻的原始数据点计算均值,不会生成任何插值点:
def moving_average(data, window_size): """计算滑动平均,仅使用原始数据点,无插值""" weights = np.repeat(1.0, window_size) / window_size # 'valid'参数保证只返回有完整窗口覆盖的结果,避免边界填充 return np.convolve(data, weights, 'valid')
3. 绘制TensorBoard风格的可视化
这里提供两种风格供你选,都是完全符合需求的:
风格一:低透明度原始线条+平滑实线
plt.figure(figsize=(10, 6)) # 绘制原始数据:低透明度线条模拟阴影效果 plt.plot(x, y_raw, color='#1f77b4', alpha=0.3, label='原始数据') # 计算并绘制平滑曲线 window_size = 5 # 可调整窗口大小控制平滑程度 y_smoothed = moving_average(y_raw, window_size) x_smoothed = x[window_size-1:] # 滑动平均后x轴长度对应缩短 plt.plot(x_smoothed, y_smoothed, color='#1f77b4', linewidth=2, label=f'滑动平均(窗口={window_size})') # 美化图表 plt.title('TensorBoard风格:平滑曲线+原始数据阴影线条') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.grid(alpha=0.2) plt.show()
风格二:填充阴影展示原始波动+平滑实线
更贴近TensorBoard的填充式阴影效果:
plt.figure(figsize=(10, 6)) # 用填充区域展示原始数据的波动范围 plt.fill_between(x, y_raw, color='#1f77b4', alpha=0.2, label='原始数据波动') # 可选:叠加细线条强化原始数据的点分布 plt.plot(x, y_raw, color='#1f77b4', alpha=0.3, linewidth=1) # 叠加平滑曲线 plt.plot(x_smoothed, y_smoothed, color='#1f77b4', linewidth=2, label=f'滑动平均(窗口={window_size})') # 美化图表 plt.title('TensorBoard风格:平滑曲线+原始数据填充阴影') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.grid(alpha=0.2) plt.show()
关键细节说明
- 滑动平均的
window_size可以按需调整:窗口越大,曲线越平滑;窗口越小,越贴近原始数据 - 所有平滑后的数据点都是基于原始数据计算的,完全没有插值操作,完美适配你方差大的场景
- 颜色、透明度、线条粗细这些参数都可以根据你的需求自定义调整
内容的提问来源于stack exchange,提问作者vega
相关产品推荐
相关产品推荐

