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

时间:2019-07-15 20:19:32

标签: python dataframe matplotlib

我有3个数据帧training_data, validation_data, test_data,我需要用不同的颜色依次绘制它们,以便看起来像一条线,但分成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。这就是为什么我使用<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)

我附上了结果图(这是错误的!)。我需要红线和绿线继续在蓝线enter image description here

之后

2 个答案:

答案 0 :(得分:2)

如果我的理解正确,您应该能够简单地沿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()

enter image description here


根据以下注释进行编辑:使用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()

enter image description here

答案 1 :(得分:0)

this answer获得帮助,我可以按照以下步骤解决此问题:

class Object