python - 如何在同一个图上一个接一个地绘制多个时间序列
问题描述
我有 3 个数据框,training_data, validation_data, test_data
我需要用不同的颜色将它们依次绘制,这样它看起来像一条线,但分为 3 种颜色。我试图通过移动 x 轴开始来做到这一点,使用xlim
, 用于第二个和第三个时间序列,如下面的代码所示,但它从 x=0 开始绘制所有它们。我该如何解决?
train_data.loc[idx].plot(kind='line'
, use_index=False
, color='blue'
, label='Training Data'
, legend=False)
validation_data.loc[idx].plot(kind='line'
, use_index=False
, figsize=(20, 5)
, xlim=362
, color='red'
, label='Validation Data'
, legend=False)
test_data.loc[idx].plot(kind='line'
, use_index=False
, figsize=(20, 5)
, xlim=481
, color='green'
, label='Test Data'
, legend=False)
plt.xlim(xmin=0)
plt.legend(loc=1, prop={'size': 'xx-small'})
plt.savefig("data.pdf")
plt.clf()
plt.close()
更新:
所有 3 个数据帧都具有以下形状 (N, 28),有 138 个不同的索引 ( idx
),并且所有数据帧都有每个索引的一部分。实际上,每个索引都是一个时间序列,分为三个部分,分别是训练、验证和测试数据集。我只需要绘制var0
每个索引的第一列 , 。这就是我使用的原因<df>.loc[idx].iloc[:, 0]
df=
idx var0 var1 var2 var3 var4 ... var28
5171 10.0 2.8 0.0 5.0 1.0 ... 9.4
5171 40.9 2.5 3.4 4.5 1.3 ... 7.7
5171 60.7 3.1 5.2 6.6 3.4 ... 1.0
...
5171 0.5 1.3 5.1 0.5 0.2 ... 0.4
4567 1.5 2.0 1.0 4.5 0.1 ... 0.4
4567 4.4 2.0 1.3 6.4 0.1 ... 3.3
4567 6.3 3.0 1.5 7.6 1.6 ... 1.6
...
4567 0.7 1.4 1.4 0.3 4.2 ... 1.7
...
9584 0.3 2.6 0.0 5.2 1.6 ... 9.7
9584 0.5 1.2 8.3 3.4 1.3 ... 1.7
9584 0.7 3.0 5.6 6.6 3.0 ... 1.0
...
9584 0.7 1.3 0.1 0.0 2.0 ... 1.7
我尝试将所有三个数据框合二为一,然后按照@Brendan Cox 的建议使用切片对其进行绘制。但我没有得到我需要的结果,它仍然从 x=0 开始绘图。这是代码:
data = pd.concat([train_data.loc[idx].iloc[:, 0], validation_data.loc[idx].iloc[:, 0], test_data.loc[idx].iloc[:, 0]])
data.iloc[0:362].plot(kind='line'
, use_index=False
, figsize=(20,5)
, color='blue'
, label='Training Data'
, legend=False)
data.iloc[362:481].plot(kind='line'
, use_index=False
, figsize=(20, 5)
, color='red'
, label='Validation Data'
, legend=False)
data.iloc[481:].plot(kind='line'
, use_index=False
, figsize=(20, 5)
, color='green'
, label='Test Data'
, legend=False)
解决方案
如果我理解正确,您应该能够简单地沿 x 轴对输入数据进行子集化(即切片)并绘制线的每个部分 - 例如:
df = pd.read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/fpp2/goog200.csv", index_col=0)
df['value'].plot()
df.loc[0:25,'value'].plot()
df.loc[25:150, 'value'].plot()
df.loc[150:, 'value'].plot()
plt.show()
根据以下评论进行编辑:使用iloc[]
并use_index=False
似乎复制了“从 0 开始每个绘图”的行为。请注意,您iloc
的 s 不选择列。因此,您可能需要同时修改您的iloc
和as_index=False
.
df = pd.read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/fpp2/goog200.csv", index_col=0)
df.iloc[0:25,1].plot(use_index=False)
df.iloc[25:150, 1].plot(use_index=False)
df.iloc[150:, 1].plot(use_index=False)
plt.show()
推荐阅读
- php - PHP在同一页面中选择相同id的下一个数组值
- azure-webjobs - 如何使用 WebJobs SDK 3.x 中的新 HostBuilder 注册自定义 NameResolver?
- python - 如何修复缺少“自我”参数的 TypeError
- android - 我将如何发出基本警报?
- python - 如何在 author_id 中设置“电子邮件”继承 Odoo 上的 mail.thread
- c# - 从 2d 整数数组制作 NSImage
- erlang - 如果记录存在,如何更新记录,否则在 Mnesia 中插入新记录
- dask - 是否所有 Dask Worker 都需要使用相同的操作系统?
- object - ExtJS如何在extraParams AjaxRequest中传递一个对象
- authentication - 如何去除 cakephp 认证中的“redirect”参数?