如何使用matplolib设置时间序列多图配置

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

我正在尝试使用几组时间序列对同一图形进行两个子图绘制。在下面的表示中,我希望上面的子图只有一个序列叫做“原始”,其余的在下面。但是,我的代码将它们全部分组在下面的子图中。您现在可以看到它的外观:

enter image description here

实现的代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# Data loading

data = pd.read_csv('setpoints.csv', parse_dates=['date'], index_col=['date'])

df_data = pd.DataFrame(data, columns=['Data'])

df_matric['Data'].index.freq = 'MS'
train, test = df_data['Data'], df_data['Data']
model = ExponentialSmoothing(train, trend='mul', seasonal='add', seasonal_periods=12).fit()
period = ['Jan-12', 'Dec-14']
pred = model.predict(start=period[0], end=period[1])
print(pred)

df_data['Data'].plot(label='Train')
test.plot(label='Test')
pred.plot(label='Holt-Winters')
plt.legend(loc='best')
plt.show()

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Submissions data')
ax1.set_ylim(0, 300000)
ax1.set_ylabel('Submissions')
ax1 = df_data['Data'].plot(label='Original', color = 'blue')
ax1.legend()
ax2 = df_data['Data'].plot(label='Train')
ax2 = test.plot(label='Test')
ax2 = pred.plot(label='Holt-Winters')
ax2.set_xlabel('Date')
ax2.set_ylabel('Submissions')
ax2.legend()
plt.show()

数据集如下:

date,Data

Jan-12,153046

Feb-12,161874

Mar-12,226134

Apr-12,171871

May-12,191416

Jun-12,230926

Jul-12,147518

Aug-12,107449

Sep-12,170645

Oct-12,176492

Nov-12,180005

Dec-12,193372

Jan-13,156846

Feb-13,168893

Mar-13,231103

Apr-13,187390

May-13,191702

Jun-13,252216

Jul-13,175392

Aug-13,150390

Sep-13,148750

Oct-13,173798

Nov-13,171611

Dec-13,165390

Jan-14,155079

Feb-14,172438

Mar-14,225818

Apr-14,188195

May-14,193948

Jun-14,230964

Jul-14,172225

Aug-14,129257

Sep-14,173443

Oct-14,188987

Nov-14,172731

Dec-14,211194

现在有人可以解决吗?或有更好的解决方法

python matplotlib time-series subplot
1个回答
0
投票

我相信您的代码存在的问题是您在python会话中两次调用了plt.show()。我建议您在脚本末尾调用一次。我认为它将解决您的问题。

plt.show()的工作方式是查找所有当前活动的图形对象,并打开显示结果的交互式窗口。一个会话多次调用它可能导致无法预测的行为,因此应避免使用它。

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