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

如何在Python Matplotlib的堆叠折线图中实现线条平滑?

如何平滑Matplotlib堆叠折线图的线条

当然可以实现!Matplotlib的stackplot本身没有内置的平滑选项,但我们可以先对原始数据做插值平滑处理,再传入stackplot就能得到顺滑的堆叠折线图了。下面给你两种常用的实现方案:

方案一:使用make_interp_spline(推荐,适合大多数场景)

这个方法来自scipy.interpolate,能生成平滑的样条曲线,步骤如下:

  1. 先导入所需库:
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
import numpy as np
  1. 处理你的数据,将x轴转换为数值型(插值需要数值输入),并生成更密集的x轴点:
# 把原始x轴(y1_dict的keys)转成数值数组
x = np.array(list(y1_dict.keys()))
# 生成100个均匀分布的新x点(点数越多,线条越顺滑)
x_new = np.linspace(x.min(), x.max(), 100)
  1. 对每个y系列数据做平滑插值:
# 逐个处理你的7组y数据
y1_smooth = make_interp_spline(x, list(y1))(x_new)
y2_smooth = make_interp_spline(x, list(y2))(x_new)
y3_smooth = make_interp_spline(x, list(y3))(x_new)
y4_smooth = make_interp_spline(x, list(y4))(x_new)
y5_smooth = make_interp_spline(x, list(y5))(x_new)
y6_smooth = make_interp_spline(x, list(y6))(x_new)
y7_smooth = make_interp_spline(x, list(y7))(x_new)
  1. 用平滑后的数据绘制堆叠折线图:
fig, ax = plt.subplots()
ax.stackplot(x_new, y1_smooth, y2_smooth, y3_smooth, y4_smooth, y5_smooth, y6_smooth, y7_smooth)

# 依然保留你原来的x轴标签设置
plt.xticks(x, times, rotation="vertical")
plt.xlabel("x-axis")
plt.ylabel("你的y轴标签内容")
plt.show()

方案二:使用UnivariateSpline(更灵活,可自定义平滑程度)

如果需要更精细地控制平滑度,可以用这个方法,通过s参数调整:

from scipy.interpolate import UnivariateSpline

# s参数越大,线条越平滑;s=0则完全贴合原始数据
y1_smooth = UnivariateSpline(x, list(y1), s=5)(x_new)
y2_smooth = UnivariateSpline(x, list(y2), s=5)(x_new)
# 其余y系列同理...

注意事项

  • 如果你的x轴是字符串格式的时间(比如"00:00"、"00:15"),需要先转换成数值型(比如时间戳):
import pandas as pd
x_str = list(y1_dict.keys())
# 转成秒级时间戳作为数值x轴
x = pd.to_datetime(x_str).astype(int) // 10**9
  • 平滑处理会一定程度上改变原始数据的细节,建议根据你的需求调整linspace的点数或s参数,找到平衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:45