如何在一个图中绘制堆叠数据框列中的多行? [python]

How to plot many lines from stacked dataframe column in one plot? [python]

我有一个如下所示的数据框:

                timestamp       Value       Color
--------------------------------------------------
 0    2018-03-04 07:11:08          34         Red
 1    2018-03-04 07:11:09          34         Red
 2    2018-03-04 07:11:10          35         Red
 3    2018-03-04 07:11:12          36         Red
 4    2018-03-04 07:11:14          24         Red
 5    2018-03-04 07:11:15          34         Red
... 
55    2018-03-04 07:12:17          34        Blue
56    2018-03-04 07:12:18          35        Blue
57    2018-03-04 07:12:19          36        Blue
58    2018-03-04 07:12:20          37        Blue
59    2018-03-04 07:12:21          35        Blue
60    2018-03-04 07:12:22          32        Blue

所以在 60 秒的过程中,对于每个时间戳,都会记录一个值,但这些值分为两种颜色,红色和蓝色。因此,在这个数据框中,我们看到两条不同曲线的时间序列曲线发生在不同的时间,一条接一条,不重叠。我想做的是绘制它们。但是,我想忽略时间戳,以便假设它们同时开始,因此只需将每种颜色视为一个有序值数组,忽略时间跳跃并假设时间间隔相等。我只想在同一张图表上绘制红色曲线和蓝色曲线。如何在 python 中完成此操作? 我只是在尝试

plt.plot(Blue, Red)

虽然我不确定如何计算 x 轴,但我只想将其设为秒数。

df = pandas.DataFrame({
            'times':list(pandas.date_range('2020-01-01',periods=10,freq='15T')) + 
                    list(pandas.date_range('2020-01-01',periods=10,freq='15T')),
            'colors':['red']*10 + ['blue'] * 10,
            'value': numpy.random.randint(0,255,20)
    })

给我们类似你的数据框的东西

                 times colors  value
0  2020-01-01 00:00:00    red    224
1  2020-01-01 00:15:00    red     47
2  2020-01-01 00:30:00    red     25
3  2020-01-01 00:45:00    red    211
4  2020-01-01 01:00:00    red     18
5  2020-01-01 01:15:00    red    119
6  2020-01-01 01:30:00    red     52
7  2020-01-01 01:45:00    red    246
8  2020-01-01 02:00:00    red     54
9  2020-01-01 02:15:00    red    156
10 2020-01-01 00:00:00   blue     42
11 2020-01-01 00:15:00   blue     55
12 2020-01-01 00:30:00   blue    151
13 2020-01-01 00:45:00   blue    236
14 2020-01-01 01:00:00   blue    207
15 2020-01-01 01:15:00   blue    165
16 2020-01-01 01:30:00   blue    131
17 2020-01-01 01:45:00   blue    199
18 2020-01-01 02:00:00   blue    247
19 2020-01-01 02:15:00   blue     61

我们可以使用

 df2 = df.pivot(index='times',columns=['colors'],values=['value'])

这给了我们

                        value     
colors               blue  red
times                         
2020-01-01 00:00:00    70  225
2020-01-01 00:15:00   162   78
2020-01-01 00:30:00   188   37
2020-01-01 00:45:00   134  234
2020-01-01 01:00:00    46   73
2020-01-01 01:15:00    76   60
2020-01-01 01:30:00   143   61
2020-01-01 01:45:00   150  198
2020-01-01 02:00:00    82  159
2020-01-01 02:15:00   127   94

现在我们可以轻松地绘制它...

df2.plot()
pyplot.show()

您可以使用

删除列名称的值部分
df2 = df2.droplevel(0,axis=1)
df2.plot()
pyplot.show()

另一种选择是单独调用它

BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(BLUE['times'],BLUE['value'])
pyplot.plot(RED['times'],RED['value'])
pyplot.show()

你也可以使用 pandas groupby(可能不要这样做 :P )

def plot_it(group,values):
    pyplot.plot(values['times'],values['value'])
df.groupby(['colors']).apply(plot_it)
pyplot.show()

但真正“正确”的处理方式可能是第一个选项 (将其旋转到您想要的形状)

---- 编辑(根据评论)----

如果您不想要月份并将其视为 y 值列表,只需使用范围作为 x

BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(range(len(BLUE)),BLUE['value'])
pyplot.plot(range(len(RED)),RED['value'])
pyplot.show()