繁体   English   中英

如何在同一图上一个接一个地绘制多个时间序列

[英]How to plot multiple time series one after the other on the same plot

我有3个数据training_data, validation_data, test_datatraining_data, validation_data, test_data ,我需要用不同的颜色training_data, validation_data, test_data绘制它们,以便看起来像一条线,但分为3种颜色。 我尝试通过使用xlim在第二和第三时间序列中移动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不会选择列。 因此,您可能需要同时修改ilocas_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()

在此处输入图片说明

从此答案获得帮助,我可以按照以下步骤解决此问题:

limit_1 = train_data.loc[idxs[0]].iloc[:, 0].shape[0]  # 362
limit_2 = train_data.loc[idxs[0]].iloc[:, 0].shape[0] + validation_data.loc[idxs[0]].iloc[:, 0].shape[0]  # 481
for idx in idxs:
   train_data.loc[idx].iloc[:, 0].reset_index(drop=True).plot(kind='line'
                                                              , use_index=False
                                                              , figsize=(20, 5)
                                                              , color='blue'
                                                              , label='Training Data'
                                                              , legend=False)
   validation = validation_data.loc[idx].iloc[:, 0].reset_index(drop=True)
   validation.index = pd.RangeIndex(len(validation.index))
   validation.index = range(limit_1, limit_1+len(validation.index))
   validation.plot(kind='line'
                   , figsize=(20, 5)
                   , color='red'
                   , label='Validation Data'
                   , legend=False)
   test = test_data.loc[idx].iloc[:, 0].reset_index(drop=True)
   test.index = pd.RangeIndex(len(test.index))
   test.index = range(limit_2, limit_2+len(test.index))
   test.plot(kind='line'
            , figsize=(20, 5)
            , color='green'
            , label='Test Data'
            , legend=False)
   plt.legend(loc=1, prop={'size': 'xx-small'})
   plt.title(str(idx))
   plt.savefig(str(idx) + ".pdf")
   plt.clf()
   plt.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM