如何在Python Matplotlib的堆叠折线图中实现线条平滑?
如何平滑Matplotlib堆叠折线图的线条
当然可以实现!Matplotlib的stackplot本身没有内置的平滑选项,但我们可以先对原始数据做插值平滑处理,再传入stackplot就能得到顺滑的堆叠折线图了。下面给你两种常用的实现方案:
方案一:使用make_interp_spline(推荐,适合大多数场景)
这个方法来自scipy.interpolate,能生成平滑的样条曲线,步骤如下:
- 先导入所需库:
import matplotlib.pyplot as plt from scipy.interpolate import make_interp_spline import numpy as np
- 处理你的数据,将x轴转换为数值型(插值需要数值输入),并生成更密集的x轴点:
# 把原始x轴(y1_dict的keys)转成数值数组 x = np.array(list(y1_dict.keys())) # 生成100个均匀分布的新x点(点数越多,线条越顺滑) x_new = np.linspace(x.min(), x.max(), 100)
- 对每个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)
- 用平滑后的数据绘制堆叠折线图:
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
相关产品推荐
相关产品推荐

