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

Python 如何在同一绘图上一个接一个地绘制多个时间序列,python,dataframe,matplotlib,Python,Dataframe,Matplotlib,我有3个数据帧,训练数据,验证数据,测试数据,我需要用不同的颜色在它们后面绘制,这样看起来像一条线,但被分成3种颜色。我试图通过使用xlim移动第二和第三个时间序列的x轴起点来实现这一点,如下代码所示,但它从x=0开始绘制所有时间序列。我怎样才能修好它 train_data.loc[idx].plot(kind='line' , use_index=False , color='blue' , lab

我有3个数据帧,训练数据,验证数据,测试数据,我需要用不同的颜色在它们后面绘制,这样看起来像一条线,但被分成3种颜色。我试图通过使用xlim移动第二和第三个时间序列的x轴起点来实现这一点,如下代码所示,但它从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。这就是为什么我要使用.loc[idx].iloc[:,0]

我尝试将所有三个数据帧组合在一个数据帧中,然后按照@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_csvhttps://vincentarelbundock.github.io/Rdatasets/csv/fpp2/goog200.csv,索引_col=0 df['value'].绘图 df.loc[0:25,'value']绘图 测向位置[25:150,'值'].绘图 df.loc[150:,“值”]绘图 节目 按下面的注释编辑:使用iloc[]和use_index=False似乎复制了“从0开始每个绘图”的行为。请注意,ILOC不选择列。因此,您可能需要修改iloc和as_index=False

df=pd.read_csvhttps://vincentarelbundock.github.io/Rdatasets/csv/fpp2/goog200.csv,索引_col=0 df.iloc[0:25,1]。plotuse_index=False df.iloc[25:150,1].plotuse\u index=False df.iloc[150:,1].plotuse\u index=False 节目 在获得的帮助下,我可以按如下方式解决此问题:

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()

你绘制的图正是我需要的,但我有三个独立的数据帧。我是否必须将它们组合到一个数据帧中,然后通过切片进行绘图?这是唯一的方法吗?@Birish我相信只要x轴和y轴是共享的,这就不重要了。例如,您可以创建df2=df.copy和df3=df.copy,然后在我的示例中绘制df2和df3的第二行和第三行,并且它做了完全相同的事情。刚刚尝试了您建议的解决方案,但它仍然从x=0:/@Birish开始绘制它们。如果没有样本数据,很难说更多关于到底发生了什么。我可以确认我上面的评论是正确的——从一个单独的数据框绘制每个线段没有影响,并且它生成相同的结果。似乎你的数据中有些东西是从零开始绘制的,而不是上面提出的方法。如果您发布了一个数据样本,或者至少是一个复制行为的例子,这将是很有帮助的,就像我承认的快速测试一样,它工作得很好,正如我所期望的那样。但要明确的是,我并不是建议您实际使用.iloc索引。我的解决方案是概念的演示。基于与x轴相关的布尔条件(如df['year'])进行索引可能会更好
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()