如何并排绘制统计模型时间序列图并在Python中自定义x轴

问题描述 投票:0回答:1

我正在创建这些时间序列图,专门用于 stl 分解,并且已经设法将所有图合而为一。我遇到的问题是让它们并排显示,就像解决方案[此处][1]一样。我尝试了链接上的解决方案,但它不起作用,相反,我一直在顶部得到一个空图。 我有四个时间序列图,并设法将它们输出在彼此的底部,但是我 希望它们并排或两个并排,最后两个并排放在底部。

然后对于 xaxis 上的日期,我已经尝试使用

ax.xaxis.set_major_formatter(DateFormatter('%b %Y'))
但它不适用于下面的代码,因为 res.plot 函数不允许它。

我已经到处搜索,但找不到解决我的问题的方法。我将不胜感激任何帮助。

python time-series seaborn statsmodels stl-decomposition
1个回答
3
投票

这是一个使用人工数据的示例。主要思想是将输出分组为

DataFrame
,然后使用 pandas
plot
函数绘制它们。

请注意,在拟合时我必须更改您的代码以使用

stl2
stl3
stl4

from statsmodels.tsa.seasonal import STL
import matplotlib.pyplot as plt
import seaborn as sns
from pandas.plotting import register_matplotlib_converters 
from matplotlib.dates import DateFormatter

register_matplotlib_converters()
sns.set(style='whitegrid', palette = sns.color_palette('winter'), rc={'axes.titlesize':17,'axes.labelsize':17, 'grid.linewidth': 0.5})
plt.rc("axes.spines", top=False, bottom = False, right=False, left=False)
plt.rc('font', size=13)
plt.rc('figure',figsize=(17,12))


idx = pd.date_range("1-1-2020", periods=200, freq="M")
seas = 10*np.sin(np.arange(200) * np.pi/12)
trend = np.arange(200) / 10.0
seatr = pd.Series(trend + seas + np.random.standard_normal(200), name="Seattle", index=idx)
latr = pd.Series(trend + seas + np.random.standard_normal(200), name="LA", index=idx)
sftr = pd.Series(trend + seas + np.random.standard_normal(200), name="SF", index=idx)
phtr = pd.Series(trend + seas + np.random.standard_normal(200), name="Philly", index=idx)

stl = STL(seatr, seasonal=13)
res = stl.fit()

stl2 = STL(latr, seasonal=13)
res2 = stl2.fit()

stl3 = STL(sftr, seasonal=13)
res3 = stl3.fit()

stl4 = STL(phtr, seasonal=13)
res4 = stl4.fit()

data = pd.concat([seatr, latr, sftr, phtr], 1)
trends = pd.concat([res.trend, res2.trend, res3.trend, res4.trend], 1)
seasonals = pd.concat([res.seasonal, res2.seasonal, res3.seasonal, res4.seasonal], 1)
resids = pd.concat([res.resid, res2.resid, res3.resid, res4.resid], 1)

fig, axes = plt.subplots(4,1)
data.plot(ax=axes[0])
trends.plot(ax=axes[1])
seasonals.plot(ax=axes[2])
resids.plot(ax=axes[3])

这会产生:

© www.soinside.com 2019 - 2024. All rights reserved.