首页 > 解决方案 > 如何在同一个图上一个接一个地绘制多个时间序列

问题描述

我有 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)

我附上了结果图(这是错误的!)。我需要让红线和绿线在蓝线之后继续在此处输入图像描述

标签: pythondataframematplotlib

解决方案


如果我理解正确,您应该能够简单地沿 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 不选择列。因此,您可能需要同时修改您的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()

在此处输入图像描述


推荐阅读